From 53f571463ab7429d0a54162b7070e3c085dfd940 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Mon, 10 Nov 2025 09:42:46 +0000 Subject: [PATCH] fix(lsp): Biome project watcher --- .changeset/brave-tires-tap.md | 7 +++++++ crates/biome_lsp/src/server.rs | 27 ++++++++++++++++++++++++++- crates/biome_lsp/src/session.rs | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 .changeset/brave-tires-tap.md diff --git a/.changeset/brave-tires-tap.md b/.changeset/brave-tires-tap.md new file mode 100644 index 000000000000..37e40627b400 --- /dev/null +++ b/.changeset/brave-tires-tap.md @@ -0,0 +1,7 @@ +--- +"@biomejs/biome": patch +--- + +Fixed a bug where the Biome Language Server would enable its project file watcher even when no project rules were enabled. + +Now the watching of nested configuration files and nested ignore files is delegated to the editor, if their LSP spec supports it. diff --git a/crates/biome_lsp/src/server.rs b/crates/biome_lsp/src/server.rs index fdeb913ea488..ed819960da86 100644 --- a/crates/biome_lsp/src/server.rs +++ b/crates/biome_lsp/src/server.rs @@ -153,6 +153,20 @@ impl LSPServer { }), kind: Some(WatchKind::all()), }, + FileSystemWatcher { + glob_pattern: GlobPattern::Relative(RelativePattern { + pattern: "**/.gitignore".to_string(), + base_uri: OneOf::Left(folder.clone()), + }), + kind: Some(WatchKind::all()), + }, + FileSystemWatcher { + glob_pattern: GlobPattern::Relative(RelativePattern { + pattern: "**/.ignore".to_string(), + base_uri: OneOf::Left(folder.clone()), + }), + kind: Some(WatchKind::all()), + }, ] }) .collect(); @@ -176,6 +190,15 @@ impl LSPServer { )), kind: Some(WatchKind::all()), }, + FileSystemWatcher { + glob_pattern: GlobPattern::String("**/.gitignore".to_string()), + kind: Some(WatchKind::all()), + }, + FileSystemWatcher { + glob_pattern: GlobPattern::String("**/.ignore".to_string()), + + kind: Some(WatchKind::all()), + }, ], }; CapabilityStatus::Enable(Some(json!(value))) @@ -354,7 +377,9 @@ impl LanguageServer for LSPServer { && (ConfigName::file_names() .iter() .any(|file_name| watched_file.ends_with(file_name)) - || watched_file.ends_with(".editorconfig")) + || (watched_file.ends_with(".editorconfig")) + || watched_file.ends_with(".gitignore") + || watched_file.ends_with(".ignore")) { self.session.load_extension_settings().await; self.session.load_workspace_settings(true).await; diff --git a/crates/biome_lsp/src/session.rs b/crates/biome_lsp/src/session.rs index 2cbc8b98d028..cac8c4e7f5db 100644 --- a/crates/biome_lsp/src/session.rs +++ b/crates/biome_lsp/src/session.rs @@ -707,7 +707,7 @@ impl Session { spawn_blocking(move || { let result = session.workspace.scan_project(ScanProjectParams { project_key, - watch: true, + watch: scan_kind.is_project(), force, scan_kind, verbose: false,