@@ -161,6 +161,7 @@ pub struct PerfStats {
161
161
enum DiagnosticBuilderMethod {
162
162
Note ,
163
163
SpanNote ,
164
+ SpanSuggestion ( String ) , // suggestion
164
165
// add more variants as needed to support one-time diagnostics
165
166
}
166
167
@@ -173,6 +174,12 @@ pub enum DiagnosticMessageId {
173
174
StabilityId ( u32 ) // issue number
174
175
}
175
176
177
+ impl From < & ' static lint:: Lint > for DiagnosticMessageId {
178
+ fn from ( lint : & ' static lint:: Lint ) -> Self {
179
+ DiagnosticMessageId :: LintId ( lint:: LintId :: of ( lint) )
180
+ }
181
+ }
182
+
176
183
impl Session {
177
184
pub fn local_crate_disambiguator ( & self ) -> CrateDisambiguator {
178
185
match * self . crate_disambiguator . borrow ( ) {
@@ -358,33 +365,50 @@ impl Session {
358
365
fn diag_once < ' a , ' b > ( & ' a self ,
359
366
diag_builder : & ' b mut DiagnosticBuilder < ' a > ,
360
367
method : DiagnosticBuilderMethod ,
361
- lint : & ' static lint:: Lint , message : & str , span : Option < Span > ) {
368
+ msg_id : DiagnosticMessageId ,
369
+ message : & str ,
370
+ span_maybe : Option < Span > ) {
362
371
363
- let lint_id = DiagnosticMessageId :: LintId ( lint:: LintId :: of ( lint) ) ;
364
- let id_span_message = ( lint_id, span, message. to_owned ( ) ) ;
372
+ let id_span_message = ( msg_id, span_maybe, message. to_owned ( ) ) ;
365
373
let fresh = self . one_time_diagnostics . borrow_mut ( ) . insert ( id_span_message) ;
366
374
if fresh {
367
375
match method {
368
376
DiagnosticBuilderMethod :: Note => {
369
377
diag_builder. note ( message) ;
370
378
} ,
371
379
DiagnosticBuilderMethod :: SpanNote => {
372
- diag_builder. span_note ( span. expect ( "span_note expects a span" ) , message) ;
380
+ let span = span_maybe. expect ( "span_note needs a span" ) ;
381
+ diag_builder. span_note ( span, message) ;
382
+ } ,
383
+ DiagnosticBuilderMethod :: SpanSuggestion ( suggestion) => {
384
+ let span = span_maybe. expect ( "span_suggestion needs a span" ) ;
385
+ diag_builder. span_suggestion ( span, message, suggestion) ;
373
386
}
374
387
}
375
388
}
376
389
}
377
390
378
391
pub fn diag_span_note_once < ' a , ' b > ( & ' a self ,
379
392
diag_builder : & ' b mut DiagnosticBuilder < ' a > ,
380
- lint : & ' static lint:: Lint , span : Span , message : & str ) {
381
- self . diag_once ( diag_builder, DiagnosticBuilderMethod :: SpanNote , lint, message, Some ( span) ) ;
393
+ msg_id : DiagnosticMessageId , span : Span , message : & str ) {
394
+ self . diag_once ( diag_builder, DiagnosticBuilderMethod :: SpanNote ,
395
+ msg_id, message, Some ( span) ) ;
382
396
}
383
397
384
398
pub fn diag_note_once < ' a , ' b > ( & ' a self ,
385
399
diag_builder : & ' b mut DiagnosticBuilder < ' a > ,
386
- lint : & ' static lint:: Lint , message : & str ) {
387
- self . diag_once ( diag_builder, DiagnosticBuilderMethod :: Note , lint, message, None ) ;
400
+ msg_id : DiagnosticMessageId , message : & str ) {
401
+ self . diag_once ( diag_builder, DiagnosticBuilderMethod :: Note , msg_id, message, None ) ;
402
+ }
403
+
404
+ pub fn diag_span_suggestion_once < ' a , ' b > ( & ' a self ,
405
+ diag_builder : & ' b mut DiagnosticBuilder < ' a > ,
406
+ msg_id : DiagnosticMessageId ,
407
+ span : Span ,
408
+ message : & str ,
409
+ suggestion : String ) {
410
+ self . diag_once ( diag_builder, DiagnosticBuilderMethod :: SpanSuggestion ( suggestion) ,
411
+ msg_id, message, Some ( span) ) ;
388
412
}
389
413
390
414
pub fn codemap < ' a > ( & ' a self ) -> & ' a codemap:: CodeMap {
0 commit comments