From b34d1a3d9f141b74a5faffef60318db0aee0437d Mon Sep 17 00:00:00 2001 From: Uros Mrkobrada Date: Fri, 8 Nov 2024 20:43:31 +0100 Subject: [PATCH 1/5] config: support configuration outside of editor --- Cargo.lock | 77 ++++++++++++++++++++++++++++++++++- jinja-lsp/Cargo.toml | 1 + jinja-lsp/src/channels/lsp.rs | 17 ++++---- jinja-lsp/src/config.rs | 24 +++++++++++ 4 files changed, 111 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2752833..0ea3b2d 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" @@ -316,6 +338,7 @@ dependencies = [ "serde", "serde_json", "tokio", + "toml", "tower-lsp", "tree-sitter", "tree-sitter-jinja2", @@ -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/jinja-lsp/Cargo.toml b/jinja-lsp/Cargo.toml index bfa04d6..ba05a35 100644 --- a/jinja-lsp/Cargo.toml +++ b/jinja-lsp/Cargo.toml @@ -33,3 +33,4 @@ tree-sitter-jinja2 = "0.0.10" tree-sitter-rust = "0.23.0" jinja-lsp-queries = { path = "../jinja-lsp-queries", version = "0.1.83"} 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..333d69d 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,17 @@ 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) + }) + .map(|c| c) + .unwrap_or(search_config().unwrap_or(config)); let definition_provider = Some(OneOf::Left(true)); let references_provider = None; @@ -100,7 +102,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, }; @@ -123,6 +125,7 @@ pub fn lsp_task( .log_message(MessageType::WARNING, "Backend language not supported") .await; } else { + lsp_data.ignore_globals = config.hide_undefined.unwrap_or(false); match walkdir(&config) { Ok(errors) => { let _ = diagnostics_channel diff --git a/jinja-lsp/src/config.rs b/jinja-lsp/src/config.rs index 637550e..affa51f 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); + } + } + return None; } impl JinjaConfig { From 493c9e36eba20f9fa4cb52feb7bc589a10918f6b Mon Sep 17 00:00:00 2001 From: Uros Mrkobrada Date: Sat, 9 Nov 2024 16:16:45 +0100 Subject: [PATCH 2/5] lsp_helper: use ignore_globals --- example/pyproject.toml | 7 +++++++ jinja-lsp-queries/src/lsp_helper.rs | 26 +++++++++++++++----------- jinja-lsp/src/channels/lsp.rs | 1 - jinja-lsp/src/config.rs | 1 + 4 files changed, 23 insertions(+), 12 deletions(-) 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-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/src/channels/lsp.rs b/jinja-lsp/src/channels/lsp.rs index 333d69d..2a09c28 100644 --- a/jinja-lsp/src/channels/lsp.rs +++ b/jinja-lsp/src/channels/lsp.rs @@ -125,7 +125,6 @@ pub fn lsp_task( .log_message(MessageType::WARNING, "Backend language not supported") .await; } else { - lsp_data.ignore_globals = config.hide_undefined.unwrap_or(false); match walkdir(&config) { Ok(errors) => { let _ = diagnostics_channel diff --git a/jinja-lsp/src/config.rs b/jinja-lsp/src/config.rs index affa51f..6e90ea2 100644 --- a/jinja-lsp/src/config.rs +++ b/jinja-lsp/src/config.rs @@ -76,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); From b42a85972aeaaecd9c30e04af0b0d050661625a1 Mon Sep 17 00:00:00 2001 From: Uros Mrkobrada Date: Sat, 9 Nov 2024 16:38:38 +0100 Subject: [PATCH 3/5] update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) 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 From 7f7c315bcb4788efff768623a8efaae20be442b2 Mon Sep 17 00:00:00 2001 From: Uros Mrkobrada Date: Sat, 9 Nov 2024 16:38:59 +0100 Subject: [PATCH 4/5] raise version --- Cargo.lock | 6 +++--- jinja-lsp-nodejs/Cargo.toml | 2 +- jinja-lsp-queries/Cargo.toml | 2 +- jinja-lsp/Cargo.toml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ea3b2d..4e94bbf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -329,7 +329,7 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jinja-lsp" -version = "0.1.83" +version = "0.1.84" dependencies = [ "anyhow", "env_logger", @@ -349,7 +349,7 @@ dependencies = [ [[package]] name = "jinja-lsp-nodejs" -version = "0.1.83" +version = "0.1.84" dependencies = [ "jinja-lsp", "jinja-lsp-queries", @@ -364,7 +364,7 @@ dependencies = [ [[package]] name = "jinja-lsp-queries" -version = "0.1.83" +version = "0.1.84" dependencies = [ "ropey", "tower-lsp", 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/Cargo.toml b/jinja-lsp/Cargo.toml index ba05a35..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,6 +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" From f2aedf7a2c5fc728905054057d7def25b27a8e9e Mon Sep 17 00:00:00 2001 From: Uros Mrkobrada Date: Sat, 9 Nov 2024 16:48:10 +0100 Subject: [PATCH 5/5] resolve clippy warnings --- jinja-lsp/src/channels/lsp.rs | 1 - jinja-lsp/src/config.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/jinja-lsp/src/channels/lsp.rs b/jinja-lsp/src/channels/lsp.rs index 2a09c28..4b3c339 100644 --- a/jinja-lsp/src/channels/lsp.rs +++ b/jinja-lsp/src/channels/lsp.rs @@ -56,7 +56,6 @@ pub fn lsp_task( config.user_defined = true; Some(config) }) - .map(|c| c) .unwrap_or(search_config().unwrap_or(config)); let definition_provider = Some(OneOf::Left(true)); diff --git a/jinja-lsp/src/config.rs b/jinja-lsp/src/config.rs index 6e90ea2..96f6761 100644 --- a/jinja-lsp/src/config.rs +++ b/jinja-lsp/src/config.rs @@ -44,7 +44,7 @@ pub fn search_config() -> Option { return Some(config.jinja_lsp); } } - return None; + None } impl JinjaConfig {