Fix visitors skip class declaration

This commit is contained in:
aNNiMON 2023-10-24 19:48:46 +03:00 committed by Victor Melnik
parent cef845f0f8
commit 7a64d7f99d
4 changed files with 44 additions and 2 deletions

View File

@ -75,7 +75,33 @@ public abstract class OptimizationVisitor<T> implements ResultVisitor<Node, T> {
@Override
public Node visit(ClassDeclarationStatement s, T t) {
// TODO fields and methods
final var newClassDeclaration = new ClassDeclarationStatement(s.name);
boolean changed = false;
for (AssignmentExpression field : s.fields) {
final Node fieldExpr = field.expression.accept(this, t);
final AssignmentExpression newField;
if (fieldExpr != field.expression) {
changed = true;
newField = new AssignmentExpression(field.operation, field.target, fieldExpr);
} else {
newField = field;
}
newClassDeclaration.addField(newField);
}
for (FunctionDefineStatement method : s.methods) {
final var newMethod = method.accept(this, t);
if (newMethod != method) {
changed = true;
newClassDeclaration.addMethod((FunctionDefineStatement) newMethod);
} else {
newClassDeclaration.addMethod(method);
}
}
if (changed) {
return newClassDeclaration;
}
return s;
}

View File

@ -41,7 +41,12 @@ public abstract class AbstractVisitor implements Visitor {
@Override
public void visit(ClassDeclarationStatement s) {
for (Node field : s.fields) {
field.accept(this);
}
for (Node method : s.methods) {
method.accept(this);
}
}
@Override

View File

@ -13,4 +13,9 @@ public final class FunctionAdder extends AbstractVisitor {
super.visit(s);
s.eval();
}
@Override
public void visit(ClassDeclarationStatement s) {
// skip, otherwise class methods will be visible outside of class
}
}

View File

@ -5,6 +5,7 @@ import com.annimon.ownlang.exceptions.OwnLangParserException;
import com.annimon.ownlang.lib.FunctionValue;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.ScopeHandler;
import com.annimon.ownlang.parser.ast.ClassDeclarationStatement;
import com.annimon.ownlang.parser.ast.FunctionDefineStatement;
import com.annimon.ownlang.parser.ast.Node;
import com.annimon.ownlang.parser.ast.Visitor;
@ -115,5 +116,10 @@ public class ProgramsTest {
}
}
}
@Override
public void visit(ClassDeclarationStatement s) {
}
};
}