diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-10-02 11:29:29 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-10-03 10:25:14 -0700 |
| commit | c0388cd69166f22c818eab21c40c0a37cc1d70a8 (patch) | |
| tree | 17b06ba76cdf19081d05e0655d3c5cb60d014fb3 /src/libsyntax/ast_util.rs | |
| parent | ccd9a963f75074da506c05fece1e3c965e742c51 (diff) | |
| download | rust-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.rs | 40 |
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, |
