Skip to content

Commit

Permalink
grammar migration: merge global and member function nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
SpontanCombust committed Jun 10, 2024
1 parent 9761607 commit 4cf4f3c
Show file tree
Hide file tree
Showing 14 changed files with 95 additions and 166 deletions.
12 changes: 6 additions & 6 deletions crates/analysis/src/jobs/scan_symbols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
}
}

fn visit_global_func_decl(&mut self, n: &GlobalFunctionDeclarationNode) -> GlobalFunctionDeclarationTraversalPolicy {
fn visit_global_func_decl(&mut self, n: &FunctionDeclarationNode) -> FunctionDeclarationTraversalPolicy {
let mut traverse = false;

let name_node = n.name();
Expand Down Expand Up @@ -494,20 +494,20 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
traverse = true;
}

GlobalFunctionDeclarationTraversalPolicy {
FunctionDeclarationTraversalPolicy {
traverse_params: traverse,
traverse_definition: traverse
}
}

fn exit_global_func_decl(&mut self, _: &GlobalFunctionDeclarationNode) {
fn exit_global_func_decl(&mut self, _: &FunctionDeclarationNode) {
if self.current_path.components().last().map(|comp| comp.category == SymbolCategory::Callable).unwrap_or(false) {
self.current_path.pop();
self.current_param_ordinal = 0;
}
}

fn visit_member_func_decl(&mut self, n: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) -> MemberFunctionDeclarationTraversalPolicy {
fn visit_member_func_decl(&mut self, n: &FunctionDeclarationNode, _: PropertyTraversalContext) -> FunctionDeclarationTraversalPolicy {
let mut traverse = false;

let name_node = n.name();
Expand Down Expand Up @@ -589,13 +589,13 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
traverse = true;
}

MemberFunctionDeclarationTraversalPolicy {
FunctionDeclarationTraversalPolicy {
traverse_params: traverse,
traverse_definition: traverse
}
}

fn exit_member_func_decl(&mut self, _: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) {
fn exit_member_func_decl(&mut self, _: &FunctionDeclarationNode, _: PropertyTraversalContext) {
// pop only if visit managed to create the symbol
if self.current_path.components().last().map(|comp| comp.category == SymbolCategory::Callable).unwrap_or(false) {
self.current_path.pop();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {
}
}

fn visit_global_func_decl(&mut self, n: &GlobalFunctionDeclarationNode) -> GlobalFunctionDeclarationTraversalPolicy {
fn visit_global_func_decl(&mut self, n: &FunctionDeclarationNode) -> FunctionDeclarationTraversalPolicy {
let mut traverse_params = false;
let mut traverse_definition = false;
if n.has_errors() {
Expand All @@ -305,13 +305,13 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {
}
}

GlobalFunctionDeclarationTraversalPolicy {
FunctionDeclarationTraversalPolicy {
traverse_params,
traverse_definition
}
}

fn visit_member_func_decl(&mut self, n: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) -> MemberFunctionDeclarationTraversalPolicy {
fn visit_member_func_decl(&mut self, n: &FunctionDeclarationNode, _: PropertyTraversalContext) -> FunctionDeclarationTraversalPolicy {
let mut traverse_params = false;
let mut traverse_definition = false;
if n.has_errors() {
Expand All @@ -338,7 +338,7 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {
}
}

MemberFunctionDeclarationTraversalPolicy {
FunctionDeclarationTraversalPolicy {
traverse_params,
traverse_definition
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ impl SyntaxNodeVisitor for UnqualifiedNameLookupBuilder<'_> {

}

fn visit_global_func_decl(&mut self, _: &GlobalFunctionDeclarationNode) -> GlobalFunctionDeclarationTraversalPolicy {
fn visit_global_func_decl(&mut self, _: &FunctionDeclarationNode) -> FunctionDeclarationTraversalPolicy {
let mut unl = self.payload.borrow_mut();
let sympath_ctx = self.sympath_ctx.borrow();

Expand All @@ -365,11 +365,11 @@ impl SyntaxNodeVisitor for UnqualifiedNameLookupBuilder<'_> {
TraversalPolicy::default_to(true)
}

fn exit_global_func_decl(&mut self, _: &GlobalFunctionDeclarationNode) {
fn exit_global_func_decl(&mut self, _: &FunctionDeclarationNode) {
self.payload.borrow_mut().pop_scope();
}

fn visit_member_func_decl(&mut self, _: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) -> MemberFunctionDeclarationTraversalPolicy {
fn visit_member_func_decl(&mut self, _: &FunctionDeclarationNode, _: PropertyTraversalContext) -> FunctionDeclarationTraversalPolicy {
let mut unl = self.payload.borrow_mut();
let sympath_ctx = self.sympath_ctx.borrow();

Expand All @@ -389,7 +389,7 @@ impl SyntaxNodeVisitor for UnqualifiedNameLookupBuilder<'_> {
TraversalPolicy::default_to(true)
}

fn exit_member_func_decl(&mut self, _: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) {
fn exit_member_func_decl(&mut self, _: &FunctionDeclarationNode, _: PropertyTraversalContext) {
self.payload.borrow_mut().pop_scope();
}

Expand Down
12 changes: 6 additions & 6 deletions crates/analysis/src/utils/visitors/position_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,8 @@ impl SyntaxNodeVisitor for PositionFilter {
}
}

fn visit_global_func_decl(&mut self, n: &GlobalFunctionDeclarationNode) -> GlobalFunctionDeclarationTraversalPolicy {
let mut tp = GlobalFunctionDeclarationTraversalPolicy::default_to(false);
fn visit_global_func_decl(&mut self, n: &FunctionDeclarationNode) -> FunctionDeclarationTraversalPolicy {
let mut tp = FunctionDeclarationTraversalPolicy::default_to(false);

self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
Expand All @@ -166,15 +166,15 @@ impl SyntaxNodeVisitor for PositionFilter {
tp
}

fn exit_global_func_decl(&mut self, _: &GlobalFunctionDeclarationNode) {
fn exit_global_func_decl(&mut self, _: &FunctionDeclarationNode) {
self.currently_in_callable_range = false;
}




fn visit_member_func_decl(&mut self, n: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) -> MemberFunctionDeclarationTraversalPolicy {
let mut tp = MemberFunctionDeclarationTraversalPolicy::default_to(false);
fn visit_member_func_decl(&mut self, n: &FunctionDeclarationNode, _: PropertyTraversalContext) -> FunctionDeclarationTraversalPolicy {
let mut tp = FunctionDeclarationTraversalPolicy::default_to(false);

self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
Expand All @@ -193,7 +193,7 @@ impl SyntaxNodeVisitor for PositionFilter {
tp
}

fn exit_member_func_decl(&mut self, _: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) {
fn exit_member_func_decl(&mut self, _: &FunctionDeclarationNode, _: PropertyTraversalContext) {
self.currently_in_callable_range = false;
}

Expand Down
8 changes: 4 additions & 4 deletions crates/analysis/src/utils/visitors/sympath_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,23 +95,23 @@ impl SyntaxNodeVisitor for SymbolPathBuilder<'_> {



fn visit_global_func_decl(&mut self, n: &GlobalFunctionDeclarationNode) -> GlobalFunctionDeclarationTraversalPolicy {
fn visit_global_func_decl(&mut self, n: &FunctionDeclarationNode) -> FunctionDeclarationTraversalPolicy {
let name = n.name().value(self.doc);
self.payload.borrow_mut().current_sympath = GlobalCallableSymbolPath::new(&name).into();
TraversalPolicy::default_to(true)
}

fn exit_global_func_decl(&mut self, _: &GlobalFunctionDeclarationNode) {
fn exit_global_func_decl(&mut self, _: &FunctionDeclarationNode) {
self.payload.borrow_mut().current_sympath.pop();
}

fn visit_member_func_decl(&mut self, n: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) -> MemberFunctionDeclarationTraversalPolicy {
fn visit_member_func_decl(&mut self, n: &FunctionDeclarationNode, _: PropertyTraversalContext) -> FunctionDeclarationTraversalPolicy {
let name = n.name().value(self.doc);
self.payload.borrow_mut().current_sympath.push(&name, SymbolCategory::Callable);
TraversalPolicy::default_to(true)
}

fn exit_member_func_decl(&mut self, _: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) {
fn exit_member_func_decl(&mut self, _: &FunctionDeclarationNode, _: PropertyTraversalContext) {
self.payload.borrow_mut().current_sympath.pop();
}

Expand Down
12 changes: 8 additions & 4 deletions crates/core/src/ast/classes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ pub enum ClassStatement<'script> {
DefaultsBlock(MemberDefaultsBlockNode<'script>),
Hint(MemberHintNode<'script>),
Autobind(AutobindDeclarationNode<'script>),
Method(MemberFunctionDeclarationNode<'script>),
Method(FunctionDeclarationNode<'script>),
Event(EventDeclarationNode<'script>),
Nop(NopNode<'script>)
}
Expand Down Expand Up @@ -151,7 +151,7 @@ impl<'script> ClassStatementNode<'script> {
MemberDefaultsBlockNode::NODE_KIND => ClassStatement::DefaultsBlock(self.into()),
MemberHintNode::NODE_KIND => ClassStatement::Hint(self.into()),
AutobindDeclarationNode::NODE_KIND => ClassStatement::Autobind(self.into()),
MemberFunctionDeclarationNode::NODE_KIND => ClassStatement::Method(self.into()),
FunctionDeclarationNode::NODE_KIND => ClassStatement::Method(self.into()),
EventDeclarationNode::NODE_KIND => ClassStatement::Event(self.into()),
NopNode::NODE_KIND => ClassStatement::Nop(self.into()),
_ => panic!("Unknown class statement type: {} {}", self.tree_node.kind(), self.range().debug())
Expand All @@ -175,7 +175,7 @@ impl<'script> TryFrom<AnyNode<'script>> for ClassStatementNode<'script> {
MemberDefaultsBlockNode::NODE_KIND |
MemberHintNode::NODE_KIND |
AutobindDeclarationNode::NODE_KIND |
MemberFunctionDeclarationNode::NODE_KIND |
FunctionDeclarationNode::NODE_KIND |
EventDeclarationNode::NODE_KIND |
NopNode::NODE_KIND => Ok(value.into()),
_ => Err(())
Expand All @@ -193,7 +193,11 @@ impl SyntaxNodeTraversal for ClassStatementNode<'_> {
ClassStatement::DefaultsBlock(s) => s.accept(visitor, ctx),
ClassStatement::Hint(s) => s.accept(visitor, ctx),
ClassStatement::Autobind(s) => s.accept(visitor, ctx),
ClassStatement::Method(s) => s.accept(visitor, ctx),
ClassStatement::Method(s) => s.accept(visitor, if ctx == PropertyTraversalContext::ClassDefinition {
FunctionDeclarationTraversalContext::ClassDefinition
} else {
FunctionDeclarationTraversalContext::StateDefinition
}),
ClassStatement::Event(s) => s.accept(visitor, ctx),
ClassStatement::Nop(_) => {},
}
Expand Down
128 changes: 37 additions & 91 deletions crates/core/src/ast/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ use super::*;

mod tags {
pub struct EventDeclaration;
pub struct GlobalFunctionDeclaration;
pub struct MemberFunctionDeclaration;
pub struct FunctionDeclaration;
pub struct FunctionParameters;
pub struct FunctionParameterGroup;
pub struct FunctionBlock;
Expand Down Expand Up @@ -82,13 +81,13 @@ impl SyntaxNodeTraversal for EventDeclarationNode<'_> {



pub type GlobalFunctionDeclarationNode<'script> = SyntaxNode<'script, tags::GlobalFunctionDeclaration>;
pub type FunctionDeclarationNode<'script> = SyntaxNode<'script, tags::FunctionDeclaration>;

impl NamedSyntaxNode for GlobalFunctionDeclarationNode<'_> {
const NODE_KIND: &'static str = "global_func_decl_stmt";
impl NamedSyntaxNode for FunctionDeclarationNode<'_> {
const NODE_KIND: &'static str = "func_decl";
}

impl<'script> GlobalFunctionDeclarationNode<'script> {
impl<'script> FunctionDeclarationNode<'script> {
pub fn specifiers(&self) -> impl Iterator<Item = SpecifierNode<'script>> {
self.field_children("specifiers").map(|n| n.into())
}
Expand All @@ -114,9 +113,9 @@ impl<'script> GlobalFunctionDeclarationNode<'script> {
}
}

impl Debug for GlobalFunctionDeclarationNode<'_> {
impl Debug for FunctionDeclarationNode<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct(&format!("GlobalFunctionDeclaration {}", self.range().debug()))
f.debug_struct(&format!("FunctionDeclaration {}", self.range().debug()))
.field("specifiers", &self.specifiers().collect::<Vec<_>>())
.field("flavour", &self.flavour())
.field("name", &self.name())
Expand All @@ -127,7 +126,7 @@ impl Debug for GlobalFunctionDeclarationNode<'_> {
}
}

impl<'script> TryFrom<AnyNode<'script>> for GlobalFunctionDeclarationNode<'script> {
impl<'script> TryFrom<AnyNode<'script>> for FunctionDeclarationNode<'script> {
type Error = ();

fn try_from(value: AnyNode<'script>) -> Result<Self, Self::Error> {
Expand All @@ -139,92 +138,39 @@ impl<'script> TryFrom<AnyNode<'script>> for GlobalFunctionDeclarationNode<'scrip
}
}

impl SyntaxNodeTraversal for GlobalFunctionDeclarationNode<'_> {
type TraversalCtx = ();
impl SyntaxNodeTraversal for FunctionDeclarationNode<'_> {
type TraversalCtx = FunctionDeclarationTraversalContext;

fn accept<V: SyntaxNodeVisitor>(&self, visitor: &mut V, _: Self::TraversalCtx) {
let tp = visitor.visit_global_func_decl(self);
if tp.traverse_params {
self.params().accept(visitor, FunctionTraversalContext::GlobalFunction);
}
if tp.traverse_definition {
self.definition().accept(visitor, FunctionTraversalContext::GlobalFunction);
}
visitor.exit_global_func_decl(self);
}
}



pub type MemberFunctionDeclarationNode<'script> = SyntaxNode<'script, tags::MemberFunctionDeclaration>;

impl NamedSyntaxNode for MemberFunctionDeclarationNode<'_> {
const NODE_KIND: &'static str = "member_func_decl_stmt";
}

impl<'script> MemberFunctionDeclarationNode<'script> {
pub fn specifiers(&self) -> impl Iterator<Item = SpecifierNode<'script>> {
self.field_children("specifiers").map(|n| n.into())
}

pub fn flavour(&self) -> Option<FunctionFlavourNode<'script>> {
self.field_child("flavour").map(|n| n.into())
}

pub fn name(&self) -> IdentifierNode<'script> {
self.field_child("name").unwrap().into()
}

pub fn params(&self) -> FunctionParametersNode<'script> {
self.field_child("params").unwrap().into()
}

pub fn return_type(&self) -> Option<TypeAnnotationNode<'script>> {
self.field_child("return_type").map(|n| n.into())
}

pub fn definition(&self) -> FunctionDefinitionNode<'script> {
self.field_child("definition").unwrap().into()
}
}

impl Debug for MemberFunctionDeclarationNode<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct(&format!("MemberFunctionDeclaration {}", self.range().debug()))
.field("specifiers", &self.specifiers().collect::<Vec<_>>())
.field("flavour", &self.flavour())
.field("name", &self.name())
.field("params", &self.params())
.field("return_type", &self.return_type())
.field("definition", &self.definition())
.finish()
}
}

impl<'script> TryFrom<AnyNode<'script>> for MemberFunctionDeclarationNode<'script> {
type Error = ();

fn try_from(value: AnyNode<'script>) -> Result<Self, Self::Error> {
if value.tree_node.kind() == Self::NODE_KIND {
Ok(value.into())
fn accept<V: SyntaxNodeVisitor>(&self, visitor: &mut V, ctx: Self::TraversalCtx) {
if ctx == FunctionDeclarationTraversalContext::Global {
let tp = visitor.visit_global_func_decl(self);

if tp.traverse_params {
self.params().accept(visitor, FunctionTraversalContext::GlobalFunction);
}
if tp.traverse_definition {
self.definition().accept(visitor, FunctionTraversalContext::GlobalFunction);
}

visitor.exit_global_func_decl(self);
} else {
Err(())
}
}
}

impl SyntaxNodeTraversal for MemberFunctionDeclarationNode<'_> {
type TraversalCtx = PropertyTraversalContext;
let func_ctx = if ctx == FunctionDeclarationTraversalContext::ClassDefinition {
PropertyTraversalContext::ClassDefinition
} else {
PropertyTraversalContext::StateDefinition
};

fn accept<V: SyntaxNodeVisitor>(&self, visitor: &mut V, ctx: Self::TraversalCtx) {
let tp = visitor.visit_member_func_decl(self, ctx);
if tp.traverse_params {
self.params().accept(visitor, FunctionTraversalContext::MemberFunction);
}
if tp.traverse_definition {
self.definition().accept(visitor, FunctionTraversalContext::MemberFunction);
let tp = visitor.visit_member_func_decl(self, func_ctx);

if tp.traverse_params {
self.params().accept(visitor, FunctionTraversalContext::MemberFunction);
}
if tp.traverse_definition {
self.definition().accept(visitor, FunctionTraversalContext::MemberFunction);
}

visitor.exit_member_func_decl(self, func_ctx);
}
visitor.exit_member_func_decl(self, ctx);
}
}

Expand Down
Loading

0 comments on commit 4cf4f3c

Please sign in to comment.