aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java81
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java2
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java6
-rw-r--r--src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java2
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java4
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java4
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);
}