@@ -11,13 +11,7 @@ use super::{AttrVec, Attribute, Stmt, StmtKind};
11
11
pub trait AstLike : Sized {
12
12
fn attrs ( & self ) -> & [ Attribute ] ;
13
13
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 > > ;
21
15
}
22
16
23
17
impl < T : AstLike + ' static > AstLike for P < T > {
@@ -27,8 +21,8 @@ impl<T: AstLike + 'static> AstLike for P<T> {
27
21
fn visit_attrs ( & mut self , f : impl FnOnce ( & mut Vec < Attribute > ) ) {
28
22
( * * self ) . visit_attrs ( f) ;
29
23
}
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 ( )
32
26
}
33
27
}
34
28
@@ -42,12 +36,12 @@ fn visit_attrvec(attrs: &mut AttrVec, f: impl FnOnce(&mut Vec<Attribute>)) {
42
36
43
37
impl AstLike for StmtKind {
44
38
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 ( ) ,
49
43
StmtKind :: Empty => & [ ] ,
50
- StmtKind :: MacCall ( ref mac) => & * mac. attrs ,
44
+ StmtKind :: MacCall ( mac) => & mac. attrs ,
51
45
}
52
46
}
53
47
@@ -60,17 +54,14 @@ impl AstLike for StmtKind {
60
54
StmtKind :: MacCall ( mac) => visit_attrvec ( & mut mac. attrs , f) ,
61
55
}
62
56
}
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
+ } )
74
65
}
75
66
}
76
67
@@ -82,8 +73,8 @@ impl AstLike for Stmt {
82
73
fn visit_attrs ( & mut self , f : impl FnOnce ( & mut Vec < Attribute > ) ) {
83
74
self . kind . visit_attrs ( f) ;
84
75
}
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 ( )
87
78
}
88
79
}
89
80
@@ -92,17 +83,13 @@ impl AstLike for Attribute {
92
83
& [ ]
93
84
}
94
85
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)
101
91
}
102
- AttrKind :: DocComment ( ..) => {
103
- panic ! ( "Called finalize_tokens on doc comment attr {:?}" , self )
104
- }
105
- }
92
+ } )
106
93
}
107
94
}
108
95
@@ -115,10 +102,8 @@ impl<T: AstLike> AstLike for Option<T> {
115
102
inner. visit_attrs ( f) ;
116
103
}
117
104
}
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 ( ) )
122
107
}
123
108
}
124
109
@@ -152,11 +137,8 @@ macro_rules! derive_has_tokens_and_attrs {
152
137
VecOrAttrVec :: visit( & mut self . attrs, f)
153
138
}
154
139
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)
160
142
}
161
143
}
162
144
) * }
@@ -173,7 +155,9 @@ macro_rules! derive_has_attrs_no_tokens {
173
155
VecOrAttrVec :: visit( & mut self . attrs, f)
174
156
}
175
157
176
- fn finalize_tokens( & mut self , _tokens: LazyTokenStream ) { }
158
+ fn tokens_mut( & mut self ) -> Option <& mut Option <LazyTokenStream >> {
159
+ None
160
+ }
177
161
}
178
162
) * }
179
163
}
@@ -185,14 +169,10 @@ macro_rules! derive_has_tokens_no_attrs {
185
169
& [ ]
186
170
}
187
171
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 >) ) { }
195
173
174
+ fn tokens_mut( & mut self ) -> Option <& mut Option <LazyTokenStream >> {
175
+ Some ( & mut self . tokens)
196
176
}
197
177
}
198
178
) * }
0 commit comments