about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorsinkuu <sinkuu@sinkuu.xyz>2017-10-23 17:22:28 +0900
committersinkuu <sinkuu@sinkuu.xyz>2017-10-23 17:41:25 +0900
commitc0ccab4c2330659b67edb5889d7f9ee702aebbe3 (patch)
tree8afd6e8b7447152b6f449ea35d296f78eb5c883f /src/libsyntax
parent1042190f8c18b93a8987c30c5bf97d7b9259638b (diff)
downloadrust-c0ccab4c2330659b67edb5889d7f9ee702aebbe3.tar.gz
rust-c0ccab4c2330659b67edb5889d7f9ee702aebbe3.zip
Fix #44851 by visiting tokens in `DefCollector` and `BuildReducedGraphVisitor`
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/visit.rs30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index 521c6030eba..7893145a4a7 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -27,6 +27,8 @@ use abi::Abi;
 use ast::*;
 use syntax_pos::Span;
 use codemap::Spanned;
+use parse::token::Token;
+use tokenstream::{TokenTree, TokenStream};
 
 #[derive(Copy, Clone, PartialEq, Eq)]
 pub enum FnKind<'a> {
@@ -130,7 +132,16 @@ pub trait Visitor<'ast>: Sized {
     fn visit_assoc_type_binding(&mut self, type_binding: &'ast TypeBinding) {
         walk_assoc_type_binding(self, type_binding)
     }
-    fn visit_attribute(&mut self, _attr: &'ast Attribute) {}
+    fn visit_attribute(&mut self, attr: &'ast Attribute) {
+        walk_attribute(self, attr)
+    }
+    fn visit_tt(&mut self, tt: TokenTree) {
+        walk_tt(self, tt)
+    }
+    fn visit_tts(&mut self, tts: TokenStream) {
+        walk_tts(self, tts)
+    }
+    fn visit_token(&mut self, _t: Token) {}
     fn visit_vis(&mut self, vis: &'ast Visibility) {
         walk_vis(self, vis)
     }
@@ -810,3 +821,20 @@ pub fn walk_vis<'a, V: Visitor<'a>>(visitor: &mut V, vis: &'a Visibility) {
         visitor.visit_path(path, id);
     }
 }
+
+pub fn walk_attribute<'a, V: Visitor<'a>>(visitor: &mut V, attr: &'a Attribute) {
+    visitor.visit_tts(attr.tokens.clone());
+}
+
+pub fn walk_tt<'a, V: Visitor<'a>>(visitor: &mut V, tt: TokenTree) {
+    match tt {
+        TokenTree::Token(_, tok) => visitor.visit_token(tok),
+        TokenTree::Delimited(_, delimed) => visitor.visit_tts(delimed.stream()),
+    }
+}
+
+pub fn walk_tts<'a, V: Visitor<'a>>(visitor: &mut V, tts: TokenStream) {
+    for tt in tts.trees() {
+        visitor.visit_tt(tt);
+    }
+}