1
1
use std:: collections:: HashMap ;
2
2
3
- use fuse_ast:: { Atom , BindingPattern , BindingPatternKind , Chunk , Identifier , VariableDeclaration } ;
3
+ use fuse_ast:: { Atom , BindingPatternKind , Chunk , Function , Identifier , VariableDeclaration } ;
4
4
use fuse_common:: ReferenceType ;
5
- use fuse_visitor:: {
6
- walk_binding_pattern, walk_function, walk_variable_declaration, ScopeVisitor , Visitor ,
7
- } ;
5
+ use fuse_visitor:: { walk_function_mut, walk_variable_declaration_mut, ScopeVisitor , VisitorMut } ;
8
6
9
7
#[ derive( Debug , PartialEq , Clone , Copy ) ]
10
8
struct ScopeId ( ReferenceType ) ;
@@ -124,23 +122,21 @@ impl ScopeTree {
124
122
125
123
pub struct Semantic < ' ast > {
126
124
source : & ' ast str ,
127
- chunk : & ' ast Chunk ,
128
125
scope : ScopeTree ,
129
126
last_reference : ReferenceType ,
130
127
}
131
128
132
129
impl < ' ast > Semantic < ' ast > {
133
- pub fn new ( source : & ' ast str , chunk : & ' ast Chunk ) -> Self {
130
+ pub fn new ( source : & ' ast str ) -> Self {
134
131
Self {
135
132
source,
136
- chunk,
137
133
scope : ScopeTree :: root_scope ( ) ,
138
134
last_reference : 0 ,
139
135
}
140
136
}
141
137
142
- pub fn build ( mut self ) {
143
- self . visit_chunk ( & self . chunk )
138
+ pub fn build ( & mut self , chunk : & ' ast mut Chunk ) {
139
+ self . visit_chunk_mut ( chunk)
144
140
}
145
141
146
142
fn declare_identifier ( & mut self , ident : & Identifier ) {
@@ -159,31 +155,30 @@ impl<'ast> Semantic<'ast> {
159
155
}
160
156
}
161
157
162
- impl < ' ast > Visitor < ' ast > for Semantic < ' ast > {
163
- fn visit_identifier ( & mut self , ident : & Identifier ) {
164
- let refer = unsafe { ident. reference . as_ptr ( ) . as_ref ( ) } ;
165
- if refer. is_none ( ) {
158
+ impl < ' ast > VisitorMut < ' ast > for Semantic < ' ast > {
159
+ fn visit_identifier_mut ( & mut self , ident : & ' ast mut Identifier ) {
160
+ if ident. reference . get_mut ( ) . is_none ( ) {
166
161
self . reference_identifier ( ident) ;
167
162
}
168
163
}
169
164
170
- fn visit_variable_declaration ( & mut self , decl : & ' ast VariableDeclaration ) {
165
+ fn visit_variable_declaration_mut ( & mut self , decl : & ' ast mut VariableDeclaration ) {
171
166
match & decl. binding . kind {
172
167
BindingPatternKind :: Identifier ( bind) => self . declare_identifier ( & bind. identifier ) ,
173
168
_ => todo ! ( ) ,
174
169
}
175
170
176
- walk_variable_declaration ( self , decl)
171
+ walk_variable_declaration_mut ( self , decl)
177
172
}
178
173
179
- fn visit_function_declaration ( & mut self , decl : & ' ast fuse_ast :: Function ) {
174
+ fn visit_function_declaration_mut ( & mut self , decl : & ' ast mut Function ) {
180
175
let identifier = decl
181
176
. signature
182
177
. identifier
183
178
. as_ref ( )
184
179
. expect ( "All function declarations need an identifier." ) ;
185
180
self . declare_identifier ( identifier) ;
186
- walk_function ( self , decl)
181
+ walk_function_mut ( self , decl)
187
182
}
188
183
}
189
184
0 commit comments