Skip to content

Commit

Permalink
Auto merge of rust-lang#67788 - cjgillot:delint-day, r=Zoxc
Browse files Browse the repository at this point in the history
Move early and late lint mechanisms to librustc_lint.

As requested, split from rust-lang#67737

r? @Zoxc
  • Loading branch information
bors committed Jan 4, 2020
2 parents abf2e00 + 1fab03e commit 79cf5e4
Show file tree
Hide file tree
Showing 8 changed files with 1,011 additions and 944 deletions.
829 changes: 15 additions & 814 deletions src/librustc/lint/context.rs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/librustc/lint/levels.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ pub struct LintLevelsBuilder<'a> {

pub struct BuilderPush {
prev: u32,
pub(super) changed: bool,
pub changed: bool,
}

impl<'a> LintLevelsBuilder<'a> {
Expand Down
128 changes: 4 additions & 124 deletions src/librustc/lint/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,8 @@ pub use self::LintSource::*;
use rustc_data_structures::sync;

use crate::hir;
use crate::hir::def_id::{CrateNum, LOCAL_CRATE};
use crate::hir::intravisit;
use crate::lint::builtin::BuiltinLintDiagnostics;
use crate::session::{DiagnosticMessageId, Session};
use crate::ty::query::Providers;
use crate::ty::TyCtxt;
use crate::util::nodemap::NodeMap;
use errors::{DiagnosticBuilder, DiagnosticId};
Expand All @@ -39,8 +36,7 @@ use rustc_span::Span;
use syntax::ast;

pub use crate::lint::context::{
check_ast_crate, check_crate, late_lint_mod, BufferedEarlyLint, CheckLintNameResult,
EarlyContext, LateContext, LintContext, LintStore,
BufferedEarlyLint, CheckLintNameResult, EarlyContext, LateContext, LintContext, LintStore,
};

pub use rustc_session::lint::{FutureIncompatibleInfo, Level, Lint, LintId};
Expand Down Expand Up @@ -376,11 +372,11 @@ mod context;
pub mod internal;
mod levels;

pub use self::levels::{LintLevelMap, LintLevelSets};
pub use self::levels::{LintLevelMap, LintLevelSets, LintLevelsBuilder};

#[derive(Default)]
pub struct LintBuffer {
map: NodeMap<Vec<BufferedEarlyLint>>,
pub map: NodeMap<Vec<BufferedEarlyLint>>,
}

impl LintBuffer {
Expand All @@ -405,7 +401,7 @@ impl LintBuffer {
}
}

fn take(&mut self, id: ast::NodeId) -> Vec<BufferedEarlyLint> {
pub fn take(&mut self, id: ast::NodeId) -> Vec<BufferedEarlyLint> {
self.map.remove(&id).unwrap_or_default()
}

Expand Down Expand Up @@ -564,122 +560,6 @@ pub fn maybe_lint_level_root(tcx: TyCtxt<'_>, id: hir::HirId) -> bool {
attrs.iter().any(|attr| Level::from_symbol(attr.name_or_empty()).is_some())
}

fn lint_levels(tcx: TyCtxt<'_>, cnum: CrateNum) -> &LintLevelMap {
assert_eq!(cnum, LOCAL_CRATE);
let store = &tcx.lint_store;
let mut builder = LintLevelMapBuilder {
levels: LintLevelSets::builder(tcx.sess, false, &store),
tcx: tcx,
store: store,
};
let krate = tcx.hir().krate();

let push = builder.levels.push(&krate.attrs, &store);
builder.levels.register_id(hir::CRATE_HIR_ID);
for macro_def in krate.exported_macros {
builder.levels.register_id(macro_def.hir_id);
}
intravisit::walk_crate(&mut builder, krate);
builder.levels.pop(push);

tcx.arena.alloc(builder.levels.build_map())
}

struct LintLevelMapBuilder<'a, 'tcx> {
levels: levels::LintLevelsBuilder<'tcx>,
tcx: TyCtxt<'tcx>,
store: &'a LintStore,
}

impl LintLevelMapBuilder<'_, '_> {
fn with_lint_attrs<F>(&mut self, id: hir::HirId, attrs: &[ast::Attribute], f: F)
where
F: FnOnce(&mut Self),
{
let push = self.levels.push(attrs, self.store);
if push.changed {
self.levels.register_id(id);
}
f(self);
self.levels.pop(push);
}
}

impl intravisit::Visitor<'tcx> for LintLevelMapBuilder<'_, 'tcx> {
fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'tcx> {
intravisit::NestedVisitorMap::All(&self.tcx.hir())
}

fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) {
self.with_lint_attrs(param.hir_id, &param.attrs, |builder| {
intravisit::walk_param(builder, param);
});
}

fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) {
self.with_lint_attrs(it.hir_id, &it.attrs, |builder| {
intravisit::walk_item(builder, it);
});
}

fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) {
self.with_lint_attrs(it.hir_id, &it.attrs, |builder| {
intravisit::walk_foreign_item(builder, it);
})
}

fn visit_expr(&mut self, e: &'tcx hir::Expr<'tcx>) {
self.with_lint_attrs(e.hir_id, &e.attrs, |builder| {
intravisit::walk_expr(builder, e);
})
}

fn visit_struct_field(&mut self, s: &'tcx hir::StructField<'tcx>) {
self.with_lint_attrs(s.hir_id, &s.attrs, |builder| {
intravisit::walk_struct_field(builder, s);
})
}

fn visit_variant(
&mut self,
v: &'tcx hir::Variant<'tcx>,
g: &'tcx hir::Generics<'tcx>,
item_id: hir::HirId,
) {
self.with_lint_attrs(v.id, &v.attrs, |builder| {
intravisit::walk_variant(builder, v, g, item_id);
})
}

fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) {
self.with_lint_attrs(l.hir_id, &l.attrs, |builder| {
intravisit::walk_local(builder, l);
})
}

fn visit_arm(&mut self, a: &'tcx hir::Arm<'tcx>) {
self.with_lint_attrs(a.hir_id, &a.attrs, |builder| {
intravisit::walk_arm(builder, a);
})
}

fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) {
self.with_lint_attrs(trait_item.hir_id, &trait_item.attrs, |builder| {
intravisit::walk_trait_item(builder, trait_item);
});
}

fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) {
self.with_lint_attrs(impl_item.hir_id, &impl_item.attrs, |builder| {
intravisit::walk_impl_item(builder, impl_item);
});
}
}

pub fn provide(providers: &mut Providers<'_>) {
providers.lint_levels = lint_levels;
}

/// Returns whether `span` originates in a foreign crate's external macro.
///
/// This is used to test whether a lint should not even begin to figure out whether it should
Expand Down
7 changes: 3 additions & 4 deletions src/librustc_interface/passes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ fn configure_and_expand_inner<'a>(
metadata_loader: &'a MetadataLoaderDyn,
) -> Result<(ast::Crate, Resolver<'a>)> {
time(sess, "pre-AST-expansion lint checks", || {
lint::check_ast_crate(
rustc_lint::check_ast_crate(
sess,
lint_store,
&krate,
Expand Down Expand Up @@ -458,7 +458,7 @@ pub fn lower_to_hir<'res, 'tcx>(
});

time(sess, "early lint checks", || {
lint::check_ast_crate(
rustc_lint::check_ast_crate(
sess,
lint_store,
&krate,
Expand Down Expand Up @@ -691,7 +691,6 @@ pub fn default_provide(providers: &mut ty::query::Providers<'_>) {
rustc_resolve::provide(providers);
rustc_traits::provide(providers);
rustc_metadata::provide(providers);
lint::provide(providers);
rustc_lint::provide(providers);
rustc_codegen_utils::provide(providers);
rustc_codegen_ssa::provide(providers);
Expand Down Expand Up @@ -885,7 +884,7 @@ fn analysis(tcx: TyCtxt<'_>, cnum: CrateNum) -> Result<()> {
},
{
time(sess, "lint checking", || {
lint::check_crate(tcx, || {
rustc_lint::check_crate(tcx, || {
rustc_lint::BuiltinCombinedLateLintPass::new()
});
});
Expand Down
Loading

0 comments on commit 79cf5e4

Please sign in to comment.