@@ -131,9 +131,16 @@ macro_rules! define_warn {
131131 } ;
132132 }
133133 } ;
134+ ( $(
135+ $ident: ident = $string_keyword: expr
136+ ) ,* , ) => {
137+ define_warn!( $( $ident = $string_keyword) ,* ) ;
138+ } ;
134139}
135140define_warn ! {
136- UNREACHABLE_STATEMENT = "unreachable statement"
141+ UNREACHABLE_STATEMENT = "unreachable statement" ,
142+ UNUSED_VARIABLE = "unused variable" ,
143+ UNUSED_FUNCTION = "unused function" ,
137144}
138145
139146#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
@@ -156,7 +163,7 @@ impl Display for DiagCode {
156163 }
157164}
158165
159- use lsp_types:: { Diagnostic , DiagnosticSeverity , Url } ;
166+ use lsp_types:: { Diagnostic , DiagnosticSeverity , DiagnosticTag , Url } ;
160167
161168use crate :: Db ;
162169
@@ -204,11 +211,23 @@ impl PLDiag {
204211 )
205212 . with_code ( self . raw . code )
206213 . with_message ( self . get_msg ( ) ) ;
207- let labels = vec ! [ PLLabel {
208- range: self . raw. range,
209- file: path. to_string( ) ,
210- txt: Some ( ( "here" . to_string( ) , vec![ ] ) ) ,
211- } ] ;
214+ let mut labels = vec ! [ ] ;
215+ self . raw
216+ . labels
217+ . iter ( )
218+ . find ( |label| {
219+ label. range . start == self . raw . range . start
220+ && self . raw . range . end == label. range . end
221+ && label. file == path
222+ } )
223+ . or_else ( || {
224+ labels. push ( PLLabel {
225+ range : self . raw . range ,
226+ file : path. to_string ( ) ,
227+ txt : Some ( ( "here" . to_string ( ) , vec ! [ ] ) ) ,
228+ } ) ;
229+ None
230+ } ) ;
212231
213232 for label in labels. iter ( ) . chain ( self . raw . labels . iter ( ) ) {
214233 let color = colors. next ( ) ;
@@ -269,13 +288,22 @@ impl PLDiag {
269288 Some ( PL_DIAG_SOURCE . to_string ( ) ) ,
270289 ERR_MSG [ & code] . to_string ( ) ,
271290 ) ,
272- DiagCode :: Warn ( code) => Diagnostic :: new_with_code_number (
273- self . raw . range . to_diag_range ( ) ,
274- DiagnosticSeverity :: WARNING ,
275- code as i32 ,
276- Some ( PL_DIAG_SOURCE . to_string ( ) ) ,
277- WARN_MSG [ & code] . to_string ( ) ,
278- ) ,
291+ DiagCode :: Warn ( code) => {
292+ let mut warn = Diagnostic :: new_with_code_number (
293+ self . raw . range . to_diag_range ( ) ,
294+ DiagnosticSeverity :: WARNING ,
295+ code as i32 ,
296+ Some ( PL_DIAG_SOURCE . to_string ( ) ) ,
297+ WARN_MSG [ & code] . to_string ( ) ,
298+ ) ;
299+ if code == WarnCode :: UNUSED_FUNCTION
300+ || code == WarnCode :: UNUSED_VARIABLE
301+ || code == WarnCode :: UNREACHABLE_STATEMENT
302+ {
303+ warn. tags = Some ( vec ! [ DiagnosticTag :: UNNECESSARY ] ) ;
304+ }
305+ warn
306+ }
279307 } ;
280308 let mut labels = vec ! [ ] ;
281309 self . raw . labels . iter ( ) . for_each ( |label| {
0 commit comments