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 @Override
public Node visit(ClassDeclarationStatement s, T t) { 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; return s;
} }

View File

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

View File

@ -13,4 +13,9 @@ public final class FunctionAdder extends AbstractVisitor {
super.visit(s); super.visit(s);
s.eval(); 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.FunctionValue;
import com.annimon.ownlang.lib.NumberValue; import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.ScopeHandler; 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.FunctionDefineStatement;
import com.annimon.ownlang.parser.ast.Node; import com.annimon.ownlang.parser.ast.Node;
import com.annimon.ownlang.parser.ast.Visitor; import com.annimon.ownlang.parser.ast.Visitor;
@ -115,5 +116,10 @@ public class ProgramsTest {
} }
} }
} }
@Override
public void visit(ClassDeclarationStatement s) {
}
}; };
} }