diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java index fee1831..0f15305 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java @@ -75,7 +75,33 @@ public abstract class OptimizationVisitor implements ResultVisitor { @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; } diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/AbstractVisitor.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/AbstractVisitor.java index c352b37..5bc53ea 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/AbstractVisitor.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/AbstractVisitor.java @@ -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 diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/FunctionAdder.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/FunctionAdder.java index 2f90515..7f03cb2 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/FunctionAdder.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/visitors/FunctionAdder.java @@ -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 + } } diff --git a/ownlang-parser/src/test/java/com/annimon/ownlang/parser/ProgramsTest.java b/ownlang-parser/src/test/java/com/annimon/ownlang/parser/ProgramsTest.java index af113af..d08787d 100644 --- a/ownlang-parser/src/test/java/com/annimon/ownlang/parser/ProgramsTest.java +++ b/ownlang-parser/src/test/java/com/annimon/ownlang/parser/ProgramsTest.java @@ -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) { + + } }; }