use rustc_hir::PrimTy;
use rustc_session::lint;
use rustc_session::parse::feature_err;
+use rustc_session::Session;
use rustc_span::edition::Edition;
use rustc_span::hygiene::MacroKind;
use rustc_span::lev_distance::find_best_match_for_name;
);
}
}
+ // Try Levenshtein algorithm.
+ let typo_sugg = self.lookup_typo_candidate(path, ns, is_expected);
if path.len() == 1 && self.self_type_is_available() {
if let Some(candidate) = self.lookup_assoc_candidate(ident, ns, is_expected) {
let self_is_available = self.self_value_is_available(path[0].ident.span);
err.span_suggestion(
span,
"you might have meant to use the available field",
- format!("self.{}", path_str),
+ format!("self.{path_str}"),
Applicability::MachineApplicable,
);
} else {
err.span_suggestion(
span,
"you might have meant to call the method",
- format!("self.{}", path_str),
+ format!("self.{path_str}"),
Applicability::MachineApplicable,
);
}
err.span_suggestion(
span,
&format!("you might have meant to {}", candidate.action()),
- format!("Self::{}", path_str),
+ format!("Self::{path_str}"),
Applicability::MachineApplicable,
);
}
}
+ self.r.add_typo_suggestion(&mut err, typo_sugg, ident_span);
return (err, candidates);
}
err.span_suggestion(
call_span,
- &format!("try calling `{}` as a method", ident),
- format!("self.{}({})", path_str, args_snippet),
+ &format!("try calling `{ident}` as a method"),
+ format!("self.{path_str}({args_snippet})"),
Applicability::MachineApplicable,
);
return (err, candidates);
}
}
- // Try Levenshtein algorithm.
- let typo_sugg = self.lookup_typo_candidate(path, ns, is_expected);
// Try context-dependent help if relaxed lookup didn't work.
if let Some(res) = res {
if self.smart_resolve_context_dependent_help(
}
}
+/// Report lifetime/lifetime shadowing as an error.
+pub fn signal_lifetime_shadowing(sess: &Session, orig: Ident, shadower: Ident) {
+ let mut err = struct_span_err!(
+ sess,
+ shadower.span,
+ E0496,
+ "lifetime name `{}` shadows a lifetime name that is already in scope",
+ orig.name,
+ );
+ err.span_label(orig.span, "first declared here");
+ err.span_label(shadower.span, format!("lifetime `{}` already in scope", orig.name));
+ err.emit();
+}
+
+/// Shadowing involving a label is only a warning for historical reasons.
+//FIXME: make this a proper lint.
+pub fn signal_label_shadowing(sess: &Session, orig: Span, shadower: Ident) {
+ let name = shadower.name;
+ let shadower = shadower.span;
+ let mut err = sess.struct_span_warn(
+ shadower,
+ &format!("label name `{}` shadows a label name that is already in scope", name),
+ );
+ err.span_label(orig, "first declared here");
+ err.span_label(shadower, format!("label `{}` already in scope", name));
+ err.emit();
+}
+
impl<'tcx> LifetimeContext<'_, 'tcx> {
pub(crate) fn report_missing_lifetime_specifiers(
&self,