add_elided_lifetime_in_path_suggestion -> rustc_session
This commit is contained in:
parent
e0403bcde3
commit
2c55902e3c
4 changed files with 46 additions and 46 deletions
|
@ -3,7 +3,7 @@ use std::cmp;
|
||||||
use crate::ich::StableHashingContext;
|
use crate::ich::StableHashingContext;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||||
use rustc_errors::{pluralize, Applicability, DiagnosticBuilder, DiagnosticId};
|
use rustc_errors::{DiagnosticBuilder, DiagnosticId};
|
||||||
use rustc_hir::HirId;
|
use rustc_hir::HirId;
|
||||||
use rustc_session::lint::{builtin, Level, Lint, LintId};
|
use rustc_session::lint::{builtin, Level, Lint, LintId};
|
||||||
use rustc_session::{DiagnosticMessageId, Session};
|
use rustc_session::{DiagnosticMessageId, Session};
|
||||||
|
@ -350,45 +350,3 @@ pub fn in_external_macro(sess: &Session, span: Span) -> bool {
|
||||||
ExpnKind::Macro(..) => true, // definitely a plugin
|
ExpnKind::Macro(..) => true, // definitely a plugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_elided_lifetime_in_path_suggestion(
|
|
||||||
sess: &Session,
|
|
||||||
db: &mut DiagnosticBuilder<'_>,
|
|
||||||
n: usize,
|
|
||||||
path_span: Span,
|
|
||||||
incl_angl_brckt: bool,
|
|
||||||
insertion_span: Span,
|
|
||||||
anon_lts: String,
|
|
||||||
) {
|
|
||||||
let (replace_span, suggestion) = if incl_angl_brckt {
|
|
||||||
(insertion_span, anon_lts)
|
|
||||||
} else {
|
|
||||||
// When possible, prefer a suggestion that replaces the whole
|
|
||||||
// `Path<T>` expression with `Path<'_, T>`, rather than inserting `'_, `
|
|
||||||
// at a point (which makes for an ugly/confusing label)
|
|
||||||
if let Ok(snippet) = sess.source_map().span_to_snippet(path_span) {
|
|
||||||
// But our spans can get out of whack due to macros; if the place we think
|
|
||||||
// we want to insert `'_` isn't even within the path expression's span, we
|
|
||||||
// should bail out of making any suggestion rather than panicking on a
|
|
||||||
// subtract-with-overflow or string-slice-out-out-bounds (!)
|
|
||||||
// FIXME: can we do better?
|
|
||||||
if insertion_span.lo().0 < path_span.lo().0 {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let insertion_index = (insertion_span.lo().0 - path_span.lo().0) as usize;
|
|
||||||
if insertion_index > snippet.len() {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let (before, after) = snippet.split_at(insertion_index);
|
|
||||||
(path_span, format!("{}{}{}", before, anon_lts, after))
|
|
||||||
} else {
|
|
||||||
(insertion_span, anon_lts)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
db.span_suggestion(
|
|
||||||
replace_span,
|
|
||||||
&format!("indicate the anonymous lifetime{}", pluralize!(n)),
|
|
||||||
suggestion,
|
|
||||||
Applicability::MachineApplicable,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
|
@ -306,7 +306,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
E0726,
|
E0726,
|
||||||
"implicit elided lifetime not allowed here"
|
"implicit elided lifetime not allowed here"
|
||||||
);
|
);
|
||||||
rustc::lint::add_elided_lifetime_in_path_suggestion(
|
rustc_session::lint::add_elided_lifetime_in_path_suggestion(
|
||||||
&self.sess,
|
&self.sess,
|
||||||
&mut err,
|
&mut err,
|
||||||
expected_lifetimes,
|
expected_lifetimes,
|
||||||
|
|
|
@ -19,7 +19,6 @@ use self::TargetLint::*;
|
||||||
use crate::levels::LintLevelsBuilder;
|
use crate::levels::LintLevelsBuilder;
|
||||||
use crate::passes::{EarlyLintPassObject, LateLintPassObject};
|
use crate::passes::{EarlyLintPassObject, LateLintPassObject};
|
||||||
use rustc::hir::map::definitions::{DefPathData, DisambiguatedDefPathData};
|
use rustc::hir::map::definitions::{DefPathData, DisambiguatedDefPathData};
|
||||||
use rustc::lint::add_elided_lifetime_in_path_suggestion;
|
|
||||||
use rustc::lint::LintDiagnosticBuilder;
|
use rustc::lint::LintDiagnosticBuilder;
|
||||||
use rustc::middle::privacy::AccessLevels;
|
use rustc::middle::privacy::AccessLevels;
|
||||||
use rustc::middle::stability;
|
use rustc::middle::stability;
|
||||||
|
@ -32,7 +31,7 @@ use rustc_data_structures::sync;
|
||||||
use rustc_errors::{struct_span_err, Applicability};
|
use rustc_errors::{struct_span_err, Applicability};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{CrateNum, DefId};
|
use rustc_hir::def_id::{CrateNum, DefId};
|
||||||
use rustc_session::lint::BuiltinLintDiagnostics;
|
use rustc_session::lint::{add_elided_lifetime_in_path_suggestion, BuiltinLintDiagnostics};
|
||||||
use rustc_session::lint::{FutureIncompatibleInfo, Level, Lint, LintBuffer, LintId};
|
use rustc_session::lint::{FutureIncompatibleInfo, Level, Lint, LintBuffer, LintId};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::{symbol::Symbol, MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{symbol::Symbol, MultiSpan, Span, DUMMY_SP};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
pub use self::Level::*;
|
pub use self::Level::*;
|
||||||
use rustc_ast::node_id::{NodeId, NodeMap};
|
use rustc_ast::node_id::{NodeId, NodeMap};
|
||||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey};
|
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey};
|
||||||
|
use rustc_errors::{pluralize, Applicability, DiagnosticBuilder};
|
||||||
use rustc_span::edition::Edition;
|
use rustc_span::edition::Edition;
|
||||||
use rustc_span::{sym, symbol::Ident, MultiSpan, Span, Symbol};
|
use rustc_span::{sym, symbol::Ident, MultiSpan, Span, Symbol};
|
||||||
|
|
||||||
|
@ -367,3 +368,45 @@ macro_rules! declare_lint_pass {
|
||||||
$crate::impl_lint_pass!($name => [$($lint),*]);
|
$crate::impl_lint_pass!($name => [$($lint),*]);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn add_elided_lifetime_in_path_suggestion(
|
||||||
|
sess: &crate::Session,
|
||||||
|
db: &mut DiagnosticBuilder<'_>,
|
||||||
|
n: usize,
|
||||||
|
path_span: Span,
|
||||||
|
incl_angl_brckt: bool,
|
||||||
|
insertion_span: Span,
|
||||||
|
anon_lts: String,
|
||||||
|
) {
|
||||||
|
let (replace_span, suggestion) = if incl_angl_brckt {
|
||||||
|
(insertion_span, anon_lts)
|
||||||
|
} else {
|
||||||
|
// When possible, prefer a suggestion that replaces the whole
|
||||||
|
// `Path<T>` expression with `Path<'_, T>`, rather than inserting `'_, `
|
||||||
|
// at a point (which makes for an ugly/confusing label)
|
||||||
|
if let Ok(snippet) = sess.source_map().span_to_snippet(path_span) {
|
||||||
|
// But our spans can get out of whack due to macros; if the place we think
|
||||||
|
// we want to insert `'_` isn't even within the path expression's span, we
|
||||||
|
// should bail out of making any suggestion rather than panicking on a
|
||||||
|
// subtract-with-overflow or string-slice-out-out-bounds (!)
|
||||||
|
// FIXME: can we do better?
|
||||||
|
if insertion_span.lo().0 < path_span.lo().0 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let insertion_index = (insertion_span.lo().0 - path_span.lo().0) as usize;
|
||||||
|
if insertion_index > snippet.len() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let (before, after) = snippet.split_at(insertion_index);
|
||||||
|
(path_span, format!("{}{}{}", before, anon_lts, after))
|
||||||
|
} else {
|
||||||
|
(insertion_span, anon_lts)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
db.span_suggestion(
|
||||||
|
replace_span,
|
||||||
|
&format!("indicate the anonymous lifetime{}", pluralize!(n)),
|
||||||
|
suggestion,
|
||||||
|
Applicability::MachineApplicable,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue