Skip to content

Commit e941e50

Browse files
authored
Rollup merge of rust-lang#67806 - Centril:splitsynmore, r=petrochenkov
Extract `rustc_ast_passes`, move gating, & refactor linting Based on rust-lang#67770. This PR extracts a crate `rustc_ast_passes`: - `ast_validation.rs`, which is contributed by `rustc_passes` (now only has HIR based passes) -- the goal here is to improve recompilation of the parser, - `feature_gate.rs`, which is contributed by `syntax` and performs post-expansion-gating & final erroring for pre-expansion gating, - `show_span`, which is contributed by `syntax`. To facilitate this, we first have to also: - Move `{leveled_}feature_err{_err}` from `syntax::feature_gate::check` into `rustc_session::parse`. - Move `get_features` into `rustc_parse::config`, the only place it is used. - Move some some lint datatypes and traits, e.g. `LintBuffer`, `BufferedEarlyLint`, `BuiltinLintDiagnostics`, `LintPass`, and `LintArray` into `rustc_session::lint`. - Move all the hard-wired lint `static`s into `rustc_session::lint::builtin`.
2 parents 1756313 + 682f500 commit e941e50

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+711
-679
lines changed

Cargo.lock

+23-1
Original file line numberDiff line numberDiff line change
@@ -3374,6 +3374,21 @@ dependencies = [
33743374
"syntax",
33753375
]
33763376

