Skip to content

Commit 5fb255d

Browse files
committed
refactor(semantic): make semantic VisitorMut
1 parent 0f4cf4c commit 5fb255d

File tree

2 files changed

+18
-21
lines changed

2 files changed

+18
-21
lines changed

crates/fuse-semantic/src/lib.rs

+12-17
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
use std::collections::HashMap;
22

3-
use fuse_ast::{Atom, BindingPattern, BindingPatternKind, Chunk, Identifier, VariableDeclaration};
3+
use fuse_ast::{Atom, BindingPatternKind, Chunk, Function, Identifier, VariableDeclaration};
44
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};
86

97
#[derive(Debug, PartialEq, Clone, Copy)]
108
struct ScopeId(ReferenceType);
@@ -124,23 +122,21 @@ impl ScopeTree {
124122

125123
pub struct Semantic<'ast> {
126124
source: &'ast str,
127-
chunk: &'ast Chunk,
128125
scope: ScopeTree,
129126
last_reference: ReferenceType,
130127
}
131128

132129
impl<'ast> Semantic<'ast> {
133-
pub fn new(source: &'ast str, chunk: &'ast Chunk) -> Self {
130+
pub fn new(source: &'ast str) -> Self {
134131
Self {
135132
source,
136-
chunk,
137133
scope: ScopeTree::root_scope(),
138134
last_reference: 0,
139135
}
140136
}
141137

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)
144140
}
145141

146142
fn declare_identifier(&mut self, ident: &Identifier) {
@@ -159,31 +155,30 @@ impl<'ast> Semantic<'ast> {
159155
}
160156
}
161157

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() {
166161
self.reference_identifier(ident);
167162
}
168163
}
169164

170-
fn visit_variable_declaration(&mut self, decl: &'ast VariableDeclaration) {
165+
fn visit_variable_declaration_mut(&mut self, decl: &'ast mut VariableDeclaration) {
171166
match &decl.binding.kind {
172167
BindingPatternKind::Identifier(bind) => self.declare_identifier(&bind.identifier),
173168
_ => todo!(),
174169
}
175170

176-
walk_variable_declaration(self, decl)
171+
walk_variable_declaration_mut(self, decl)
177172
}
178173

179-
fn visit_function_declaration(&mut self, decl: &'ast fuse_ast::Function) {
174+
fn visit_function_declaration_mut(&mut self, decl: &'ast mut Function) {
180175
let identifier = decl
181176
.signature
182177
.identifier
183178
.as_ref()
184179
.expect("All function declarations need an identifier.");
185180
self.declare_identifier(identifier);
186-
walk_function(self, decl)
181+
walk_function_mut(self, decl)
187182
}
188183
}
189184

crates/fusec/src/lib.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ use fuse_semantic::Semantic;
33

44
fn compile_chunk(source: &str) {
55
let parsed = Parser::new(source).parse();
6-
let chunk = parsed.chunk.unwrap();
7-
let semantic = Semantic::new(source, &chunk).build();
6+
let mut chunk = parsed.chunk.unwrap();
7+
let semantic = Semantic::new(source).build(&mut chunk);
88
// panic!("{:#?}", chunk)
99
}
1010

1111
#[test]
1212
fn manual_test() {
13-
compile_chunk(r#"
13+
compile_chunk(
14+
r#"
1415
let z = 123
1516
let x = 123
1617
let y = x
@@ -19,5 +20,6 @@ fn manual_test() {
1920
end
2021
2122
x()
22-
"#)
23+
"#,
24+
)
2325
}

0 commit comments

Comments
 (0)