mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Fix visitors skip class declaration
This commit is contained in:
parent
cef845f0f8
commit
7a64d7f99d
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user