diff options
6 files changed, 85 insertions, 14 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java index a6ffad3..e9d3f6c 100644 --- a/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java +++ b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java @@ -2,13 +2,38 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; -import lombok.Value; - -@Value public class TernaryConditionalNode implements ExpressionNode { - ExpressionNode condition; - ExpressionNode ifTrue; - ExpressionNode ifFalse; + public static TernaryConditionalNode ternaryConditional( + ExpressionNode condition, + ExpressionNode ifTrue, + ExpressionNode ifFalse) { + return new TernaryConditionalNode(condition, ifTrue, ifFalse); + } + + private final ExpressionNode condition; + private final ExpressionNode ifTrue; + private final ExpressionNode ifFalse; + + private TernaryConditionalNode( + ExpressionNode condition, + ExpressionNode ifTrue, + ExpressionNode ifFalse) { + this.condition = condition; + this.ifTrue = ifTrue; + this.ifFalse = ifFalse; + } + + public ExpressionNode getCondition() { + return condition; + } + + public ExpressionNode getIfTrue() { + return ifTrue; + } + + public ExpressionNode getIfFalse() { + return ifFalse; + } @Override public <T> T accept(ExpressionNodeMapper<T> visitor) { @@ -19,4 +44,48 @@ public class TernaryConditionalNode implements ExpressionNode { public TypeName getType() { return ifTrue.getType(); } + + @Override + public String toString() { + return "TernaryConditionalNode(condition=" + condition + ", ifTrue=" + + ifTrue + ", ifFalse=" + ifFalse + ")"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((condition == null) ? 0 : condition.hashCode()); + result = prime * result + ((ifFalse == null) ? 0 : ifFalse.hashCode()); + result = prime * result + ((ifTrue == null) ? 0 : ifTrue.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TernaryConditionalNode other = (TernaryConditionalNode) obj; + if (condition == null) { + if (other.condition != null) + return false; + } else if (!condition.equals(other.condition)) + return false; + if (ifFalse == null) { + if (other.ifFalse != null) + return false; + } else if (!ifFalse.equals(other.ifFalse)) + return false; + if (ifTrue == null) { + if (other.ifTrue != null) + return false; + } else if (!ifTrue.equals(other.ifTrue)) + return false; + return true; + } } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 2bb82ef..12c9b6e 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -283,7 +283,7 @@ public class JavaReader { } private static ExpressionNode readConditionalExpression(ConditionalExpression expression) { - return new TernaryConditionalNode( + return TernaryConditionalNode.ternaryConditional( readExpression(expression.getExpression()), readExpression(expression.getThenExpression()), readExpression(expression.getElseExpression())); diff --git a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java index c926618..169e0f3 100644 --- a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java +++ b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java @@ -5,7 +5,6 @@ import java.util.List; import org.junit.Test; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ExpressionNode; -import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.values.IntegerValue; import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.StringValue; @@ -22,6 +21,7 @@ import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.ReturnNode.returns; import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall; +import static org.zwobble.couscous.ast.TernaryConditionalNode.ternaryConditional; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.tests.TestIds.ANY_ID; @@ -40,13 +40,13 @@ public abstract class BackendEvalTests { @Test public void whenConditionIsTrueThenValueOfConditionalTernaryIsTrueBranch() { - val result = evalExpression(new TernaryConditionalNode(literal(true), literal("T"), literal("F"))); + val result = evalExpression(ternaryConditional(literal(true), literal("T"), literal("F"))); assertEquals(value("T"), result); } @Test public void whenConditionIsFalseThenValueOfConditionalTernaryIsFalseBranch() { - val result = evalExpression(new TernaryConditionalNode(literal(false), literal("T"), literal("F"))); + val result = evalExpression(ternaryConditional(literal(false), literal("T"), literal("F"))); assertEquals(value("F"), result); } diff --git a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java index 8fb28ec..88588a4 100644 --- a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java +++ b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java @@ -28,6 +28,7 @@ import org.zwobble.couscous.ast.LocalVariableDeclarationNode; import org.zwobble.couscous.ast.MethodCallNode; import org.zwobble.couscous.ast.ReturnNode; import org.zwobble.couscous.ast.StaticMethodCallNode; +import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.ast.VariableDeclaration; import org.zwobble.couscous.ast.VariableReferenceNode; import org.zwobble.couscous.util.ExtraArrays; @@ -66,6 +67,7 @@ public class ValueObjectTests { {MethodCallNode.class}, {ReturnNode.class}, {StaticMethodCallNode.class}, + {TernaryConditionalNode.class}, {VariableDeclaration.class} }); } diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java index 5f30eb5..8c9ee95 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java @@ -9,7 +9,6 @@ import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.LocalVariableDeclarationNode; import org.zwobble.couscous.ast.ReturnNode; import org.zwobble.couscous.ast.StatementNode; -import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.ast.ThisReferenceNode; import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.frontends.java.JavaReader; @@ -29,6 +28,7 @@ import static org.zwobble.couscous.ast.FieldDeclarationNode.field; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall; +import static org.zwobble.couscous.ast.TernaryConditionalNode.ternaryConditional; import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively; @@ -145,7 +145,7 @@ public class JavaReaderTests { @Test public void canReadTernaryConditionals() { assertEquals( - new TernaryConditionalNode(literal(true), literal(1), literal(2)), + ternaryConditional(literal(true), literal(1), literal(2)), readExpression("true ? 1 : 2")); } diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java index c438128..2231bf0 100644 --- a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java +++ b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java @@ -6,7 +6,6 @@ import java.util.Optional; import org.junit.Test; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ExpressionNode; -import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.interpreter.ConditionMustBeBoolean; import org.zwobble.couscous.interpreter.Environment; import org.zwobble.couscous.interpreter.JavaProject; @@ -35,6 +34,7 @@ import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess; import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; +import static org.zwobble.couscous.ast.TernaryConditionalNode.ternaryConditional; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.interpreter.Evaluator.eval; import static org.zwobble.couscous.interpreter.values.InterpreterValues.value; @@ -59,7 +59,7 @@ public class EvaluatorTests extends BackendEvalTests { public void errorIfConditionIsNotBoolean() { val exception = assertThrows(ConditionMustBeBoolean.class, () -> eval(emptyEnvironment(), - new TernaryConditionalNode(literal(1), literal("T"), literal("F")))); + ternaryConditional(literal(1), literal("T"), literal("F")))); assertEquals(new ConditionMustBeBoolean(new IntegerInterpreterValue(1)), exception); } |
