diff options
| author | bors <bors@rust-lang.org> | 2017-10-26 04:32:16 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-10-26 04:32:16 +0000 |
| commit | 56dc171a2f2dc2373b1930f71140a354fa84b982 (patch) | |
| tree | 661192bf832814b7238b5cf5bf3785a2cf7a3ed7 /src/libsyntax | |
| parent | fa29bcedd1163f2b9db9fbc6c59e429374fbdfd3 (diff) | |
| parent | 9f1a8bf318fb378cc928eee477515ab026004eb1 (diff) | |
| download | rust-56dc171a2f2dc2373b1930f71140a354fa84b982.tar.gz rust-56dc171a2f2dc2373b1930f71140a354fa84b982.zip | |
Auto merge of #45464 - sinkuu:ice_44851, r=jseyfried
Visit attribute tokens in `DefCollector` and `BuildReducedGraphVisitor` Fixes #44851.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/visit.rs | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 078a63cba20..4198055f670 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,17 @@ 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) {} + // FIXME: add `visit_interpolated` and `walk_interpolated` fn visit_vis(&mut self, vis: &'ast Visibility) { walk_vis(self, vis) } @@ -810,3 +822,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); + } +} |
