about summary refs log tree commit diff
path: root/src/libsyntax/ast_util.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-10-02 11:29:29 -0700
committerAlex Crichton <alex@alexcrichton.com>2013-10-03 10:25:14 -0700
commitc0388cd69166f22c818eab21c40c0a37cc1d70a8 (patch)
tree17b06ba76cdf19081d05e0655d3c5cb60d014fb3 /src/libsyntax/ast_util.rs
parentccd9a963f75074da506c05fece1e3c965e742c51 (diff)
downloadrust-c0388cd69166f22c818eab21c40c0a37cc1d70a8.tar.gz
rust-c0388cd69166f22c818eab21c40c0a37cc1d70a8.zip
Rewrite lint passes with less visitor cruft
This purges about 500 lines of visitor cruft from lint passes. All lints are
handled in a much more sane way at this point. The other huge bonus of this
commit is that there are no more @-boxes in the lint passes, fixing the 500MB
memory regression seen when the lint passes were refactored.

Closes #8589
Diffstat (limited to 'src/libsyntax/ast_util.rs')
-rw-r--r--src/libsyntax/ast_util.rs40
1 files changed, 17 insertions, 23 deletions
diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs
index e697368009c..2c01f246c5f 100644
--- a/src/libsyntax/ast_util.rs
+++ b/src/libsyntax/ast_util.rs
@@ -397,27 +397,17 @@ impl id_range {
     }
 }
 
-pub fn id_visitor(operation: @IdVisitingOperation, pass_through_items: bool)
-                  -> @mut Visitor<()> {
-    let visitor = @mut IdVisitor {
-        operation: operation,
-        pass_through_items: pass_through_items,
-        visited_outermost: false,
-    };
-    visitor as @mut Visitor<()>
-}
-
 pub trait IdVisitingOperation {
     fn visit_id(&self, node_id: NodeId);
 }
 
-pub struct IdVisitor {
-    operation: @IdVisitingOperation,
+pub struct IdVisitor<'self, O> {
+    operation: &'self O,
     pass_through_items: bool,
     visited_outermost: bool,
 }
 
-impl IdVisitor {
+impl<'self, O: IdVisitingOperation> IdVisitor<'self, O> {
     fn visit_generics_helper(&self, generics: &Generics) {
         for type_parameter in generics.ty_params.iter() {
             self.operation.visit_id(type_parameter.id)
@@ -428,7 +418,7 @@ impl IdVisitor {
     }
 }
 
-impl Visitor<()> for IdVisitor {
+impl<'self, O: IdVisitingOperation> Visitor<()> for IdVisitor<'self, O> {
     fn visit_mod(&mut self,
                  module: &_mod,
                  _: Span,
@@ -601,10 +591,18 @@ impl Visitor<()> for IdVisitor {
         struct_def.ctor_id.map(|&ctor_id| self.operation.visit_id(ctor_id));
         visit::walk_struct_def(self, struct_def, ident, generics, id, ());
     }
+
+    fn visit_trait_method(&mut self, tm: &ast::trait_method, _: ()) {
+        match *tm {
+            ast::required(ref m) => self.operation.visit_id(m.id),
+            ast::provided(ref m) => self.operation.visit_id(m.id),
+        }
+        visit::walk_trait_method(self, tm, ());
+    }
 }
 
-pub fn visit_ids_for_inlined_item(item: &inlined_item,
-                                  operation: @IdVisitingOperation) {
+pub fn visit_ids_for_inlined_item<O: IdVisitingOperation>(item: &inlined_item,
+                                                          operation: &O) {
     let mut id_visitor = IdVisitor {
         operation: operation,
         pass_through_items: true,
@@ -623,18 +621,14 @@ impl IdVisitingOperation for IdRangeComputingVisitor {
     }
 }
 
-pub fn compute_id_range(visit_ids_fn: &fn(@IdVisitingOperation)) -> id_range {
+pub fn compute_id_range_for_inlined_item(item: &inlined_item) -> id_range {
     let result = @mut id_range::max();
-    visit_ids_fn(@IdRangeComputingVisitor {
+    visit_ids_for_inlined_item(item, &IdRangeComputingVisitor {
         result: result,
-    } as @IdVisitingOperation);
+    });
     *result
 }
 
-pub fn compute_id_range_for_inlined_item(item: &inlined_item) -> id_range {
-    compute_id_range(|f| visit_ids_for_inlined_item(item, f))
-}
-
 pub fn is_item_impl(item: @ast::item) -> bool {
     match item.node {
        item_impl(*) => true,