Skip to content

Commit

Permalink
feat(visitor): add ScopeVisitor for handling scopes.
Browse files Browse the repository at this point in the history
  • Loading branch information
rzvxa committed Mar 11, 2024
1 parent 5142daf commit 0f4cf4c
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 23 deletions.
22 changes: 13 additions & 9 deletions crates/fuse-semantic/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ use std::collections::HashMap;

use fuse_ast::{Atom, BindingPattern, BindingPatternKind, Chunk, Identifier, VariableDeclaration};
use fuse_common::ReferenceType;
use fuse_visitor::{walk_binding_pattern, walk_function, walk_variable_declaration, Visitor};
use fuse_visitor::{
walk_binding_pattern, walk_function, walk_variable_declaration, ScopeVisitor, Visitor,
};

#[derive(Debug, PartialEq, Clone, Copy)]
struct ScopeId(ReferenceType);
Expand Down Expand Up @@ -158,14 +160,6 @@ impl<'ast> Semantic<'ast> {
}

impl<'ast> Visitor<'ast> for Semantic<'ast> {
fn enter_scope(&mut self) {
self.scope.push_stack();
}

fn leave_scope(&mut self) {
self.scope.pop_stack();
}

fn visit_identifier(&mut self, ident: &Identifier) {
let refer = unsafe { ident.reference.as_ptr().as_ref() };
if refer.is_none() {
Expand All @@ -192,3 +186,13 @@ impl<'ast> Visitor<'ast> for Semantic<'ast> {
walk_function(self, decl)
}
}

impl<'ast> ScopeVisitor for Semantic<'ast> {
fn enter_scope(&mut self) {
self.scope.push_stack();
}

fn leave_scope(&mut self) {
self.scope.pop_stack();
}
}
3 changes: 2 additions & 1 deletion crates/fuse-visitor/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
mod scope_visitor;
mod visitor;
mod visitor_mut;

pub use scope_visitor::*;
pub use visitor::*;
pub use visitor_mut::*;

Expand Down Expand Up @@ -30,4 +32,3 @@ macro_rules! visit_scope {
$visitor.leave_scope();
};
}

4 changes: 4 additions & 0 deletions crates/fuse-visitor/src/scope_visitor.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pub trait ScopeVisitor {
fn enter_scope(&mut self) {}
fn leave_scope(&mut self) {}
}
8 changes: 2 additions & 6 deletions crates/fuse-visitor/src/visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,9 @@
// and https://github.com/rust-lang/rust/blob/5bc7b9ac8ace5312e1d2cdc2722715cf58d4f926/compiler/rustc_ast_ir/src/visit.rs

use fuse_ast::ast::*;
use crate::{visit, visit_scope, visit_list};

pub trait Visitor<'ast>: Sized {
fn enter_scope(&mut self) {}

fn leave_scope(&mut self) {}
use crate::{visit, visit_list, visit_scope, ScopeVisitor};

pub trait Visitor<'ast>: ScopeVisitor + Sized {
fn visit_chunk(&mut self, chunk: &'ast Chunk) {
walk_block(self, &chunk.body)
}
Expand Down
8 changes: 2 additions & 6 deletions crates/fuse-visitor/src/visitor_mut.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
use crate::{visit, visit_list, visit_scope};
use crate::{visit, visit_list, visit_scope, ScopeVisitor};
use fuse_ast::ast::*;

pub trait VisitorMut<'ast>: Sized {
fn enter_scope(&mut self) {}

fn leave_scope(&mut self) {}

pub trait VisitorMut<'ast>: ScopeVisitor + Sized {
fn visit_chunk_mut(&mut self, chunk: &'ast mut Chunk) {
walk_block_mut(self, &mut chunk.body)
}
Expand Down
4 changes: 3 additions & 1 deletion crates/fusec/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ fn compile_chunk(source: &str) {
let parsed = Parser::new(source).parse();
let chunk = parsed.chunk.unwrap();
let semantic = Semantic::new(source, &chunk).build();
// panic!("{:?}", chunk)
// panic!("{:#?}", chunk)
}

#[test]
Expand All @@ -17,5 +17,7 @@ fn manual_test() {
fn x()
let x = y
end
x()
"#)
}

0 comments on commit 0f4cf4c

Please sign in to comment.