Skip to content

Commit be0169c

Browse files
committed
Refactor snapshot tests to include Nop statements and adjust span start positions
- Updated multiple snapshot tests for string interpolation and trait adaptation to include Nop statements at the beginning of the program. - Adjusted the start position of spans in the program structure to reflect the new Nop statements. - Added a new test file for symbol table functionality, covering function, class, and enum symbol resolution.
1 parent 9cfa1f1 commit be0169c

217 files changed

Lines changed: 2721 additions & 342 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎Cargo.lock‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎src/ast/locator.rs‎

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use crate::ast::visitor::{Visitor, walk_class_member, walk_expr, walk_stmt};
2+
use crate::ast::*;
3+
use crate::span::Span;
4+
5+
#[derive(Debug, Clone, Copy)]
6+
pub enum AstNode<'ast> {
7+
Stmt(StmtId<'ast>),
8+
Expr(ExprId<'ast>),
9+
ClassMember(&'ast ClassMember<'ast>),
10+
}
11+
12+
impl<'ast> AstNode<'ast> {
13+
pub fn span(&self) -> Span {
14+
match self {
15+
AstNode::Stmt(s) => s.span(),
16+
AstNode::Expr(e) => e.span(),
17+
AstNode::ClassMember(m) => match m {
18+
ClassMember::Property { span, .. } => *span,
19+
ClassMember::PropertyHook { span, .. } => *span,
20+
ClassMember::Method { span, .. } => *span,
21+
ClassMember::Const { span, .. } => *span,
22+
ClassMember::TraitUse { span, .. } => *span,
23+
ClassMember::Case { span, .. } => *span,
24+
},
25+
}
26+
}
27+
}
28+
29+
pub struct Locator<'ast> {
30+
target: usize,
31+
pub path: Vec<AstNode<'ast>>,
32+
}
33+
34+
impl<'ast> Locator<'ast> {
35+
pub fn new(target: usize) -> Self {
36+
Self {
37+
target,
38+
path: Vec::new(),
39+
}
40+
}
41+
42+
pub fn find(program: &'ast Program<'ast>, target: usize) -> Vec<AstNode<'ast>> {
43+
let mut locator = Self::new(target);
44+
locator.visit_program(program);
45+
locator.path
46+
}
47+
}
48+
49+
impl<'ast> Visitor<'ast> for Locator<'ast> {
50+
fn visit_stmt(&mut self, stmt: StmtId<'ast>) {
51+
let span = stmt.span();
52+
if span.start <= self.target && self.target <= span.end {
53+
self.path.push(AstNode::Stmt(stmt));
54+
walk_stmt(self, stmt);
55+
}
56+
}
57+
58+
fn visit_expr(&mut self, expr: ExprId<'ast>) {
59+
let span = expr.span();
60+
if span.start <= self.target && self.target <= span.end {
61+
self.path.push(AstNode::Expr(expr));
62+
walk_expr(self, expr);
63+
}
64+
}
65+
66+
fn visit_class_member(&mut self, member: &'ast ClassMember<'ast>) {
67+
let span = match member {
68+
ClassMember::Property { span, .. } => *span,
69+
ClassMember::PropertyHook { span, .. } => *span,
70+
ClassMember::Method { span, .. } => *span,
71+
ClassMember::Const { span, .. } => *span,
72+
ClassMember::TraitUse { span, .. } => *span,
73+
ClassMember::Case { span, .. } => *span,
74+
};
75+
76+
if span.start <= self.target && self.target <= span.end {
77+
self.path.push(AstNode::ClassMember(member));
78+
walk_class_member(self, member);
79+
}
80+
}
81+
}

‎src/ast/mod.rs‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ use crate::lexer::token::Token;
22
use crate::span::{LineInfo, Span};
33
use serde::Serialize;
44

5+
pub mod locator;
56
pub mod sexpr;
7+
pub mod symbol_table;
68
pub mod visitor;
79

