From 04c7989720d3e96630a29fc6da64ccc905fe55d4 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 26 May 2021 10:26:20 +0200 Subject: [PATCH] Extract a `LanguageConfig` and load it from `language-dir/config.toml` --- zed/languages/rust/config.toml | 2 ++ zed/src/editor/display_map/mod.rs | 13 ++++++++--- zed/src/language.rs | 37 ++++++++++++++++++++----------- 3 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 zed/languages/rust/config.toml diff --git a/zed/languages/rust/config.toml b/zed/languages/rust/config.toml new file mode 100644 index 0000000000000000000000000000000000000000..17b54c05ab263278ec819121650a26150ffeed0b --- /dev/null +++ b/zed/languages/rust/config.toml @@ -0,0 +1,2 @@ +name = "Rust" +path_suffixes = ["rs"] diff --git a/zed/src/editor/display_map/mod.rs b/zed/src/editor/display_map/mod.rs index 86d7743556c3f0efab20074f742f224e8e866ccc..de8a6b3c0a7ee5cef8304a846c1456c3732e7ef4 100644 --- a/zed/src/editor/display_map/mod.rs +++ b/zed/src/editor/display_map/mod.rs @@ -450,7 +450,11 @@ pub fn collapse_tabs( #[cfg(test)] mod tests { use super::*; - use crate::{language::Language, settings::Theme, test::*}; + use crate::{ + language::{Language, LanguageConfig}, + settings::Theme, + test::*, + }; use buffer::History; use std::sync::Arc; @@ -520,10 +524,13 @@ mod tests { ) .unwrap(); let lang = Arc::new(Language { - name: "Test".to_string(), + config: LanguageConfig { + name: "Test".to_string(), + path_suffixes: vec![".test".to_string()], + ..Default::default() + }, grammar: grammar.clone(), highlight_query: query, - path_suffixes: vec![".test".to_string()], theme_mapping: Default::default(), }); lang.set_theme(&theme); diff --git a/zed/src/language.rs b/zed/src/language.rs index 4e0bf6ff8d8343636af2e8d29a43236f5e600e8b..45c889c99c65996a8a5e7f500e03c9a3ead07e4c 100644 --- a/zed/src/language.rs +++ b/zed/src/language.rs @@ -1,20 +1,25 @@ use crate::settings::{Theme, ThemeMap}; use parking_lot::Mutex; use rust_embed::RustEmbed; -use std::{path::Path, sync::Arc}; +use serde::Deserialize; +use std::{path::Path, str, sync::Arc}; use tree_sitter::{Language as Grammar, Query}; - pub use tree_sitter::{Parser, Tree}; #[derive(RustEmbed)] #[folder = "languages"] pub struct LanguageDir; -pub struct Language { +#[derive(Default, Deserialize)] +pub struct LanguageConfig { pub name: String, + pub path_suffixes: Vec, +} + +pub struct Language { + pub config: LanguageConfig, pub grammar: Grammar, pub highlight_query: Query, - pub path_suffixes: Vec, pub theme_mapping: Mutex, } @@ -35,16 +40,15 @@ impl Language { impl LanguageRegistry { pub fn new() -> Self { let grammar = tree_sitter_rust::language(); + let rust_config = toml::from_slice(&LanguageDir::get("rust/config.toml").unwrap()).unwrap(); let rust_language = Language { - name: "Rust".to_string(), + config: rust_config, grammar, highlight_query: Query::new( grammar, - std::str::from_utf8(LanguageDir::get("rust/highlights.scm").unwrap().as_ref()) - .unwrap(), + str::from_utf8(LanguageDir::get("rust/highlights.scm").unwrap().as_ref()).unwrap(), ) .unwrap(), - path_suffixes: vec!["rs".to_string()], theme_mapping: Mutex::new(ThemeMap::default()), }; @@ -66,6 +70,7 @@ impl LanguageRegistry { let path_suffixes = [extension, filename]; self.languages.iter().find(|language| { language + .config .path_suffixes .iter() .any(|suffix| path_suffixes.contains(&Some(suffix.as_str()))) @@ -83,17 +88,23 @@ mod tests { let registry = LanguageRegistry { languages: vec![ Arc::new(Language { - name: "Rust".to_string(), + config: LanguageConfig { + name: "Rust".to_string(), + path_suffixes: vec!["rs".to_string()], + ..Default::default() + }, grammar, highlight_query: Query::new(grammar, "").unwrap(), - path_suffixes: vec!["rs".to_string()], theme_mapping: Default::default(), }), Arc::new(Language { - name: "Make".to_string(), + config: LanguageConfig { + name: "Make".to_string(), + path_suffixes: vec!["Makefile".to_string(), "mk".to_string()], + ..Default::default() + }, grammar, highlight_query: Query::new(grammar, "").unwrap(), - path_suffixes: vec!["Makefile".to_string(), "mk".to_string()], theme_mapping: Default::default(), }), ], @@ -121,7 +132,7 @@ mod tests { assert_eq!(registry.select_language("zed/sumk").map(get_name), None); fn get_name(language: &Arc) -> &str { - language.name.as_str() + language.config.name.as_str() } } }