Skip to content

Commit bb9bc99

Browse files
authored
feat: Static embedding of node-types.json info (#54)
1 parent 1269cef commit bb9bc99

13 files changed

Lines changed: 1840 additions & 351 deletions

File tree

Cargo.lock

Lines changed: 37 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
resolver = "2"
44

5-
members = ["crates/plotnik-cli", "crates/plotnik-lib", "crates/plotnik-langs", "crates/plotnik-macros"]
5+
members = ["crates/plotnik-cli", "crates/plotnik-lib", "crates/plotnik-langs", "crates/plotnik-macros", "crates/plotnik-core"]

crates/plotnik-cli/src/commands/debug/source.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub fn resolve_lang(
2525
lang: &Option<String>,
2626
_source_text: &Option<String>,
2727
source_file: &Option<PathBuf>,
28-
) -> &'static Lang {
28+
) -> Lang {
2929
if let Some(name) = lang {
3030
return plotnik_langs::from_name(name).unwrap_or_else(|| {
3131
eprintln!("error: unknown language: {}", name);
@@ -50,12 +50,8 @@ pub fn resolve_lang(
5050
std::process::exit(1);
5151
}
5252

53-
pub fn parse_tree(source: &str, lang: &Lang) -> tree_sitter::Tree {
54-
let mut parser = tree_sitter::Parser::new();
55-
parser
56-
.set_language(&lang.ts_lang)
57-
.expect("failed to set language");
58-
parser.parse(source, None).expect("failed to parse source")
53+
pub fn parse_tree(source: &str, lang: Lang) -> tree_sitter::Tree {
54+
lang.parse(source)
5955
}
6056

6157
pub fn dump_source(tree: &tree_sitter::Tree, source: &str, include_anonymous: bool) -> String {

crates/plotnik-cli/src/commands/langs.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ pub fn run() {
22
let langs = plotnik_langs::all();
33
println!("Supported languages ({}):", langs.len());
44
for lang in langs {
5-
println!(" {}", lang.name);
5+
println!(" {}", lang.name());
66
}
77
}
88

99
#[cfg(test)]
1010
mod tests {
11-
fn smoke_test(lang: &plotnik_langs::Lang, source: &str, expected_root: &str) {
12-
let mut parser = tree_sitter::Parser::new();
13-
parser.set_language(&lang.ts_lang).unwrap();
14-
let tree = parser.parse(source, None).unwrap();
11+
use plotnik_langs::Lang;
12+
13+
fn smoke_test(lang: Lang, source: &str, expected_root: &str) {
14+
let tree = lang.parse(source);
1515
let root = tree.root_node();
1616
assert_eq!(root.kind(), expected_root);
1717
assert!(!root.has_error());
@@ -204,9 +204,9 @@ mod tests {
204204
#[test]
205205
#[cfg(feature = "javascript")]
206206
fn lang_from_name() {
207-
assert_eq!(plotnik_langs::from_name("js").unwrap().name, "javascript");
207+
assert_eq!(plotnik_langs::from_name("js").unwrap().name(), "javascript");
208208
assert_eq!(
209-
plotnik_langs::from_name("JavaScript").unwrap().name,
209+
plotnik_langs::from_name("JavaScript").unwrap().name(),
210210
"javascript"
211211
);
212212
assert!(plotnik_langs::from_name("unknown").is_none());
@@ -215,7 +215,7 @@ mod tests {
215215
#[test]
216216
#[cfg(feature = "javascript")]
217217
fn lang_from_extension() {
218-
assert_eq!(plotnik_langs::from_ext("js").unwrap().name, "javascript");
219-
assert_eq!(plotnik_langs::from_ext("mjs").unwrap().name, "javascript");
218+
assert_eq!(plotnik_langs::from_ext("js").unwrap().name(), "javascript");
219+
assert_eq!(plotnik_langs::from_ext("mjs").unwrap().name(), "javascript");
220220
}
221221
}

crates/plotnik-core/Cargo.toml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[package]
2+
name = "plotnik-core"
3+
version = "0.1.0"
4+
edition = "2024"
5+
license = "MIT"
6+
description = "Core data structures for Plotnik"
7+
repository = "https://github.com/plotnik-lang/plotnik"
8+
9+
[lints.rust]
10+
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(coverage_nightly)'] }
11+
12+
[dependencies]
13+
serde = { version = "1", features = ["derive"] }
14+
serde_json = "1"
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//! Invariant checks excluded from coverage reports.
2+
3+
#![cfg_attr(coverage_nightly, coverage(off))]
4+
5+
use crate::{DynamicNodeTypes, NodeTypeId, NodeTypeInfo, StaticNodeTypeInfo, StaticNodeTypes};
6+
7+
impl StaticNodeTypes {
8+
pub(crate) fn ensure_node(&self, node_type_id: NodeTypeId) -> &'static StaticNodeTypeInfo {
9+
self.get(node_type_id).unwrap_or_else(|| {
10+
panic!(
11+
"NodeTypes: node_type_id {node_type_id} not found \
12+
(Lang must verify Language ↔ NodeTypes correspondence)"
13+
)
14+
})
15+
}
16+
}
17+
18+
impl DynamicNodeTypes {
19+
pub(crate) fn ensure_node(&self, node_type_id: NodeTypeId) -> &NodeTypeInfo {
20+
self.get(node_type_id).unwrap_or_else(|| {
21+
panic!(
22+
"NodeTypes: node_type_id {node_type_id} not found \
23+
(Lang must verify Language ↔ NodeTypes correspondence)"
24+
)
25+
})
26+
}
27+
}

0 commit comments

Comments
 (0)