810
pub type ExprId<'ast> = &'ast Expr<'ast>;
@@ -117,6 +119,7 @@ pub enum Stmt<'ast> {
117119
params: &'ast [Param<'ast>],
118120
return_type: Option<&'ast Type<'ast>>,
119121
body: &'ast [StmtId<'ast>],
122+
doc_comment: Option<Span>,
120123
span: Span,
121124
},
122125
Class {
@@ -126,19 +129,22 @@ pub enum Stmt<'ast> {
126129
extends: Option<Name<'ast>>,
127130
implements: &'ast [Name<'ast>],
128131
members: &'ast [ClassMember<'ast>],
132+
doc_comment: Option<Span>,
129133
span: Span,
130134
},
131135
Interface {
132136
attributes: &'ast [AttributeGroup<'ast>],
133137
name: &'ast Token,
134138
extends: &'ast [Name<'ast>],
135139
members: &'ast [ClassMember<'ast>],
140+
doc_comment: Option<Span>,
136141
span: Span,
137142
},
138143
Trait {
139144
attributes: &'ast [AttributeGroup<'ast>],
140145
name: &'ast Token,
141146
members: &'ast [ClassMember<'ast>],
147+
doc_comment: Option<Span>,
142148
span: Span,
143149
},
144150
Enum {
@@ -147,6 +153,7 @@ pub enum Stmt<'ast> {
147153
backed_type: Option<&'ast Type<'ast>>,
148154
implements: &'ast [Name<'ast>],
149155
members: &'ast [ClassMember<'ast>],
156+
doc_comment: Option<Span>,
150157
span: Span,
151158
},
152159
Namespace {
@@ -177,6 +184,7 @@ pub enum Stmt<'ast> {
177184
Const {
178185
attributes: &'ast [AttributeGroup<'ast>],
179186
consts: &'ast [ClassConst<'ast>],
187+
doc_comment: Option<Span>,
180188
span: Span,
181189
},
182190
Break {
@@ -325,6 +333,10 @@ pub enum Expr<'ast> {
325333
name: Span,
326334
span: Span,
327335
},
336+
IndirectVariable {
337+
name: ExprId<'ast>,
338+
span: Span,
339+
},
328340
Integer {
329341
value: &'ast [u8],
330342
span: Span,
@@ -559,6 +571,7 @@ impl<'ast> Expr<'ast> {
559571
Expr::NullsafeMethodCall { span, .. } => *span,
560572
Expr::VariadicPlaceholder { span } => *span,
561573
Expr::Error { span } => *span,
574+
Expr::IndirectVariable { span, .. } => *span,
562575
}
563576
}
564577
}
@@ -683,6 +696,7 @@ pub enum ClassMember<'ast> {
683696
modifiers: &'ast [Token],
684697
ty: Option<&'ast Type<'ast>>,
685698
entries: &'ast [PropertyEntry<'ast>],
699+
doc_comment: Option<Span>,
686700
span: Span,
687701
},
688702
PropertyHook {
@@ -692,6 +706,7 @@ pub enum ClassMember<'ast> {
692706
name: &'ast Token,
693707
default: Option<ExprId<'ast>>,
694708
hooks: &'ast [PropertyHook<'ast>],
709+
doc_comment: Option<Span>,
695710
span: Span,
696711
},
697712
Method {
@@ -701,25 +716,29 @@ pub enum ClassMember<'ast> {
701716
params: &'ast [Param<'ast>],
702717
return_type: Option<&'ast Type<'ast>>,
703718
body: &'ast [StmtId<'ast>],
719+
doc_comment: Option<Span>,
704720
span: Span,
705721
},
706722
Const {
707723
attributes: &'ast [AttributeGroup<'ast>],
708724
modifiers: &'ast [Token],
709725
ty: Option<&'ast Type<'ast>>,
710726
consts: &'ast [ClassConst<'ast>],
727+
doc_comment: Option<Span>,
711728
span: Span,
712729
},
713730
TraitUse {
714731
attributes: &'ast [AttributeGroup<'ast>],
715732
traits: &'ast [Name<'ast>],
716733
adaptations: &'ast [TraitAdaptation<'ast>],
734+
doc_comment: Option<Span>,
717735
span: Span,
718736
},
719737
Case {
720738
attributes: &'ast [AttributeGroup<'ast>],
721739
name: &'ast Token,
722740
value: Option<ExprId<'ast>>,
741+
doc_comment: Option<Span>,
723742
span: Span,
724743
},
725744
}

‎src/ast/sexpr.rs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,11 @@ impl<'a, 'ast> Visitor<'ast> for SExprFormatter<'a> {
651651
self.write(&String::from_utf8_lossy(name.as_str(self.source)));
652652
self.write("\")");
653653
}
654+
Expr::IndirectVariable { name, .. } => {
655+
self.write("(indirect-variable ");
656+
self.visit_expr(name);
657+
self.write(")");
658+
}
654659
Expr::Unary { op, expr, .. } => {
655660
self.write("(");
656661
self.write(match op {

0 commit comments

Comments
 (0)