Skip to content

Commit d4fbfc6

Browse files
tausbnCopilot
andcommitted
yeast: Support separate output node types in extractor generator
Language and LanguageSpec gain optional output_node_types field. When set, the generator produces dbscheme/QL from the output types and the extractor validates TRAP against them. All existing extractors pass None (no behavior change). Ruby extract() calls gain vec![] for the new rules parameter. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 9296a77 commit d4fbfc6

4 files changed

Lines changed: 26 additions & 1 deletion

File tree

ql/extractor/src/generator.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,22 @@ pub fn run(options: Options) -> std::io::Result<()> {
2121
Language {
2222
name: "QL".to_owned(),
2323
node_types: tree_sitter_ql::NODE_TYPES,
24+
desugar: None,
2425
},
2526
Language {
2627
name: "Dbscheme".to_owned(),
2728
node_types: tree_sitter_ql_dbscheme::NODE_TYPES,
29+
desugar: None,
2830
},
2931
Language {
3032
name: "Blame".to_owned(),
3133
node_types: tree_sitter_blame::NODE_TYPES,
34+
desugar: None,
3235
},
3336
Language {
3437
name: "JSON".to_owned(),
3538
node_types: tree_sitter_json::NODE_TYPES,
39+
desugar: None,
3640
},
3741
];
3842

ruby/extractor/src/generator.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ pub fn run(options: Options) -> std::io::Result<()> {
2121
Language {
2222
name: "Ruby".to_owned(),
2323
node_types: tree_sitter_ruby::NODE_TYPES,
24+
desugar: None,
2425
},
2526
Language {
2627
name: "Erb".to_owned(),
2728
node_types: tree_sitter_embedded_template::NODE_TYPES,
29+
desugar: None,
2830
},
2931
];
3032

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
pub struct Language {
22
pub name: String,
33
pub node_types: &'static str,
4+
/// Optional yeast desugaring configuration. When set with an
5+
/// `output_node_types_yaml`, the generator uses that YAML for the
6+
/// dbscheme/QL library instead of `node_types`. The `rules` field is
7+
/// unused at code-generation time; only the schema matters.
8+
pub desugar: Option<yeast::DesugaringConfig>,
49
}

shared/tree-sitter-extractor/src/generator/mod.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::io::Write;
66
use std::path::PathBuf;
77

88
use crate::node_types;
9+
use yeast;
910

1011
pub mod dbscheme;
1112
pub mod language;
@@ -68,7 +69,20 @@ pub fn generate(
6869
let token_name = format!("{}_token", &prefix);
6970
let tokeninfo_name = format!("{}_tokeninfo", &prefix);
7071
let reserved_word_name = format!("{}_reserved_word", &prefix);
71-
let nodes = node_types::read_node_types_str(&prefix, language.node_types)?;
72+
let effective_node_types: String = match language
73+
.desugar
74+
.as_ref()
75+
.and_then(|c| c.output_node_types_yaml)
76+
{
77+
Some(yaml) => yeast::node_types_yaml::convert(yaml).map_err(|e| {
78+
std::io::Error::other(format!(
79+
"Failed to convert YAML node-types to JSON for {}: {e}",
80+
language.name
81+
))
82+
})?,
83+
None => language.node_types.to_string(),
84+
};
85+
let nodes = node_types::read_node_types_str(&prefix, &effective_node_types)?;
7286
let (dbscheme_entries, mut ast_node_members, token_kinds) = convert_nodes(&nodes);
7387
ast_node_members.insert(&token_name);
7488
writeln!(&mut dbscheme_writer, "/*- {} dbscheme -*/", language.name)?;

0 commit comments

Comments
 (0)