diff --git a/Cargo.lock b/Cargo.lock index 2752833..4e94bbf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -145,7 +145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -164,6 +164,12 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -262,6 +268,12 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -299,6 +311,16 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", +] + [[package]] name = "itoa" version = "1.0.11" @@ -307,7 +329,7 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jinja-lsp" -version = "0.1.83" +version = "0.1.84" dependencies = [ "anyhow", "env_logger", @@ -316,6 +338,7 @@ dependencies = [ "serde", "serde_json", "tokio", + "toml", "tower-lsp", "tree-sitter", "tree-sitter-jinja2", @@ -326,7 +349,7 @@ dependencies = [ [[package]] name = "jinja-lsp-nodejs" -version = "0.1.83" +version = "0.1.84" dependencies = [ "jinja-lsp", "jinja-lsp-queries", @@ -341,7 +364,7 @@ dependencies = [ [[package]] name = "jinja-lsp-queries" -version = "0.1.83" +version = "0.1.84" dependencies = [ "ropey", "tower-lsp", @@ -707,6 +730,15 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "shlex" version = "1.3.0" @@ -831,6 +863,40 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower" version = "0.4.13" @@ -1194,3 +1260,12 @@ name = "windows_x86_64_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] diff --git a/README.md b/README.md index 4c8c98a..b962555 100644 --- a/README.md +++ b/README.md @@ -128,5 +128,13 @@ nvim_lsp.jinja_lsp.setup { } ``` +You can also write configuration in: `pyproject.toml`, `Cargo.toml`, `jinja-lsp.toml`. + +```toml +[jinja-lsp] +templates = "./templates" +backend = ["./src"] +lang = "rust" +``` Supported languages: Python, Rust diff --git a/example/pyproject.toml b/example/pyproject.toml index 851b7cf..0027f28 100644 --- a/example/pyproject.toml +++ b/example/pyproject.toml @@ -27,3 +27,10 @@ packages = ["src"] [tool.pyright] extraPaths = ["example/.venv/lib/python3.10/site-packages"] + + +[jinja-lsp] +templates = "./templates" +backend = ["./src"] +lang = "rust" +hide_undefined = false diff --git a/jinja-lsp-nodejs/Cargo.toml b/jinja-lsp-nodejs/Cargo.toml index 793122c..8af632f 100644 --- a/jinja-lsp-nodejs/Cargo.toml +++ b/jinja-lsp-nodejs/Cargo.toml @@ -1,7 +1,7 @@ [package] edition = "2021" name = "jinja-lsp-nodejs" -version = "0.1.83" +version = "0.1.84" license = "MIT" authors = ["uros-5"] description = "Bindings for jinja-lsp" diff --git a/jinja-lsp-queries/Cargo.toml b/jinja-lsp-queries/Cargo.toml index 2ec80da..ee3f8f7 100644 --- a/jinja-lsp-queries/Cargo.toml +++ b/jinja-lsp-queries/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jinja-lsp-queries" -version = "0.1.83" +version = "0.1.84" edition = "2021" description = "TreeSitter queries for jinja-lsp" license = "MIT" diff --git a/jinja-lsp-queries/src/lsp_helper.rs b/jinja-lsp-queries/src/lsp_helper.rs index 5908037..8e855df 100644 --- a/jinja-lsp-queries/src/lsp_helper.rs +++ b/jinja-lsp-queries/src/lsp_helper.rs @@ -58,22 +58,26 @@ pub fn search_errors( if empty && exist { to_warn = true; } else if empty { + if ignore_globals { + continue; + } to_warn = true; - if !ignore_globals { - for file in variables { - let temp = file - .1 - .iter() - .filter(|variable| variable.name == object.name); - if temp.count() != 0 { - err_type = JinjaDiagnostic::DefinedSomewhere; - to_warn = true; - break; - } + for file in variables { + let temp = file + .1 + .iter() + .filter(|variable| variable.name == object.name); + if temp.count() != 0 { + err_type = JinjaDiagnostic::DefinedSomewhere; + to_warn = true; + break; } } } if to_warn { + if ignore_globals { + continue; + } let diagnostic = (err_type, Identifier::from(&object)); diagnostics.push(diagnostic); } diff --git a/jinja-lsp/Cargo.toml b/jinja-lsp/Cargo.toml index bfa04d6..2070d3a 100644 --- a/jinja-lsp/Cargo.toml +++ b/jinja-lsp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jinja-lsp" -version = "0.1.83" +version = "0.1.84" edition = "2021" license = "MIT" authors = ["uros-5"] @@ -31,5 +31,6 @@ walkdir = "2.4.0" anyhow = "1.0.75" tree-sitter-jinja2 = "0.0.10" tree-sitter-rust = "0.23.0" -jinja-lsp-queries = { path = "../jinja-lsp-queries", version = "0.1.83"} +jinja-lsp-queries = { path = "../jinja-lsp-queries", version = "0.1.84"} tree-sitter-language = "0.1.0" +toml = "0.8.19" diff --git a/jinja-lsp/src/channels/lsp.rs b/jinja-lsp/src/channels/lsp.rs index f04b219..4b3c339 100644 --- a/jinja-lsp/src/channels/lsp.rs +++ b/jinja-lsp/src/channels/lsp.rs @@ -21,7 +21,7 @@ use tower_lsp::{ }; use crate::{ - config::{walkdir, JinjaConfig}, + config::{search_config, walkdir, JinjaConfig}, filter::init_filter_completions, lsp_files::LspFiles, }; @@ -47,15 +47,16 @@ pub fn lsp_task( lsp_data.is_vscode = true; } } - params + config = params .initialization_options .map(serde_json::from_value) .map(|res| res.ok()) - .and_then(|c| -> Option<()> { - config = c?; + .and_then(|c| { + let mut config: JinjaConfig = c?; config.user_defined = true; - None - }); + Some(config) + }) + .unwrap_or(search_config().unwrap_or(config)); let definition_provider = Some(OneOf::Left(true)); let references_provider = None; @@ -100,7 +101,7 @@ pub fn lsp_task( }, server_info: Some(ServerInfo { name: String::from("jinja-lsp"), - version: Some(String::from("0.1.80")), + version: Some(String::from("0.1.84")), }), offset_encoding: None, }; diff --git a/jinja-lsp/src/config.rs b/jinja-lsp/src/config.rs index 637550e..96f6761 100644 --- a/jinja-lsp/src/config.rs +++ b/jinja-lsp/src/config.rs @@ -1,5 +1,6 @@ use std::{ collections::HashMap, + fs::read_to_string, path::{Path, PathBuf}, }; @@ -21,6 +22,29 @@ pub struct JinjaConfig { pub lang: String, #[serde(skip)] pub user_defined: bool, + pub hide_undefined: Option, +} + +#[derive(Deserialize, Debug, Default, Clone)] +pub struct ExternalConfig { + #[serde(rename(deserialize = "jinja-lsp"))] + jinja_lsp: JinjaConfig, +} + +pub fn search_config() -> Option { + let configs = ["pyproject.toml", "Cargo.toml", "jinja-lsp.toml"]; + for config in configs { + let contents = read_to_string(config).unwrap_or_default(); + if contents.is_empty() { + continue; + } + let config = toml::from_str::(&contents); + if let Ok(mut config) = config { + config.jinja_lsp.user_defined = true; + return Some(config.jinja_lsp); + } + } + None } impl JinjaConfig { @@ -52,6 +76,7 @@ pub fn walkdir(config: &JinjaConfig) -> anyhow::Result { all.append(&mut backend); let mut lsp_files = LspFiles::default(); lsp_files.config = config.clone(); + lsp_files.ignore_globals = config.hide_undefined.unwrap_or(false); if config.lang == "python" { lsp_files.queries.update_backend(&config.lang); lsp_files.parsers.update_backend(&config.lang);