aboutsummaryrefslogtreecommitdiff
path: root/helix-core
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-03-25 06:26:25 +0000
committerBlaž Hrastnik2021-03-25 06:26:25 +0000
commite3c4edae32f6d70bf20655c7c25b3cdf39f3f281 (patch)
tree5351a5a797de5f213b87f25ae4ba049c8e74d11b /helix-core
parenta900159a863c24e4afb1485d8dcff760f722f36b (diff)
Add the machinery to load syntax config from TOML.
It's embedded into the binary at build time for now, but it's progress.
Diffstat (limited to 'helix-core')
-rw-r--r--helix-core/Cargo.toml2
-rw-r--r--helix-core/src/syntax.rs68
2 files changed, 27 insertions, 43 deletions
diff --git a/helix-core/Cargo.toml b/helix-core/Cargo.toml
index 49641ad6..d95c0f47 100644
--- a/helix-core/Cargo.toml
+++ b/helix-core/Cargo.toml
@@ -19,3 +19,5 @@ unicode-width = "0.1"
tree-sitter = "0.17"
once_cell = "1.4"
regex = "1"
+
+serde = { version = "1.0", features = ["derive"] }
diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs
index 3640e0cf..8a8d649a 100644
--- a/helix-core/src/syntax.rs
+++ b/helix-core/src/syntax.rs
@@ -10,9 +10,19 @@ use std::{
};
use once_cell::sync::{Lazy, OnceCell};
+use serde::{Deserialize, Serialize};
+
+#[derive(Serialize, Deserialize)]
+pub struct Configuration {
+ language: Vec<LanguageConfiguration>,
+}
// largely based on tree-sitter/cli/src/loader.rs
+#[derive(Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
pub struct LanguageConfiguration {
+ #[serde(rename = "name")]
+ pub(crate) language_id: Lang,
pub scope: String, // source.rust
pub file_types: Vec<String>, // filename ends_with? <Gemfile, rb, etc>
pub roots: Vec<String>, // these indicate project roots <.git, Cargo.toml>
@@ -24,22 +34,29 @@ pub struct LanguageConfiguration {
// injection_regex
// first_line_regex
//
- //
- pub(crate) language_id: Lang,
+ #[serde(skip)]
pub(crate) highlight_config: OnceCell<Option<Arc<HighlightConfiguration>>>,
// tags_config OnceCell<> https://github.com/tree-sitter/tree-sitter/pull/583
- pub language_server_config: Option<LanguageServerConfiguration>,
- pub indent_config: Option<IndentationConfiguration>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub language_server: Option<LanguageServerConfiguration>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub indent: Option<IndentationConfiguration>,
}
+#[derive(Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
pub struct LanguageServerConfiguration {
pub command: String,
+ #[serde(default)]
+ #[serde(skip_serializing_if = "Vec::is_empty")]
pub args: Vec<String>,
}
+#[derive(Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
pub struct IndentationConfiguration {
pub tab_width: usize,
- pub indent_unit: String,
+ pub unit: String,
}
impl LanguageConfiguration {
@@ -81,7 +98,7 @@ impl LanguageConfiguration {
}
}
-pub static LOADER: Lazy<Loader> = Lazy::new(Loader::init);
+pub static LOADER: OnceCell<Loader> = OnceCell::new();
pub struct Loader {
// highlight_names ?
@@ -90,48 +107,13 @@ pub struct Loader {
}
impl Loader {
- fn init() -> Self {
+ pub fn new(config: Configuration) -> Self {
let mut loader = Self {
language_configs: Vec::new(),
language_config_ids_by_file_type: HashMap::new(),
};
- // hardcoded from now, might load from toml
- let configs = vec![
- LanguageConfiguration {
- scope: "source.rust".to_string(),
- file_types: vec!["rs".to_string()],
- language_id: Lang::Rust,
- highlight_config: OnceCell::new(),
- //
- path: "../helix-syntax/languages/tree-sitter-rust".into(),
- roots: vec![],
- language_server_config: Some(LanguageServerConfiguration {
- command: "rust-analyzer".to_string(),
- args: vec![],
- }),
- indent_config: Some(IndentationConfiguration {
- tab_width: 4,
- indent_unit: String::from(" "),
- }),
- },
- LanguageConfiguration {
- scope: "source.toml".to_string(),
- file_types: vec!["toml".to_string()],
- language_id: Lang::Toml,
- highlight_config: OnceCell::new(),
- //
- path: "../helix-syntax/languages/tree-sitter-toml".into(),
- roots: vec![],
- language_server_config: None,
- indent_config: Some(IndentationConfiguration {
- tab_width: 2,
- indent_unit: String::from(" "),
- }),
- },
- ];
-
- for config in configs {
+ for config in config.language {
// get the next id
let language_id = loader.language_configs.len();