@@ -10,7 +10,10 @@ mod field_shorthand;
1010use std:: cell:: RefCell ;
1111
1212use base_db:: SourceDatabase ;
13- use hir:: { diagnostics:: DiagnosticSinkBuilder , Semantics } ;
13+ use hir:: {
14+ diagnostics:: { Diagnostic as _, DiagnosticSinkBuilder } ,
15+ Semantics ,
16+ } ;
1417use ide_db:: RootDatabase ;
1518use itertools:: Itertools ;
1619use rustc_hash:: FxHashSet ;
@@ -31,6 +34,25 @@ pub struct Diagnostic {
3134 pub range : TextRange ,
3235 pub severity : Severity ,
3336 pub fix : Option < Fix > ,
37+ pub unused : bool ,
38+ }
39+
40+ impl Diagnostic {
41+ fn error ( range : TextRange , message : String ) -> Self {
42+ Self { message, range, severity : Severity :: Error , fix : None , unused : false }
43+ }
44+
45+ fn hint ( range : TextRange , message : String ) -> Self {
46+ Self { message, range, severity : Severity :: WeakWarning , fix : None , unused : false }
47+ }
48+
49+ fn with_fix ( self , fix : Option < Fix > ) -> Self {
50+ Self { fix, ..self }
51+ }
52+
53+ fn with_unused ( self , unused : bool ) -> Self {
54+ Self { unused, ..self }
55+ }
3456}
3557
3658#[ derive( Debug ) ]
@@ -71,13 +93,13 @@ pub(crate) fn diagnostics(
7193 let mut res = Vec :: new ( ) ;
7294
7395 // [#34344] Only take first 128 errors to prevent slowing down editor/ide, the number 128 is chosen arbitrarily.
74- res. extend ( parse . errors ( ) . iter ( ) . take ( 128 ) . map ( |err| Diagnostic {
75- // name: None,
76- range : err . range ( ) ,
77- message : format ! ( "Syntax Error: {}" , err ) ,
78- severity : Severity :: Error ,
79- fix : None ,
80- } ) ) ;
96+ res. extend (
97+ parse
98+ . errors ( )
99+ . iter ( )
100+ . take ( 128 )
101+ . map ( |err| Diagnostic :: error ( err . range ( ) , format ! ( "Syntax Error: {}" , err ) ) ) ,
102+ ) ;
81103
82104 for node in parse. tree ( ) . syntax ( ) . descendants ( ) {
83105 check_unnecessary_braces_in_use_statement ( & mut res, file_id, & node) ;
@@ -100,6 +122,13 @@ pub(crate) fn diagnostics(
100122 . on :: < hir:: diagnostics:: IncorrectCase , _ > ( |d| {
101123 res. borrow_mut ( ) . push ( warning_with_fix ( d, & sema) ) ;
102124 } )
125+ . on :: < hir:: diagnostics:: InactiveCode , _ > ( |d| {
126+ // Override severity and mark as unused.
127+ res. borrow_mut ( ) . push (
128+ Diagnostic :: hint ( sema. diagnostics_display_range ( d) . range , d. message ( ) )
129+ . with_unused ( true ) ,
130+ ) ;
131+ } )
103132 // Only collect experimental diagnostics when they're enabled.
104133 . filter ( |diag| !( diag. is_experimental ( ) && config. disable_experimental ) )
105134 . filter ( |diag| !config. disabled . contains ( diag. code ( ) . as_str ( ) ) ) ;
@@ -108,13 +137,8 @@ pub(crate) fn diagnostics(
108137 let mut sink = sink_builder
109138 // Diagnostics not handled above get no fix and default treatment.
110139 . build ( |d| {
111- res. borrow_mut ( ) . push ( Diagnostic {
112- // name: Some(d.name().into()),
113- message : d. message ( ) ,
114- range : sema. diagnostics_display_range ( d) . range ,
115- severity : Severity :: Error ,
116- fix : None ,
117- } )
140+ res. borrow_mut ( )
141+ . push ( Diagnostic :: error ( sema. diagnostics_display_range ( d) . range , d. message ( ) ) ) ;
118142 } ) ;
119143
120144 if let Some ( m) = sema. to_module_def ( file_id) {
@@ -125,22 +149,11 @@ pub(crate) fn diagnostics(
125149}
126150
127151fn diagnostic_with_fix < D : DiagnosticWithFix > ( d : & D , sema : & Semantics < RootDatabase > ) -> Diagnostic {
128- Diagnostic {
129- // name: Some(d.name().into()),
130- range : sema. diagnostics_display_range ( d) . range ,
131- message : d. message ( ) ,
132- severity : Severity :: Error ,
133- fix : d. fix ( & sema) ,
134- }
152+ Diagnostic :: error ( sema. diagnostics_display_range ( d) . range , d. message ( ) ) . with_fix ( d. fix ( & sema) )
135153}
136154
137155fn warning_with_fix < D : DiagnosticWithFix > ( d : & D , sema : & Semantics < RootDatabase > ) -> Diagnostic {
138- Diagnostic {
139- range : sema. diagnostics_display_range ( d) . range ,
140- message : d. message ( ) ,
141- severity : Severity :: WeakWarning ,
142- fix : d. fix ( & sema) ,
143- }
156+ Diagnostic :: hint ( sema. diagnostics_display_range ( d) . range , d. message ( ) ) . with_fix ( d. fix ( & sema) )
144157}
145158
146159fn check_unnecessary_braces_in_use_statement (
@@ -161,17 +174,14 @@ fn check_unnecessary_braces_in_use_statement(
161174 edit_builder. finish ( )
162175 } ) ;
163176
164- acc. push ( Diagnostic {
165- // name: None,
166- range : use_range,
167- message : "Unnecessary braces in use statement" . to_string ( ) ,
168- severity : Severity :: WeakWarning ,
169- fix : Some ( Fix :: new (
170- "Remove unnecessary braces" ,
171- SourceFileEdit { file_id, edit } . into ( ) ,
172- use_range,
173- ) ) ,
174- } ) ;
177+ acc. push (
178+ Diagnostic :: hint ( use_range, "Unnecessary braces in use statement" . to_string ( ) )
179+ . with_fix ( Some ( Fix :: new (
180+ "Remove unnecessary braces" ,
181+ SourceFileEdit { file_id, edit } . into ( ) ,
182+ use_range,
183+ ) ) ) ,
184+ ) ;
175185 }
176186
177187 Some ( ( ) )
@@ -578,6 +588,7 @@ fn test_fn() {
578588 fix_trigger_range: 0..8,
579589 },
580590 ),
591+ unused: false,
581592 },
582593 ]
583594 "# ] ] ,
0 commit comments