about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2019-10-07 18:10:41 -0400
committerMark Rousskov <mark.simulacrum@gmail.com>2019-10-17 19:16:41 -0400
commit24545128ebf7e19536e1384f64b89a18742471b0 (patch)
tree8d73444f13a19ba82065f161899a1cfca6a219c0
parent7fef39791a093681c59f08181f96a0a2d63ab981 (diff)
downloadrust-24545128ebf7e19536e1384f64b89a18742471b0.tar.gz
rust-24545128ebf7e19536e1384f64b89a18742471b0.zip
Take lint passes as constructor functions
-rw-r--r--src/librustc/lint/context.rs16
-rw-r--r--src/librustc_lint/lib.rs9
-rw-r--r--src/librustc_plugin/registry.rs8
-rw-r--r--src/test/ui-fulldeps/auxiliary/lint-for-crate.rs3
-rw-r--r--src/test/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.stderr1
5 files changed, 19 insertions, 18 deletions
diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs
index 373ee2568a4..73d8bb11b71 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 752396188af..0026c2317d1 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 a8076b57c86..44318bf06aa 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<NamedSyntaxExtension>,
 
     #[doc(hidden)]
-    pub early_lint_passes: Vec<EarlyLintPassObject>,
+    pub early_lint_passes: Vec<fn() -> EarlyLintPassObject>,
 
     #[doc(hidden)]
-    pub late_lint_passes: Vec<LateLintPassObject>,
+    pub late_lint_passes: Vec<fn() -> 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 000e10392e8..ba5b5d1906a 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 b7cff343395..0dbdf4f5aa9 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
+