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
|
@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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user