Skip to content

Commit 4fd44ec

Browse files
authored
fix(core): silence diagnostics in scanner (#6845)
1 parent bdbc2b1 commit 4fd44ec

File tree

12 files changed

+109
-11
lines changed

12 files changed

+109
-11
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@biomejs/biome": patch
3+
---
4+
5+
Fixed [#6510](https://github.com/biomejs/biome/issues/6510): The scanner no longer shows diagnostics on inaccessible files unless `--verbose` is used.

crates/biome_cli/src/commands/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,7 @@ pub(crate) trait CommandRunner: Sized {
985985
watch: cli_options.use_server,
986986
force: false, // TODO: Maybe we'll want a CLI flag for this.
987987
scan_kind,
988+
verbose: cli_options.verbose,
988989
})?;
989990

990991
if self.should_validate_configuration_diagnostics() {

crates/biome_lsp/src/server.tests.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3286,6 +3286,7 @@ export function bar() {
32863286
watch: true,
32873287
force: false,
32883288
scan_kind,
3289+
verbose: false,
32893290
},
32903291
)
32913292
.await?
@@ -3505,6 +3506,7 @@ export function bar() {
35053506
watch: true,
35063507
force: false,
35073508
scan_kind: ScanKind::Project,
3509+
verbose: false,
35083510
},
35093511
)
35103512
.await?

crates/biome_lsp/src/session.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,7 @@ impl Session {
681681
watch: true,
682682
force: false,
683683
scan_kind,
684+
verbose: false,
684685
});
685686

686687
match result {

crates/biome_service/src/workspace.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,6 +1234,9 @@ pub struct ScanProjectFolderParams {
12341234
pub force: bool,
12351235

12361236
pub scan_kind: ScanKind,
1237+
1238+
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
1239+
pub verbose: bool,
12371240
}
12381241

12391242
#[derive(Debug, serde::Serialize, serde::Deserialize)]

crates/biome_service/src/workspace.tests.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ fn files_loaded_by_the_scanner_are_only_unloaded_when_the_project_is_unregistere
338338
watch: false,
339339
force: false,
340340
scan_kind: ScanKind::Project,
341+
verbose: false,
341342
})
342343
.unwrap();
343344

@@ -430,6 +431,7 @@ fn too_large_files_are_tracked_but_not_parsed() {
430431
watch: false,
431432
force: false,
432433
scan_kind: ScanKind::Project,
434+
verbose: false,
433435
})
434436
.unwrap();
435437

@@ -490,6 +492,7 @@ fn plugins_are_loaded_and_used_during_analysis() {
490492
watch: false,
491493
force: false,
492494
scan_kind: ScanKind::Project,
495+
verbose: false,
493496
})
494497
.unwrap();
495498

@@ -559,6 +562,7 @@ language css;
559562
watch: false,
560563
force: false,
561564
scan_kind: ScanKind::Project,
565+
verbose: false,
562566
})
563567
.unwrap();
564568

@@ -624,6 +628,7 @@ fn plugins_may_use_invalid_span() {
624628
watch: false,
625629
force: false,
626630
scan_kind: ScanKind::Project,
631+
verbose: false,
627632
})
628633
.unwrap();
629634

@@ -743,6 +748,7 @@ const hasOwn = Object.hasOwn({ foo: 'bar' }, 'foo');"#,
743748
watch: false,
744749
force: false,
745750
scan_kind: ScanKind::Project,
751+
verbose: false,
746752
})
747753
.unwrap();
748754

