@@ -200,11 +200,13 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
200
200
201
201
match resolution_error {
202
202
ResolutionError :: TypeParametersFromOuterFunction => {
203
- struct_span_err ! ( resolver. session,
204
- span,
205
- E0401 ,
206
- "can't use type parameters from outer function; try using a local \
207
- type parameter instead")
203
+ let mut err = struct_span_err ! ( resolver. session,
204
+ span,
205
+ E0401 ,
206
+ "can't use type parameters from outer function; \
207
+ try using a local type parameter instead") ;
208
+ err = err. span_label ( span, & format ! ( "use of type variable from outer function" ) ) ;
209
+ err
208
210
}
209
211
ResolutionError :: OuterTypeParameterContext => {
210
212
struct_span_err ! ( resolver. session,
@@ -230,6 +232,7 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
230
232
"trait `{}` is not in scope" ,
231
233
name) ;
232
234
show_candidates ( & mut err, & candidates) ;
235
+ err = err. span_label ( span, & format ! ( "`{}` is not in scope" , name) ) ;
233
236
err
234
237
}
235
238
ResolutionError :: UndeclaredAssociatedType => {
@@ -278,10 +281,12 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
278
281
pattern_number)
279
282
}
280
283
ResolutionError :: SelfUsedOutsideImplOrTrait => {
281
- struct_span_err ! ( resolver. session,
282
- span,
283
- E0411 ,
284
- "use of `Self` outside of an impl or trait" )
284
+ let mut err = struct_span_err ! ( resolver. session,
285
+ span,
286
+ E0411 ,
287
+ "use of `Self` outside of an impl or trait" ) ;
288
+ err = err. span_label ( span, & format ! ( "Used outside of impl or trait" ) ) ;
289
+ err
285
290
}
286
291
ResolutionError :: UseOfUndeclared ( kind, name, candidates) => {
287
292
let mut err = struct_span_err ! ( resolver. session,
@@ -291,54 +296,63 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
291
296
kind,
292
297
name) ;
293
298
show_candidates ( & mut err, & candidates) ;
299
+ err = err. span_label ( span, & format ! ( "undefined or not in scope" ) ) ;
294
300
err
295
301
}
296
302
ResolutionError :: DeclarationShadowsEnumVariantOrUnitLikeStruct ( name) => {
297
- struct_span_err ! ( resolver. session,
303
+ let mut err = struct_span_err ! ( resolver. session,
298
304
span,
299
305
E0413 ,
300
- "declaration of `{}` shadows an enum variant \
306
+ "`{}` cannot be named the same as an enum variant \
301
307
or unit-like struct in scope",
302
- name)
308
+ name) ;
309
+ err = err. span_label ( span,
310
+ & format ! ( "has same name as enum variant or unit-like struct" ) ) ;
311
+ err
303
312
}
304
313
ResolutionError :: ConstantForIrrefutableBinding ( name) => {
305
314
let mut err = struct_span_err ! ( resolver. session,
306
315
span,
307
316
E0414 ,
308
- "variable bindings cannot shadow constants" ) ;
309
- err. span_note ( span,
310
- "there already is a constant in scope sharing the same \
311
- name as this pattern") ;
317
+ "let variables cannot be named the same as const variables" ) ;
318
+ err = err. span_label ( span,
319
+ & format ! ( "cannot be named the same as a const variable" ) ) ;
312
320
if let Some ( binding) = resolver. current_module
313
321
. resolve_name_in_lexical_scope ( name, ValueNS ) {
314
322
let participle = if binding. is_import ( ) { "imported" } else { "defined" } ;
315
- err. span_note ( binding. span , & format ! ( "constant {} here" , participle) ) ;
323
+ err = err. span_label ( binding. span , & format ! ( "a constant `{}` is {} here" ,
324
+ name, participle) ) ;
316
325
}
317
326
err
318
327
}
319
328
ResolutionError :: IdentifierBoundMoreThanOnceInParameterList ( identifier) => {
320
- struct_span_err ! ( resolver. session,
329
+ let mut err = struct_span_err ! ( resolver. session,
321
330
span,
322
331
E0415 ,
323
332
"identifier `{}` is bound more than once in this parameter list" ,
324
- identifier)
333
+ identifier) ;
334
+ err = err. span_label ( span, & format ! ( "used as parameter more than once" ) ) ;
335
+ err
325
336
}
326
337
ResolutionError :: IdentifierBoundMoreThanOnceInSamePattern ( identifier) => {
327
- struct_span_err ! ( resolver. session,
338
+ let mut err = struct_span_err ! ( resolver. session,
328
339
span,
329
340
E0416 ,
330
341
"identifier `{}` is bound more than once in the same pattern" ,
331
- identifier)
342
+ identifier) ;
343
+ err = err. span_label ( span, & format ! ( "used in a pattern more than once" ) ) ;
344
+ err
332
345
}
333
346
ResolutionError :: StaticVariableReference ( binding) => {
334
347
let mut err = struct_span_err ! ( resolver. session,
335
348
span,
336
349
E0417 ,
337
350
"static variables cannot be referenced in a \
338
351
pattern, use a `const` instead") ;
352
+ err = err. span_label ( span, & format ! ( "static variable used in pattern" ) ) ;
339
353
if binding. span != codemap:: DUMMY_SP {
340
354
let participle = if binding. is_import ( ) { "imported" } else { "defined" } ;
341
- err. span_note ( binding. span , & format ! ( "static variable {} here" , participle) ) ;
355
+ err = err . span_label ( binding. span , & format ! ( "static variable {} here" , participle) ) ;
342
356
}
343
357
err
344
358
}
@@ -1804,7 +1818,9 @@ impl<'a> Resolver<'a> {
1804
1818
1805
1819
// If it's a typedef, give a note
1806
1820
if let Def :: TyAlias ( ..) = path_res. base_def {
1807
- err. note ( "`type` aliases cannot be used for traits" ) ;
1821
+ let trait_name = trait_path. segments . last ( ) . unwrap ( ) . identifier . name ;
1822
+ err = err. span_label ( trait_path. span ,
1823
+ & format ! ( "`{}` is not a trait" , trait_name) ) ;
1808
1824
1809
1825
let definition_site = {
1810
1826
let segments = & trait_path. segments ;
@@ -1816,7 +1832,8 @@ impl<'a> Resolver<'a> {
1816
1832
} ;
1817
1833
1818
1834
if definition_site != codemap:: DUMMY_SP {
1819
- err. span_note ( definition_site, "type defined here" ) ;
1835
+ err = err. span_label ( definition_site,
1836
+ & format ! ( "note: type aliases cannot be used for traits" ) ) ;
1820
1837
}
1821
1838
}
1822
1839
err. emit ( ) ;
@@ -3462,12 +3479,15 @@ impl<'a> Resolver<'a> {
3462
3479
_ => match ( old_binding. is_import ( ) , binding. is_import ( ) ) {
3463
3480
( false , false ) => struct_span_err ! ( self . session, span, E0428 , "{}" , msg) ,
3464
3481
( true , true ) => struct_span_err ! ( self . session, span, E0252 , "{}" , msg) ,
3465
- _ => struct_span_err ! ( self . session, span, E0255 , "{}" , msg) ,
3482
+ _ => {
3483
+ let e = struct_span_err ! ( self . session, span, E0255 , "{}" , msg) ;
3484
+ e. span_label ( span, & format ! ( "`{}` was already imported" , name) )
3485
+ }
3466
3486
} ,
3467
3487
} ;
3468
3488
3469
3489
if old_binding. span != codemap:: DUMMY_SP {
3470
- err. span_note ( old_binding. span , & format ! ( "previous {} of `{}` here" , noun, name) ) ;
3490
+ err = err . span_label ( old_binding. span , & format ! ( "previous {} of `{}` here" , noun, name) ) ;
3471
3491
}
3472
3492
err. emit ( ) ;
3473
3493
}
0 commit comments