diff options
author | Michael Davis | 2022-02-13 18:11:44 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2022-03-10 08:31:57 +0000 |
commit | c1f90a127b972c8b41b0d24dcacb3bdd480be9c5 (patch) | |
tree | 9ffb639d81d28f82dabf88cb3b577459600d2076 /helix-core | |
parent | fbb98300dfa4cf12c8aacb1242baab3644e54951 (diff) |
add tree-sitter sources to languages.toml
Here we add syntax to the languages.toml languge
[[grammar]]
name = "<name>"
source = { .. }
Which can be used to specify a tree-sitter grammar separately of
the language that defines it, and we make this distinction for
two reasons:
* In later commits, we will separate this code from helix-core
and bring it to a new helix-loader crate. Using separate schemas
for language and grammar configurations allows for a nice divide
between the types needed to be declared in helix-loader and in
helix-core/syntax
* Two different languages may use the same grammar. This is currently
the case with llvm-mir-yaml and yaml. We could accomplish a config
that works for this with just `[[languages]]`, but it gets a bit
dicey with languages depending on one another. If you enable
llvm-mir-yaml and disable yaml, does helix still need to fetch and
build tree-sitter-yaml? It could be a matter of interpretation.
Diffstat (limited to 'helix-core')
-rw-r--r-- | helix-core/src/indent.rs | 1 | ||||
-rw-r--r-- | helix-core/src/syntax.rs | 29 |
2 files changed, 29 insertions, 1 deletions
diff --git a/helix-core/src/indent.rs b/helix-core/src/indent.rs index 9a329d95..83b2be94 100644 --- a/helix-core/src/indent.rs +++ b/helix-core/src/indent.rs @@ -444,6 +444,7 @@ where debugger: None, auto_pairs: None, }], + grammar: vec![], }); // set runtime path so we can find the queries diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs index c39e0584..53d20da3 100644 --- a/helix-core/src/syntax.rs +++ b/helix-core/src/syntax.rs @@ -54,6 +54,7 @@ where #[serde(deny_unknown_fields)] pub struct Configuration { pub language: Vec<LanguageConfiguration>, + pub grammar: Vec<GrammarConfiguration>, } // largely based on tree-sitter/cli/src/loader.rs @@ -239,6 +240,29 @@ pub struct IndentQuery { pub outdent: HashSet<String>, } +#[derive(Debug, Serialize, Deserialize)] +pub struct GrammarConfiguration { + #[serde(rename = "name")] + pub grammar_id: String, // c-sharp, rust + pub source: GrammarSource, + pub path: Option<String>, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +#[serde(untagged)] +pub enum GrammarSource { + Local { + path: String, + }, + Git { + #[serde(rename = "git")] + remote: String, + #[serde(rename = "rev")] + revision: String, + }, +} + #[derive(Debug)] pub struct TextObjectQuery { pub query: Query, @@ -2055,7 +2079,10 @@ mod test { .map(String::from) .collect(); - let loader = Loader::new(Configuration { language: vec![] }); + let loader = Loader::new(Configuration { + language: vec![], + grammar: vec![], + }); let language = get_language(&crate::RUNTIME_DIR, "Rust").unwrap(); let config = HighlightConfiguration::new( |