@@ -11,13 +11,7 @@ use super::{AttrVec, Attribute, Stmt, StmtKind};
1111pub trait AstLike : Sized {
1212 fn attrs ( & self ) -> & [ Attribute ] ;
1313 fn visit_attrs ( & mut self , f : impl FnOnce ( & mut Vec < Attribute > ) ) ;
14- /// Called by `Parser::collect_tokens` to store the collected
15- /// tokens inside an AST node
16- fn finalize_tokens ( & mut self , _tokens : LazyTokenStream ) {
17- // This default impl makes this trait easier to implement
18- // in tools like `rust-analyzer`
19- panic ! ( "`finalize_tokens` is not supported!" )
20- }
14+ fn tokens_mut ( & mut self ) -> Option < & mut Option < LazyTokenStream > > ;
2115}
2216
2317impl < T : AstLike + ' static > AstLike for P < T > {
@@ -27,8 +21,8 @@ impl<T: AstLike + 'static> AstLike for P<T> {
2721 fn visit_attrs ( & mut self , f : impl FnOnce ( & mut Vec < Attribute > ) ) {
2822 ( * * self ) . visit_attrs ( f) ;
2923 }
30- fn finalize_tokens ( & mut self , tokens : LazyTokenStream ) {
31- ( * * self ) . finalize_tokens ( tokens )
24+ fn tokens_mut ( & mut self ) -> Option < & mut Option < LazyTokenStream > > {
25+ ( * * self ) . tokens_mut ( )
3226 }
3327}
3428
@@ -42,12 +36,12 @@ fn visit_attrvec(attrs: &mut AttrVec, f: impl FnOnce(&mut Vec<Attribute>)) {
4236
4337impl AstLike for StmtKind {
4438 fn attrs ( & self ) -> & [ Attribute ] {
45- match * self {
46- StmtKind :: Local ( ref local) => local. attrs ( ) ,
47- StmtKind :: Expr ( ref expr) | StmtKind :: Semi ( ref expr) => expr. attrs ( ) ,
48- StmtKind :: Item ( ref item) => item. attrs ( ) ,
39+ match self {
40+ StmtKind :: Local ( local) => local. attrs ( ) ,
41+ StmtKind :: Expr ( expr) | StmtKind :: Semi ( expr) => expr. attrs ( ) ,
42+ StmtKind :: Item ( item) => item. attrs ( ) ,
4943 StmtKind :: Empty => & [ ] ,
50- StmtKind :: MacCall ( ref mac) => & * mac. attrs ,
44+ StmtKind :: MacCall ( mac) => & mac. attrs ,
5145 }
5246 }
5347
@@ -60,17 +54,14 @@ impl AstLike for StmtKind {
6054 StmtKind :: MacCall ( mac) => visit_attrvec ( & mut mac. attrs , f) ,
6155 }
6256 }
63- fn finalize_tokens ( & mut self , tokens : LazyTokenStream ) {
64- let stmt_tokens = match self {
65- StmtKind :: Local ( ref mut local) => & mut local. tokens ,
66- StmtKind :: Item ( ref mut item) => & mut item. tokens ,
67- StmtKind :: Expr ( ref mut expr) | StmtKind :: Semi ( ref mut expr) => & mut expr. tokens ,
68- StmtKind :: Empty => return ,
69- StmtKind :: MacCall ( ref mut mac) => & mut mac. tokens ,
70- } ;
71- if stmt_tokens. is_none ( ) {
72- * stmt_tokens = Some ( tokens) ;
73- }
57+ fn tokens_mut ( & mut self ) -> Option < & mut Option < LazyTokenStream > > {
58+ Some ( match self {
59+ StmtKind :: Local ( local) => & mut local. tokens ,
60+ StmtKind :: Item ( item) => & mut item. tokens ,
61+ StmtKind :: Expr ( expr) | StmtKind :: Semi ( expr) => & mut expr. tokens ,
62+ StmtKind :: Empty => return None ,
63+ StmtKind :: MacCall ( mac) => & mut mac. tokens ,
64+ } )
7465 }
7566}
7667
@@ -82,8 +73,8 @@ impl AstLike for Stmt {
8273 fn visit_attrs ( & mut self , f : impl FnOnce ( & mut Vec < Attribute > ) ) {
8374 self . kind . visit_attrs ( f) ;
8475 }
85- fn finalize_tokens ( & mut self , tokens : LazyTokenStream ) {
86- self . kind . finalize_tokens ( tokens )
76+ fn tokens_mut ( & mut self ) -> Option < & mut Option < LazyTokenStream > > {
77+ self . kind . tokens_mut ( )
8778 }
8879}
8980
@@ -92,17 +83,13 @@ impl AstLike for Attribute {
9283 & [ ]
9384 }
9485 fn visit_attrs ( & mut self , _f : impl FnOnce ( & mut Vec < Attribute > ) ) { }
95- fn finalize_tokens ( & mut self , tokens : LazyTokenStream ) {
96- match & mut self . kind {
97- AttrKind :: Normal ( _, attr_tokens) => {
98- if attr_tokens. is_none ( ) {
99- * attr_tokens = Some ( tokens) ;
100- }
86+ fn tokens_mut ( & mut self ) -> Option < & mut Option < LazyTokenStream > > {
87+ Some ( match & mut self . kind {
88+ AttrKind :: Normal ( _, tokens) => tokens,
89+ kind @ AttrKind :: DocComment ( ..) => {
90+ panic ! ( "Called tokens_mut on doc comment attr {:?}" , kind)
10191 }
102- AttrKind :: DocComment ( ..) => {
103- panic ! ( "Called finalize_tokens on doc comment attr {:?}" , self )
104- }
105- }
92+ } )
10693 }
10794}
10895
@@ -115,10 +102,8 @@ impl<T: AstLike> AstLike for Option<T> {
115102 inner. visit_attrs ( f) ;
116103 }
117104 }
118- fn finalize_tokens ( & mut self , tokens : LazyTokenStream ) {
119- if let Some ( inner) = self {
120- inner. finalize_tokens ( tokens) ;
121- }
105+ fn tokens_mut ( & mut self ) -> Option < & mut Option < LazyTokenStream > > {
106+ self . as_mut ( ) . and_then ( |inner| inner. tokens_mut ( ) )
122107 }
123108}
124109
@@ -152,11 +137,8 @@ macro_rules! derive_has_tokens_and_attrs {
152137 VecOrAttrVec :: visit( & mut self . attrs, f)
153138 }
154139
155- fn finalize_tokens( & mut self , tokens: LazyTokenStream ) {
156- if self . tokens. is_none( ) {
157- self . tokens = Some ( tokens) ;
158- }
159-
140+ fn tokens_mut( & mut self ) -> Option <& mut Option <LazyTokenStream >> {
141+ Some ( & mut self . tokens)
160142 }
161143 }
162144 ) * }
@@ -173,7 +155,9 @@ macro_rules! derive_has_attrs_no_tokens {
173155 VecOrAttrVec :: visit( & mut self . attrs, f)
174156 }
175157
176- fn finalize_tokens( & mut self , _tokens: LazyTokenStream ) { }
158+ fn tokens_mut( & mut self ) -> Option <& mut Option <LazyTokenStream >> {
159+ None
160+ }
177161 }
178162 ) * }
179163}
@@ -185,14 +169,10 @@ macro_rules! derive_has_tokens_no_attrs {
185169 & [ ]
186170 }
187171
188- fn visit_attrs( & mut self , _f: impl FnOnce ( & mut Vec <Attribute >) ) {
189- }
190-
191- fn finalize_tokens( & mut self , tokens: LazyTokenStream ) {
192- if self . tokens. is_none( ) {
193- self . tokens = Some ( tokens) ;
194- }
172+ fn visit_attrs( & mut self , _f: impl FnOnce ( & mut Vec <Attribute >) ) { }
195173
174+ fn tokens_mut( & mut self ) -> Option <& mut Option <LazyTokenStream >> {
175+ Some ( & mut self . tokens)
196176 }
197177 }
198178 ) * }
0 commit comments