@@ -9,7 +9,7 @@ use nohash_hasher::{IntMap, IntSet};
99use rustc_hash:: FxHashSet ;
1010use triomphe:: Arc ;
1111
12- use crate :: lsp_ext;
12+ use crate :: { global_state :: GlobalStateSnapshot , lsp , lsp_ext} ;
1313
1414pub ( crate ) type CheckFixes = Arc < IntMap < usize , IntMap < FileId , Vec < Fix > > > > ;
1515
@@ -122,3 +122,41 @@ fn are_diagnostics_equal(left: &lsp_types::Diagnostic, right: &lsp_types::Diagno
122122 && left. range == right. range
123123 && left. message == right. message
124124}
125+
126+ pub ( crate ) fn fetch_native_diagnostics (
127+ snapshot : GlobalStateSnapshot ,
128+ subscriptions : Vec < FileId > ,
129+ ) -> Vec < ( FileId , Vec < lsp_types:: Diagnostic > ) > {
130+ let _p = profile:: span ( "fetch_native_diagnostics" ) ;
131+ let _ctx = stdx:: panic_context:: enter ( "fetch_native_diagnostics" . to_owned ( ) ) ;
132+ subscriptions
133+ . into_iter ( )
134+ . filter_map ( |file_id| {
135+ let line_index = snapshot. file_line_index ( file_id) . ok ( ) ?;
136+ let diagnostics = snapshot
137+ . analysis
138+ . diagnostics (
139+ & snapshot. config . diagnostics ( ) ,
140+ ide:: AssistResolveStrategy :: None ,
141+ file_id,
142+ )
143+ . ok ( ) ?
144+ . into_iter ( )
145+ . map ( move |d| lsp_types:: Diagnostic {
146+ range : lsp:: to_proto:: range ( & line_index, d. range ) ,
147+ severity : Some ( lsp:: to_proto:: diagnostic_severity ( d. severity ) ) ,
148+ code : Some ( lsp_types:: NumberOrString :: String ( d. code . as_str ( ) . to_string ( ) ) ) ,
149+ code_description : Some ( lsp_types:: CodeDescription {
150+ href : lsp_types:: Url :: parse ( & d. code . url ( ) ) . unwrap ( ) ,
151+ } ) ,
152+ source : Some ( "rust-analyzer" . to_string ( ) ) ,
153+ message : d. message ,
154+ related_information : None ,
155+ tags : d. unused . then ( || vec ! [ lsp_types:: DiagnosticTag :: UNNECESSARY ] ) ,
156+ data : None ,
157+ } )
158+ . collect :: < Vec < _ > > ( ) ;
159+ Some ( ( file_id, diagnostics) )
160+ } )
161+ . collect ( )
162+ }
0 commit comments