Skip to content

Commit ee8cf6a

Browse files
committed
refactor(inference): rename semantic crate to inference.
1 parent 5fb255d commit ee8cf6a

File tree

5 files changed

+33
-26
lines changed

5 files changed

+33
-26
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fuse_codegen = { version = "0.0.0", path = "crates/fuse-codegen" }
1717
fuse_common = { version = "0.0.0", path = "crates/fuse-common" }
1818
fuse_common_proc = { version = "0.0.0", path = "crates/fuse-common-proc" }
1919
fuse_parser = { version = "0.0.0", path = "crates/fuse-parser" }
20-
fuse_semantic = { version = "0.0.0", path = "crates/fuse-semantic" }
20+
fuse_inference = { version = "0.0.0", path = "crates/fuse-inference" }
2121
fuse_visitor = { version = "0.0.0", path = "crates/fuse-visitor" }
2222
fusec = { version = "0.0.0", path = "crates/fusec" }
2323

crates/fuse-semantic/Cargo.toml crates/fuse-inference/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[package]
2-
name = "fuse_semantic"
2+
name = "fuse_inference"
33
version = "0.0.0"
44
description.workspace = true
55
authors.workspace = true

crates/fuse-semantic/src/lib.rs crates/fuse-inference/src/lib.rs

+24-13
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
use std::collections::HashMap;
22

3-
use fuse_ast::{Atom, BindingPatternKind, Chunk, Function, Identifier, VariableDeclaration};
3+
use fuse_ast::{
4+
Atom, BindingPatternKind, CallExpression, Chunk, Function, Identifier, VariableDeclaration,
5+
};
46
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+
};
611

712
#[derive(Debug, PartialEq, Clone, Copy)]
813
struct ScopeId(ReferenceType);
@@ -120,13 +125,13 @@ impl ScopeTree {
120125
}
121126
}
122127

123-
pub struct Semantic<'ast> {
128+
pub struct Inference<'ast> {
124129
source: &'ast str,
125130
scope: ScopeTree,
126131
last_reference: ReferenceType,
127132
}
128133

129-
impl<'ast> Semantic<'ast> {
134+
impl<'ast> Inference<'ast> {
130135
pub fn new(source: &'ast str) -> Self {
131136
Self {
132137
source,
@@ -135,8 +140,11 @@ impl<'ast> Semantic<'ast> {
135140
}
136141
}
137142

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+
}
140148
}
141149

142150
fn declare_identifier(&mut self, ident: &Identifier) {
@@ -147,15 +155,12 @@ impl<'ast> Semantic<'ast> {
147155
}
148156

149157
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)
155160
}
156161
}
157162

158-
impl<'ast> VisitorMut<'ast> for Semantic<'ast> {
163+
impl<'ast> VisitorMut<'ast> for Inference<'ast> {
159164
fn visit_identifier_mut(&mut self, ident: &'ast mut Identifier) {
160165
if ident.reference.get_mut().is_none() {
161166
self.reference_identifier(ident);
@@ -182,7 +187,7 @@ impl<'ast> VisitorMut<'ast> for Semantic<'ast> {
182187
}
183188
}
184189

185-
impl<'ast> ScopeVisitor for Semantic<'ast> {
190+
impl<'ast> ScopeVisitor for Inference<'ast> {
186191
fn enter_scope(&mut self) {
187192
self.scope.push_stack();
188193
}
@@ -191,3 +196,9 @@ impl<'ast> ScopeVisitor for Semantic<'ast> {
191196
self.scope.pop_stack();
192197
}
193198
}
199+
200+
pub struct InferenceResult {
201+
pub errors: Vec<InferenceError>,
202+
}
203+
204+
pub struct InferenceError {}

crates/fusec/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ edition.workspace = true
99

1010
[dependencies]
1111
fuse_parser = { workspace = true }
12-
fuse_semantic = { workspace = true }
12+
fuse_inference = { workspace = true }

crates/fusec/src/lib.rs

+6-10
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
11
use fuse_parser::Parser;
2-
use fuse_semantic::Semantic;
2+
use fuse_inference::Inference;
33

44
fn compile_chunk(source: &str) {
55
let parsed = Parser::new(source).parse();
6+
assert!(!parsed.paniced);
7+
assert!(parsed.errors.len() == 0);
68
let mut chunk = parsed.chunk.unwrap();
7-
let semantic = Semantic::new(source).build(&mut chunk);
9+
let inference = Inference::new(source).resolve(&mut chunk);
810
// panic!("{:#?}", chunk)
911
}
1012

1113
#[test]
1214
fn manual_test() {
1315
compile_chunk(
1416
r#"
15-
let z = 123
16-
let x = 123
17-
let y = x
18-
fn x()
19-
let x = y
20-
end
21-
22-
x()
17+
let a = 0
18+
let d = a.b.c
2319
"#,
2420
)
2521
}

0 commit comments

Comments
 (0)