Skip to content

Commit 7a64d7f

Browse files
committed
Fix visitors skip class declaration
1 parent cef845f commit 7a64d7f

File tree

4 files changed

+44
-2
lines changed

4 files changed

+44
-2
lines changed

ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,33 @@ public Node visit(BreakStatement s, T t) {
7575

7676
@Override
7777
public Node visit(ClassDeclarationStatement s, T t) {
78-
// TODO fields and methods
78+
final var newClassDeclaration = new ClassDeclarationStatement(s.name);
79+
boolean changed = false;
80+
for (AssignmentExpression field : s.fields) {
81+
final Node fieldExpr = field.expression.accept(this, t);
82+
final AssignmentExpression newField;
83+
if (fieldExpr != field.expression) {
84+
changed = true;
85+
newField = new AssignmentExpression(field.operation, field.target, fieldExpr);
86+
} else {
87+
newField = field;
88+
}
89+
newClassDeclaration.addField(newField);
90+
}
91+
92+
for (FunctionDefineStatement method : s.methods) {
93+
final var newMethod = method.accept(this, t);
94+
if (newMethod != method) {
95+
changed = true;
96+
newClassDeclaration.addMethod((FunctionDefineStatement) newMethod);
97+
} else {
98+
newClassDeclaration.addMethod(method);
99+
}
100+
}
101+
102+
if (changed) {
103+
return newClassDeclaration;
104+
}
79105
return s;
80106
}
81107

ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/AbstractVisitor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@ public void visit(BreakStatement s) {
4141

4242
@Override
4343
public void visit(ClassDeclarationStatement s) {
44-
44+
for (Node field : s.fields) {
45+
field.accept(this);
46+
}
47+
for (Node method : s.methods) {
48+
method.accept(this);
49+
}
4550
}
4651

4752
@Override

ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/FunctionAdder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,9 @@ public void visit(FunctionDefineStatement s) {
1313
super.visit(s);
1414
s.eval();
1515
}
16+
17+
@Override
18+
public void visit(ClassDeclarationStatement s) {
19+
// skip, otherwise class methods will be visible outside of class
20+
}
1621
}

ownlang-parser/src/test/java/com/annimon/ownlang/parser/ProgramsTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.annimon.ownlang.lib.FunctionValue;
66
import com.annimon.ownlang.lib.NumberValue;
77
import com.annimon.ownlang.lib.ScopeHandler;
8+
import com.annimon.ownlang.parser.ast.ClassDeclarationStatement;
89
import com.annimon.ownlang.parser.ast.FunctionDefineStatement;
910
import com.annimon.ownlang.parser.ast.Node;
1011
import com.annimon.ownlang.parser.ast.Visitor;
@@ -115,5 +116,10 @@ public void visit(FunctionDefineStatement s) {
115116
}
116117
}
117118
}
119+
120+
@Override
121+
public void visit(ClassDeclarationStatement s) {
122+
123+
}
118124
};
119125
}

0 commit comments

Comments
 (0)