1
1
use std:: collections:: HashMap ;
2
2
3
- use fuse_ast:: { Atom , BindingPatternKind , Chunk , Function , Identifier , VariableDeclaration } ;
3
+ use fuse_ast:: {
4
+ Atom , BindingPatternKind , CallExpression , Chunk , Function , Identifier , VariableDeclaration ,
5
+ } ;
4
6
use fuse_common:: ReferenceType ;
5
- use fuse_visitor:: { walk_function_mut, walk_variable_declaration_mut, ScopeVisitor , VisitorMut } ;
7
+ use fuse_visitor:: {
8
+ walk_call_expression_mut, walk_function_mut, walk_variable_declaration_mut, ScopeVisitor ,
9
+ VisitorMut ,
10
+ } ;
6
11
7
12
#[ derive( Debug , PartialEq , Clone , Copy ) ]
8
13
struct ScopeId ( ReferenceType ) ;
@@ -120,13 +125,13 @@ impl ScopeTree {
120
125
}
121
126
}
122
127
123
- pub struct Semantic < ' ast > {
128
+ pub struct Inference < ' ast > {
124
129
source : & ' ast str ,
125
130
scope : ScopeTree ,
126
131
last_reference : ReferenceType ,
127
132
}
128
133
129
- impl < ' ast > Semantic < ' ast > {
134
+ impl < ' ast > Inference < ' ast > {
130
135
pub fn new ( source : & ' ast str ) -> Self {
131
136
Self {
132
137
source,
@@ -135,8 +140,11 @@ impl<'ast> Semantic<'ast> {
135
140
}
136
141
}
137
142
138
- pub fn build ( & mut self , chunk : & ' ast mut Chunk ) {
139
- self . visit_chunk_mut ( chunk)
143
+ pub fn resolve ( & mut self , chunk : & ' ast mut Chunk ) -> InferenceResult {
144
+ self . visit_chunk_mut ( chunk) ;
145
+ InferenceResult {
146
+ errors : Vec :: default ( ) ,
147
+ }
140
148
}
141
149
142
150
fn declare_identifier ( & mut self , ident : & Identifier ) {
@@ -147,15 +155,12 @@ impl<'ast> Semantic<'ast> {
147
155
}
148
156
149
157
fn reference_identifier ( & mut self , ident : & Identifier ) {
150
- let reference = self
151
- . scope
152
- . identifier_reference ( & ident. name )
153
- . expect ( "Reference to undefined identifier." ) ;
154
- ident. reference . set ( Some ( reference) )
158
+ let reference = self . scope . identifier_reference ( & ident. name ) ;
159
+ ident. reference . set ( reference)
155
160
}
156
161
}
157
162
158
- impl < ' ast > VisitorMut < ' ast > for Semantic < ' ast > {
163
+ impl < ' ast > VisitorMut < ' ast > for Inference < ' ast > {
159
164
fn visit_identifier_mut ( & mut self , ident : & ' ast mut Identifier ) {
160
165
if ident. reference . get_mut ( ) . is_none ( ) {
161
166
self . reference_identifier ( ident) ;
@@ -182,7 +187,7 @@ impl<'ast> VisitorMut<'ast> for Semantic<'ast> {
182
187
}
183
188
}
184
189
185
- impl < ' ast > ScopeVisitor for Semantic < ' ast > {
190
+ impl < ' ast > ScopeVisitor for Inference < ' ast > {
186
191
fn enter_scope ( & mut self ) {
187
192
self . scope . push_stack ( ) ;
188
193
}
@@ -191,3 +196,9 @@ impl<'ast> ScopeVisitor for Semantic<'ast> {
191
196
self . scope . pop_stack ( ) ;
192
197
}
193
198
}
199
+
200
+ pub struct InferenceResult {
201
+ pub errors : Vec < InferenceError > ,
202
+ }
203
+
204
+ pub struct InferenceError { }
0 commit comments