Skip to content

Commit 104fe1c

Browse files
author
Jonathan Turner
committed
Updating a few more errors with labels
1 parent f3054ce commit 104fe1c

File tree

1 file changed

+46
-26
lines changed

1 file changed

+46
-26
lines changed

src/librustc_resolve/lib.rs

+46-26
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,13 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
200200

201201
match resolution_error {
202202
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
208210
}
209211
ResolutionError::OuterTypeParameterContext => {
210212
struct_span_err!(resolver.session,
@@ -230,6 +232,7 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
230232
"trait `{}` is not in scope",
231233
name);
232234
show_candidates(&mut err, &candidates);
235+
err = err.span_label(span, &format!("`{}` is not in scope", name));
233236
err
234237
}
235238
ResolutionError::UndeclaredAssociatedType => {
@@ -278,10 +281,12 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
278281
pattern_number)
279282
}
280283
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
285290
}
286291
ResolutionError::UseOfUndeclared(kind, name, candidates) => {
287292
let mut err = struct_span_err!(resolver.session,
@@ -291,54 +296,63 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
291296
kind,
292297
name);
293298
show_candidates(&mut err, &candidates);
299+
err = err.span_label(span, &format!("undefined or not in scope"));
294300
err
295301
}
296302
ResolutionError::DeclarationShadowsEnumVariantOrUnitLikeStruct(name) => {
297-
struct_span_err!(resolver.session,
303+
let mut err = struct_span_err!(resolver.session,
298304
span,
299305
E0413,
300-
"declaration of `{}` shadows an enum variant \
306+
"`{}` cannot be named the same as an enum variant \
301307
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
303312
}
304313
ResolutionError::ConstantForIrrefutableBinding(name) => {
305314
let mut err = struct_span_err!(resolver.session,
306315
span,
307316
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"));
312320
if let Some(binding) = resolver.current_module
313321
.resolve_name_in_lexical_scope(name, ValueNS) {
314322
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));
316325
}
317326
err
318327
}
319328
ResolutionError::IdentifierBoundMoreThanOnceInParameterList(identifier) => {
320-
struct_span_err!(resolver.session,
329+
let mut err = struct_span_err!(resolver.session,
321330
span,
322331
E0415,
323332
"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
325336
}
326337
ResolutionError::IdentifierBoundMoreThanOnceInSamePattern(identifier) => {
327-
struct_span_err!(resolver.session,
338+
let mut err = struct_span_err!(resolver.session,
328339
span,
329340
E0416,
330341
"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
332345
}
333346
ResolutionError::StaticVariableReference(binding) => {
334347
let mut err = struct_span_err!(resolver.session,
335348
span,
336349
E0417,
337350
"static variables cannot be referenced in a \
338351
pattern, use a `const` instead");
352+
err = err.span_label(span, &format!("static variable used in pattern"));
339353
if binding.span != codemap::DUMMY_SP {
340354
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));
342356
}
343357
err
344358
}
@@ -1804,7 +1818,9 @@ impl<'a> Resolver<'a> {
18041818

18051819
// If it's a typedef, give a note
18061820
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));
18081824

18091825
let definition_site = {
18101826
let segments = &trait_path.segments;
@@ -1816,7 +1832,8 @@ impl<'a> Resolver<'a> {
18161832
};
18171833

18181834
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"));
18201837
}
18211838
}
18221839
err.emit();
@@ -3462,12 +3479,15 @@ impl<'a> Resolver<'a> {
34623479
_ => match (old_binding.is_import(), binding.is_import()) {
34633480
(false, false) => struct_span_err!(self.session, span, E0428, "{}", msg),
34643481
(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+
}
34663486
},
34673487
};
34683488

34693489
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));
34713491
}
34723492
err.emit();
34733493
}

0 commit comments

Comments
 (0)