3377+
[[package]]
3378+
name = "rustc_ast_passes"
3379+
version = "0.0.0"
3380+
dependencies = [
3381+
"log",
3382+
"rustc_data_structures",
3383+
"rustc_error_codes",
3384+
"rustc_errors",
3385+
"rustc_feature",
3386+
"rustc_parse",
3387+
"rustc_session",
3388+
"rustc_span",
3389+
"syntax",
3390+
]
3391+
33773392
[[package]]
33783393
name = "rustc_builtin_macros"
33793394
version = "0.0.0"
@@ -3386,6 +3401,7 @@ dependencies = [
33863401
"rustc_expand",
33873402
"rustc_feature",
33883403
"rustc_parse",
3404+
"rustc_session",
33893405
"rustc_span",
33903406
"rustc_target",
33913407
"smallvec 1.0.0",
@@ -3539,11 +3555,13 @@ name = "rustc_expand"
35393555
version = "0.0.0"
35403556
dependencies = [
35413557
"log",
3558+
"rustc_ast_passes",
35423559
"rustc_data_structures",
35433560
"rustc_errors",
35443561
"rustc_feature",
35453562
"rustc_lexer",
35463563
"rustc_parse",
3564+
"rustc_session",
35473565
"rustc_span",
35483566
"serialize",
35493567
"smallvec 1.0.0",
@@ -3613,6 +3631,7 @@ dependencies = [
36133631
"rustc",
36143632
"rustc-rayon",
36153633
"rustc_ast_lowering",
3634+
"rustc_ast_passes",
36163635
"rustc_builtin_macros",
36173636
"rustc_codegen_llvm",
36183637
"rustc_codegen_ssa",
@@ -3630,6 +3649,7 @@ dependencies = [
36303649
"rustc_plugin_impl",
36313650
"rustc_privacy",
36323651
"rustc_resolve",
3652+
"rustc_session",
36333653
"rustc_span",
36343654
"rustc_target",
36353655
"rustc_traits",
@@ -3768,6 +3788,7 @@ dependencies = [
37683788
"rustc_errors",
37693789
"rustc_feature",
37703790
"rustc_lexer",
3791+
"rustc_session",
37713792
"rustc_span",
37723793
"smallvec 1.0.0",
37733794
"syntax",
@@ -3786,7 +3807,7 @@ dependencies = [
37863807
"rustc_feature",
37873808
"rustc_hir",
37883809
"rustc_index",
3789-
"rustc_parse",
3810+
"rustc_session",
37903811
"rustc_span",
37913812
"rustc_target",
37923813
"syntax",
@@ -3866,6 +3887,7 @@ dependencies = [
38663887
"log",
38673888
"num_cpus",
38683889
"rustc_data_structures",
3890+
"rustc_error_codes",
38693891
"rustc_errors",
38703892
"rustc_feature",
38713893
"rustc_fs_util",

src/librustc/lint/context.rs

+125-15
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,21 @@
1717
use self::TargetLint::*;
1818

1919
use crate::hir::map::{definitions::DisambiguatedDefPathData, DefPathData};
20-
use crate::lint::builtin::BuiltinLintDiagnostics;
2120
use crate::lint::levels::{LintLevelSets, LintLevelsBuilder};
2221
use crate::lint::{EarlyLintPassObject, LateLintPassObject};
23-
use crate::lint::{FutureIncompatibleInfo, Level, Lint, LintBuffer, LintId};
2422
use crate::middle::privacy::AccessLevels;
23+
use crate::middle::stability;
2524
use crate::session::Session;
2625
use crate::ty::layout::{LayoutError, LayoutOf, TyLayout};
2726
use crate::ty::{self, print::Printer, subst::GenericArg, Ty, TyCtxt};
2827
use rustc_data_structures::fx::FxHashMap;
2928
use rustc_data_structures::sync;
3029
use rustc_error_codes::*;
31-
use rustc_errors::{struct_span_err, DiagnosticBuilder};
30+
use rustc_errors::{pluralize, struct_span_err, Applicability, DiagnosticBuilder};
3231
use rustc_hir as hir;
3332
use rustc_hir::def_id::{CrateNum, DefId};
33+
use rustc_session::lint::BuiltinLintDiagnostics;
34+
use rustc_session::lint::{FutureIncompatibleInfo, Level, Lint, LintBuffer, LintId};
3435
use rustc_span::{symbol::Symbol, MultiSpan, Span, DUMMY_SP};
3536
use syntax::ast;
3637
use syntax::util::lev_distance::find_best_match_for_name;
@@ -64,17 +65,6 @@ pub struct LintStore {
6465
lint_groups: FxHashMap<&'static str, LintGroup>,
6566
}
6667

67-
/// Lints that are buffered up early on in the `Session` before the
68-
/// `LintLevels` is calculated
69-
#[derive(PartialEq, Debug)]
70-
pub struct BufferedEarlyLint {
71-
pub lint_id: LintId,
72-
pub ast_id: ast::NodeId,
73-
pub span: MultiSpan,
74-
pub msg: String,
75-
pub diagnostic: BuiltinLintDiagnostics,
76-
}
77-
7868
/// The target of the `by_name` map, which accounts for renaming/deprecation.
7969
enum TargetLint {
8070
/// A direct lint target
@@ -477,6 +467,48 @@ impl LintPassObject for EarlyLintPassObject {}
477467

478468
impl LintPassObject for LateLintPassObject {}
479469

470+
pub fn add_elided_lifetime_in_path_suggestion(
471+
sess: &Session,
472+
db: &mut DiagnosticBuilder<'_>,
473+
n: usize,
474+
path_span: Span,
475+
incl_angl_brckt: bool,
476+
insertion_span: Span,
477+
anon_lts: String,
478+
) {
479+
let (replace_span, suggestion) = if incl_angl_brckt {
480+
(insertion_span, anon_lts)
481+
} else {
482+
// When possible, prefer a suggestion that replaces the whole
483+
// `Path<T>` expression with `Path<'_, T>`, rather than inserting `'_, `
484+
// at a point (which makes for an ugly/confusing label)
485+
if let Ok(snippet) = sess.source_map().span_to_snippet(path_span) {
486+
// But our spans can get out of whack due to macros; if the place we think
487+
// we want to insert `'_` isn't even within the path expression's span, we
488+
// should bail out of making any suggestion rather than panicking on a
489+
// subtract-with-overflow or string-slice-out-out-bounds (!)
490+
// FIXME: can we do better?
491+
if insertion_span.lo().0 < path_span.lo().0 {
492+
return;
493+
}
494+
let insertion_index = (insertion_span.lo().0 - path_span.lo().0) as usize;
495+
if insertion_index > snippet.len() {
496+
return;
497+
}
498+
let (before, after) = snippet.split_at(insertion_index);
499+
(path_span, format!("{}{}{}", before, anon_lts, after))
500+
} else {
501+
(insertion_span, anon_lts)
502+
}
503+
};
504+
db.span_suggestion(
505+
replace_span,
506+
&format!("indicate the anonymous lifetime{}", pluralize!(n)),
507+
suggestion,
508+
Applicability::MachineApplicable,
509+
);
510+
}
511+
480512
pub trait LintContext: Sized {
481513
type PassObject: LintPassObject;
482514

@@ -495,7 +527,85 @@ pub trait LintContext: Sized {
495527
diagnostic: BuiltinLintDiagnostics,
496528
) {
497529
let mut db = self.lookup(lint, span, msg);
498-
diagnostic.run(self.sess(), &mut db);
530+
531+
let sess = self.sess();
532+
match diagnostic {
533+
BuiltinLintDiagnostics::Normal => (),
534+
BuiltinLintDiagnostics::BareTraitObject(span, is_global) => {
535+
let (sugg, app) = match sess.source_map().span_to_snippet(span) {
536+
Ok(s) if is_global => {
537+
(format!("dyn ({})", s), Applicability::MachineApplicable)
538+
}
539+
Ok(s) => (format!("dyn {}", s), Applicability::MachineApplicable),
540+
Err(_) => ("dyn <type>".to_string(), Applicability::HasPlaceholders),
541+
};
542+
db.span_suggestion(span, "use `dyn`", sugg, app);
543+
}
544+
BuiltinLintDiagnostics::AbsPathWithModule(span) => {
545+
let (sugg, app) = match sess.source_map().span_to_snippet(span) {
546+
Ok(ref s) => {
547+
// FIXME(Manishearth) ideally the emitting code
548+
// can tell us whether or not this is global
549+
let opt_colon = if s.trim_start().starts_with("::") { "" } else { "::" };
550+
551+
(format!("crate{}{}", opt_colon, s), Applicability::MachineApplicable)
552+
}
553+
Err(_) => ("crate::<path>".to_string(), Applicability::HasPlaceholders),
554+
};
555+
db.span_suggestion(span, "use `crate`", sugg, app);
556+
}
557+
BuiltinLintDiagnostics::ProcMacroDeriveResolutionFallback(span) => {
558+
db.span_label(
559+
span,
560+
"names from parent modules are not accessible without an explicit import",
561+
);
562+
}
563+
BuiltinLintDiagnostics::MacroExpandedMacroExportsAccessedByAbsolutePaths(span_def) => {
564+
db.span_note(span_def, "the macro is defined here");
565+
}
566+
BuiltinLintDiagnostics::ElidedLifetimesInPaths(
567+
n,
568+
path_span,
569+
incl_angl_brckt,
570+
insertion_span,
571+
anon_lts,
572+
) => {
573+
add_elided_lifetime_in_path_suggestion(
574+
sess,
575+
&mut db,
576+
n,
577+
path_span,
578+
incl_angl_brckt,
579+
insertion_span,
580+
anon_lts,
581+
);
582+
}
583+
BuiltinLintDiagnostics::UnknownCrateTypes(span, note, sugg) => {
584+
db.span_suggestion(span, &note, sugg, Applicability::MaybeIncorrect);
585+
}
586+
BuiltinLintDiagnostics::UnusedImports(message, replaces) => {
587+
if !replaces.is_empty() {
588+
db.tool_only_multipart_suggestion(
589+
&message,
590+
replaces,
591+
Applicability::MachineApplicable,
592+
);
593+
}
594+
}
595+
BuiltinLintDiagnostics::RedundantImport(spans, ident) => {
596+
for (span, is_imported) in spans {
597+
let introduced = if is_imported { "imported" } else { "defined" };
598+
db.span_label(
599+
span,
600+
format!("the item `{}` is already {} here", ident, introduced),
601+
);
602+
}
603+
}
604+
BuiltinLintDiagnostics::DeprecatedMacro(suggestion, span) => {
605+
stability::deprecation_suggestion(&mut db, suggestion, span)
606+
}
607+
}
608+
499609
db.emit();
500610
}
501611

src/librustc/lint/internal.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
//! Some lints that are only useful in the compiler or crates that use compiler internals, such as
22
//! Clippy.
33
4-
use crate::lint::{
5-
EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintArray, LintContext, LintPass,
6-
};
4+
use crate::lint::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext};
75
use rustc_data_structures::fx::FxHashMap;
86
use rustc_errors::Applicability;
97
use rustc_hir::{GenericArg, HirId, MutTy, Mutability, Path, PathSegment, QPath, Ty, TyKind};
10-
use rustc_session::declare_tool_lint;
8+
use rustc_session::{declare_lint_pass, declare_tool_lint, impl_lint_pass};
119
use rustc_span::symbol::{sym, Symbol};
1210
use syntax::ast::{Ident, Item, ItemKind};
1311

src/librustc/lint/levels.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use rustc_span::source_map::MultiSpan;
1313
use rustc_span::symbol::{sym, Symbol};
1414
use syntax::ast;
1515
use syntax::attr;
16-
use syntax::feature_gate;
1716
use syntax::print::pprust;
17+
use syntax::sess::feature_err;
1818

1919
use rustc_error_codes::*;
2020

@@ -223,7 +223,7 @@ impl<'a> LintLevelsBuilder<'a> {
223223
// don't have any lint names (`#[level(reason = "foo")]`)
224224
if let ast::LitKind::Str(rationale, _) = name_value.kind {
225225
if !self.sess.features_untracked().lint_reasons {
226-
feature_gate::feature_err(
226+
feature_err(
227227
&self.sess.parse_sess,
228228
sym::lint_reasons,
229229
item.span,

0 commit comments

Comments
 (0)