@@ -52,13 +52,17 @@ impl ServerLinterDiagnostics {
5252 pub fn get_diagnostics ( & self , path : & str ) -> Option < Vec < DiagnosticReport > > {
5353 let mut reports = Vec :: new ( ) ;
5454 let mut found = false ;
55- if let Some ( Some ( diagnostics) ) = self . isolated_linter . pin ( ) . get ( path) {
56- reports. extend ( diagnostics. clone ( ) ) ;
55+ if let Some ( entry) = self . isolated_linter . pin ( ) . get ( path) {
5756 found = true ;
57+ if let Some ( diagnostics) = entry {
58+ reports. extend ( diagnostics. clone ( ) ) ;
59+ }
5860 }
59- if let Some ( Some ( diagnostics) ) = self . tsgo_linter . pin ( ) . get ( path) {
60- reports. extend ( diagnostics. clone ( ) ) ;
61+ if let Some ( entry) = self . tsgo_linter . pin ( ) . get ( path) {
6162 found = true ;
63+ if let Some ( diagnostics) = entry {
64+ reports. extend ( diagnostics. clone ( ) ) ;
65+ }
6266 }
6367 if found { Some ( reports) } else { None }
6468 }
@@ -69,9 +73,10 @@ impl ServerLinterDiagnostics {
6973 }
7074
7175 pub fn get_cached_files_of_diagnostics ( & self ) -> Vec < String > {
72- let mut files = Vec :: new ( ) ;
7376 let isolated_files = self . isolated_linter . pin ( ) . keys ( ) . cloned ( ) . collect :: < Vec < _ > > ( ) ;
7477 let tsgo_files = self . tsgo_linter . pin ( ) . keys ( ) . cloned ( ) . collect :: < Vec < _ > > ( ) ;
78+
79+ let mut files = Vec :: with_capacity ( isolated_files. len ( ) + tsgo_files. len ( ) ) ;
7580 files. extend ( isolated_files) ;
7681 files. extend ( tsgo_files) ;
7782 files. dedup ( ) ;
@@ -407,9 +412,11 @@ mod test {
407412 use std:: path:: { Path , PathBuf } ;
408413
409414 use crate :: {
415+ ConcurrentHashMap ,
410416 linter:: {
417+ error_with_position:: DiagnosticReport ,
411418 options:: { LintOptions , Run , UnusedDisableDirectives } ,
412- server_linter:: { ServerLinter , normalize_path} ,
419+ server_linter:: { ServerLinter , ServerLinterDiagnostics , normalize_path} ,
413420 } ,
414421 tester:: { Tester , get_file_path} ,
415422 } ;
@@ -457,6 +464,45 @@ mod test {
457464 assert ! ( configs_dirs[ 0 ] . ends_with( "init_nested_configs" ) ) ;
458465 }
459466
467+ #[ test]
468+ fn test_get_diagnostics_found_and_none_entries ( ) {
469+ let key = "file:///test.js" . to_string ( ) ;
470+
471+ // Case 1: Both entries present, Some diagnostics
472+ let diag = DiagnosticReport :: default ( ) ;
473+ let diag_map = ConcurrentHashMap :: default ( ) ;
474+ diag_map. pin ( ) . insert ( key. clone ( ) , Some ( vec ! [ diag. clone( ) ] ) ) ;
475+ let tsgo_map = ConcurrentHashMap :: default ( ) ;
476+ tsgo_map. pin ( ) . insert ( key. clone ( ) , Some ( vec ! [ diag] ) ) ;
477+
478+ let server_diag = super :: ServerLinterDiagnostics {
479+ isolated_linter : std:: sync:: Arc :: new ( diag_map) ,
480+ tsgo_linter : std:: sync:: Arc :: new ( tsgo_map) ,
481+ } ;
482+ let result = server_diag. get_diagnostics ( & key) ;
483+ assert ! ( result. is_some( ) ) ;
484+ assert_eq ! ( result. unwrap( ) . len( ) , 2 ) ;
485+
486+ // Case 2: Entry present, but value is None
487+ let diag_map_none = ConcurrentHashMap :: default ( ) ;
488+ diag_map_none. pin ( ) . insert ( key. clone ( ) , None ) ;
489+ let tsgo_map_none = ConcurrentHashMap :: default ( ) ;
490+ tsgo_map_none. pin ( ) . insert ( key. clone ( ) , None ) ;
491+
492+ let server_diag_none = ServerLinterDiagnostics {
493+ isolated_linter : std:: sync:: Arc :: new ( diag_map_none) ,
494+ tsgo_linter : std:: sync:: Arc :: new ( tsgo_map_none) ,
495+ } ;
496+ let result_none = server_diag_none. get_diagnostics ( & key) ;
497+ assert ! ( result_none. is_some( ) ) ;
498+ assert_eq ! ( result_none. unwrap( ) . len( ) , 0 ) ;
499+
500+ // Case 3: No entry at all
501+ let server_diag_empty = ServerLinterDiagnostics :: default ( ) ;
502+ let result_empty = server_diag_empty. get_diagnostics ( & key) ;
503+ assert ! ( result_empty. is_none( ) ) ;
504+ }
505+
460506 #[ test]
461507 #[ cfg( not( target_endian = "big" ) ) ]
462508 fn test_lint_on_run_on_type_on_type ( ) {
0 commit comments