crates/biome_service/src/workspace/scanner.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::projects::ProjectKey;
1515
use crate::workspace::DocumentFileSource;
1616
use crate::{Workspace, WorkspaceError};
1717
use biome_diagnostics::serde::Diagnostic;
18-
use biome_diagnostics::{Diagnostic as _, Error, Severity};
18+
use biome_diagnostics::{Diagnostic as _, DiagnosticExt, Error, Severity};
1919
use biome_fs::{BiomePath, PathInterner, PathKind, TraversalContext, TraversalScope};
2020
use camino::Utf8Path;
2121
use crossbeam::channel::{Receiver, Sender, unbounded};
@@ -48,11 +48,12 @@ impl WorkspaceServer {
4848
project_key: ProjectKey,
4949
folder: &Utf8Path,
5050
scan_kind: ScanKind,
51+
verbose: bool,
5152
) -> Result<ScanResult, WorkspaceError> {
5253
let (interner, _path_receiver) = PathInterner::new();
5354
let (diagnostics_sender, diagnostics_receiver) = unbounded();
5455

55-
let collector = DiagnosticsCollector::new();
56+
let collector = DiagnosticsCollector::new(verbose);
5657

5758
let (duration, diagnostics, configuration_files) = thread::scope(|scope| {
5859
let handler = thread::Builder::new()
@@ -166,23 +167,22 @@ fn scan_folder(folder: &Utf8Path, ctx: ScanContext) -> (Duration, Vec<BiomePath>
166167
struct DiagnosticsCollector {
167168
/// The minimum level of diagnostic we should collect.
168169
diagnostic_level: Severity,
169-
170-
/// Whether we should collect verbose diagnostics.
171-
verbose: bool,
172170
}
173171

174172
impl DiagnosticsCollector {
175-
fn new() -> Self {
173+
fn new(verbose: bool) -> Self {
176174
Self {
177-
diagnostic_level: Severity::Hint,
178-
verbose: false,
175+
diagnostic_level: if verbose {
176+
Severity::Hint
177+
} else {
178+
Severity::Error
179+
},
179180
}
180181
}
181182

182183
/// Checks whether the given `diagnostic` should be collected or not.
183184
fn should_collect(&self, diagnostic: &Diagnostic) -> bool {
184185
diagnostic.severity() >= self.diagnostic_level
185-
&& (self.verbose || !diagnostic.tags().is_verbose())
186186
}
187187

188188
fn run(&self, receiver: Receiver<Diagnostic>) -> Vec<Diagnostic> {
@@ -408,7 +408,11 @@ fn open_file(ctx: &ScanContext, path: &BiomePath) {
408408
}) {
409409
Ok(Ok(())) => {}
410410
Ok(Err(err)) => {
411-
ctx.send_diagnostic(err);
411+
let mut error: Error = err.into();
412+
if !path.is_config() && error.severity() == Severity::Error {
413+
error = error.with_severity(Severity::Warning);
414+
}
415+
ctx.send_diagnostic(Diagnostic::new(error));
412416
}
413417
Err(err) => {
414418
let error = match err.downcast::<String>() {
@@ -423,3 +427,7 @@ fn open_file(ctx: &ScanContext, path: &BiomePath) {
423427
}
424428
}
425429
}
430+
431+
#[cfg(test)]
432+
#[path = "scanner.tests.rs"]
433+
mod tests;
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use std::sync::Arc;
2+
3+
use biome_fs::{BiomePath, TemporaryFs};
4+
use crossbeam::channel::bounded;
5+
use tokio::sync::watch;
6+
7+
use crate::{
8+
Workspace, WorkspaceServer,
9+
workspace::{OpenProjectParams, ScanKind, ScanProjectFolderParams, ServiceDataNotification},
10+
};
11+
12+
#[test]
13+
#[cfg(any(target_os = "linux", target_os = "macos"))]
14+
fn scanner_doesnt_show_errors_for_inaccessible_files() {
15+
use std::os::unix::fs::PermissionsExt;
16+
17+
const FILE_CONTENT: &str = "import 'foo';";
18+
19+
let mut fs = TemporaryFs::new("scanner_doesnt_show_errors_for_inaccessible_files");
20+
fs.create_file("a.js", FILE_CONTENT);
21+
22+
let (watcher_tx, _) = bounded(0);
23+
let (service_data_tx, _) = watch::channel(ServiceDataNotification::Updated);
24+
let workspace =
25+
WorkspaceServer::new(Arc::new(fs.create_os()), watcher_tx, service_data_tx, None);
26+
27+
let permissions = PermissionsExt::from_mode(0o000);
28+
std::fs::set_permissions(format!("{}/a.js", fs.cli_path()), permissions)
29+
.expect("Cannot set permissions");
30+
31+
let result = workspace
32+
.open_project(OpenProjectParams {
33+
path: BiomePath::new(fs.cli_path()),
34+
open_uninitialized: true,
35+
skip_rules: None,
36+
only_rules: None,
37+
})
38+
.unwrap();
39+
let project_key = result.project_key;
40+
41+
let result = workspace
42+
.scan_project_folder(ScanProjectFolderParams {
43+
project_key,
44+
path: None,
45+
watch: false,
46+
force: false,
47+
scan_kind: ScanKind::Project,
48+
verbose: false,
49+
})
50+
.unwrap();
51+
52+
assert!(result.diagnostics.is_empty());
53+
54+
let result = workspace
55+
.scan_project_folder(ScanProjectFolderParams {
56+
project_key,
57+
path: None,
58+
watch: false,
59+
force: false,
60+
scan_kind: ScanKind::Project,
61+
verbose: true,
62+
})
63+
.unwrap();
64+
65+
assert_eq!(result.diagnostics.len(), 1);
66+
}

crates/biome_service/src/workspace/server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -919,7 +919,7 @@ impl Workspace for WorkspaceServer {
919919
.try_send(WatcherInstruction::WatchFolder(path.clone()));
920920
}
921921

922-
let result = self.scan(params.project_key, &path, params.scan_kind)?;
922+
let result = self.scan(params.project_key, &path, params.scan_kind, params.verbose)?;
923923

924924
let _ = self.notification_tx.send(ServiceDataNotification::Updated);
925925

crates/biome_service/src/workspace/server.tests.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ fn commonjs_file_rejects_import_statement() {
3333
watch: false,
3434
force: false,
3535
scan_kind: ScanKind::Project,
36+
verbose: false,
3637
})
3738
.unwrap();
3839

@@ -95,6 +96,7 @@ fn store_embedded_nodes_with_corrent_ranges() {
9596
watch: false,
9697
force: false,
9798
scan_kind: ScanKind::Project,
99+
verbose: false,
98100
})
99101
.unwrap();
100102

0 commit comments

Comments
 (0)