From 24545128ebf7e19536e1384f64b89a18742471b0 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Mon, 7 Oct 2019 18:10:41 -0400 Subject: [PATCH] Take lint passes as constructor functions --- src/librustc/lint/context.rs | 16 ++++++++-------- src/librustc_lint/lib.rs | 9 ++++----- src/librustc_plugin/registry.rs | 8 ++++---- src/test/ui-fulldeps/auxiliary/lint-for-crate.rs | 3 ++- .../lint_pass_impl_without_macro.stderr | 1 + 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs index 373ee2568a47..73d8bb11b719 100644 --- a/src/librustc/lint/context.rs +++ b/src/librustc/lint/context.rs @@ -168,20 +168,20 @@ impl LintStore { .collect() } - pub fn register_early_pass(&mut self, pass: EarlyLintPassObject) { - self.early_passes.as_mut().unwrap().push(pass); + pub fn register_early_pass(&mut self, pass: fn() -> EarlyLintPassObject) { + self.early_passes.as_mut().unwrap().push((pass)()); } - pub fn register_pre_expansion_pass(&mut self, pass: EarlyLintPassObject) { - self.pre_expansion_passes.as_mut().unwrap().push(pass); + pub fn register_pre_expansion_pass(&mut self, pass: fn() -> EarlyLintPassObject) { + self.pre_expansion_passes.as_mut().unwrap().push((pass)()); } - pub fn register_late_pass(&mut self, pass: LateLintPassObject) { - self.late_passes.lock().as_mut().unwrap().push(pass); + pub fn register_late_pass(&mut self, pass: fn() -> LateLintPassObject) { + self.late_passes.lock().as_mut().unwrap().push((pass)()); } - pub fn register_late_mod_pass(&mut self, pass: LateLintPassObject) { - self.late_module_passes.push(pass); + pub fn register_late_mod_pass(&mut self, pass: fn() -> LateLintPassObject) { + self.late_module_passes.push((pass)()); } // Helper method for register_early/late_pass diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index 752396188afd..0026c2317d15 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -205,9 +205,8 @@ pub fn register_builtins(store: &mut lint::LintStore, no_interleave_lints: bool) macro_rules! register_pass { ($method:ident, $ty:ident, $constructor:expr) => ( - let obj = box $constructor; store.register_lints(&$ty::get_lints()); - store.$method(obj); + store.$method(|| box $constructor); ) } @@ -487,11 +486,11 @@ pub fn register_builtins(store: &mut lint::LintStore, no_interleave_lints: bool) pub fn register_internals(store: &mut lint::LintStore) { store.register_lints(&DefaultHashTypes::get_lints()); - store.register_early_pass(box DefaultHashTypes::new()); + store.register_early_pass(|| box DefaultHashTypes::new()); store.register_lints(&LintPassImpl::get_lints()); - store.register_early_pass(box LintPassImpl); + store.register_early_pass(|| box LintPassImpl); store.register_lints(&TyTyKind::get_lints()); - store.register_late_pass(box TyTyKind); + store.register_late_pass(|| box TyTyKind); store.register_group( false, "rustc::internal", diff --git a/src/librustc_plugin/registry.rs b/src/librustc_plugin/registry.rs index a8076b57c86a..44318bf06aaa 100644 --- a/src/librustc_plugin/registry.rs +++ b/src/librustc_plugin/registry.rs @@ -36,10 +36,10 @@ pub struct Registry<'a> { pub syntax_exts: Vec, #[doc(hidden)] - pub early_lint_passes: Vec, + pub early_lint_passes: Vec EarlyLintPassObject>, #[doc(hidden)] - pub late_lint_passes: Vec, + pub late_lint_passes: Vec LateLintPassObject>, #[doc(hidden)] pub lints: Vec<&'static Lint>, @@ -109,12 +109,12 @@ impl<'a> Registry<'a> { } /// Register a compiler lint pass. - pub fn register_early_lint_pass(&mut self, lint_pass: EarlyLintPassObject) { + pub fn register_early_lint_pass(&mut self, lint_pass: fn() -> EarlyLintPassObject) { self.early_lint_passes.push(lint_pass); } /// Register a compiler lint pass. - pub fn register_late_lint_pass(&mut self, lint_pass: LateLintPassObject) { + pub fn register_late_lint_pass(&mut self, lint_pass: fn() -> LateLintPassObject) { self.late_lint_passes.push(lint_pass); } /// Register a lint group. diff --git a/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs b/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs index 000e10392e82..ba5b5d1906ae 100644 --- a/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs +++ b/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs @@ -32,5 +32,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass { #[plugin_registrar] pub fn plugin_registrar(reg: &mut Registry) { - reg.register_late_lint_pass(box Pass); + reg.register_lint(&[&CRATE_NOT_OKAY]); + reg.register_late_lint_pass(|| box Pass); } diff --git a/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.stderr b/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.stderr index b7cff343395e..0dbdf4f5aa9e 100644 --- a/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.stderr +++ b/src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.stderr @@ -23,3 +23,4 @@ LL | custom_lint_pass_macro!(); = help: try using `declare_lint_pass!` or `impl_lint_pass!` instead error: aborting due to 2 previous errors +