aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-25 17:53:39 +0000
committerMichael Williamson <mike@zwobble.org>2015-10-25 17:53:39 +0000
commit6f829beb148b7bd4c19b72e307a8b11b5c139b03 (patch)
treed3f36b3de75722c36b0e4b96e30ff95417bb60d3
parent0a4c805808f6470943773bc1fd5333662f9f5c2b (diff)
Remove lombok from AssignmentNode
-rw-r--r--src/main/java/org/zwobble/couscous/ast/AssignmentNode.java56
-rw-r--r--src/main/java/org/zwobble/couscous/values/StringValue.java4
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java6
-rw-r--r--src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java33
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java6
5 files changed, 92 insertions, 13 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java b/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java
index 483d4c2..ead783c 100644
--- a/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java
@@ -4,9 +4,6 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
-import lombok.Value;
-
-@Value
public class AssignmentNode implements ExpressionNode {
public static StatementNode assignStatement(AssignableExpressionNode target, ExpressionNode value) {
return new ExpressionStatementNode(assign(target, value));
@@ -24,8 +21,21 @@ public class AssignmentNode implements ExpressionNode {
return new AssignmentNode(reference(target), value);
}
- AssignableExpressionNode target;
- ExpressionNode value;
+ private final AssignableExpressionNode target;
+ private final ExpressionNode value;
+
+ private AssignmentNode(AssignableExpressionNode target, ExpressionNode value) {
+ this.target = target;
+ this.value = value;
+ }
+
+ public AssignableExpressionNode getTarget() {
+ return target;
+ }
+
+ public ExpressionNode getValue() {
+ return value;
+ }
@Override
public <T> T accept(ExpressionNodeMapper<T> visitor) {
@@ -36,4 +46,40 @@ public class AssignmentNode implements ExpressionNode {
public TypeName getType() {
return value.getType();
}
+
+ @Override
+ public String toString() {
+ return "AssignmentNode(target=" + target + ", value=" + value + ")";
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((target == null) ? 0 : target.hashCode());
+ result = prime * result + ((value == null) ? 0 : value.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;
+ AssignmentNode other = (AssignmentNode) obj;
+ if (target == null) {
+ if (other.target != null)
+ return false;
+ } else if (!target.equals(other.target))
+ return false;
+ if (value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!value.equals(other.value))
+ return false;
+ return true;
+ }
}
diff --git a/src/main/java/org/zwobble/couscous/values/StringValue.java b/src/main/java/org/zwobble/couscous/values/StringValue.java
index bd95eb8..b912fd3 100644
--- a/src/main/java/org/zwobble/couscous/values/StringValue.java
+++ b/src/main/java/org/zwobble/couscous/values/StringValue.java
@@ -6,6 +6,10 @@ import lombok.Value;
@Value
public class StringValue implements PrimitiveValue {
+ public static StringValue of(String value) {
+ return new StringValue(value);
+ }
+
public static final TypeName REF = TypeName.of("java.lang.String");
String value;
diff --git a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
index 44ad2a4..0fa4972 100644
--- a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
@@ -1,7 +1,6 @@
package org.zwobble.couscous.tests;
import org.junit.Test;
-import org.zwobble.couscous.ast.AssignmentNode;
import org.zwobble.couscous.ast.ClassNode;
import org.zwobble.couscous.ast.ExpressionStatementNode;
import org.zwobble.couscous.ast.LiteralNode;
@@ -13,6 +12,7 @@ import org.zwobble.couscous.values.StringValue;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
+import static org.zwobble.couscous.ast.AssignmentNode.assign;
import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration;
@@ -57,7 +57,7 @@ public abstract class BackendMethodTests {
val arg = formalArg(var(ANY_ID, "x", StringValue.REF));
val method = staticMethod("hello")
.argument(arg)
- .statement(new ExpressionStatementNode(new AssignmentNode(reference(arg), LiteralNode.literal("[updated value]"))))
+ .statement(new ExpressionStatementNode(assign(reference(arg), LiteralNode.literal("[updated value]"))))
.statement(new ReturnNode(reference(arg)));
val result = runMethod(method, value("[initial value]"));
@@ -82,7 +82,7 @@ public abstract class BackendMethodTests {
ANY_ID, "x", StringValue.REF, LiteralNode.literal("[initial value]"));
val method = staticMethod("hello")
.statement(localVariableDeclaration)
- .statement(new ExpressionStatementNode(new AssignmentNode(reference(localVariableDeclaration), LiteralNode.literal("[updated value]"))))
+ .statement(new ExpressionStatementNode(assign(reference(localVariableDeclaration), LiteralNode.literal("[updated value]"))))
.statement(new ReturnNode(reference(localVariableDeclaration)));
val result = runMethod(method);
diff --git a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java
index 287d6a8..c7276b1 100644
--- a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.tests;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
import java.util.function.Function;
import java.util.stream.IntStream;
import java.util.stream.Stream;
@@ -11,8 +12,15 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.zwobble.couscous.ast.AnnotationNode;
+import org.zwobble.couscous.ast.AssignableExpressionNode;
+import org.zwobble.couscous.ast.AssignmentNode;
+import org.zwobble.couscous.ast.ExpressionNode;
+import org.zwobble.couscous.ast.LiteralNode;
import org.zwobble.couscous.ast.VariableDeclaration;
+import org.zwobble.couscous.ast.VariableReferenceNode;
import org.zwobble.couscous.util.ExtraArrays;
+import org.zwobble.couscous.values.PrimitiveValue;
+import org.zwobble.couscous.values.StringValue;
import com.google.common.base.Joiner;
@@ -33,6 +41,7 @@ public class ValueObjectTests {
public static Iterable<Object[]> valueObjectTypes() {
return asList(new Object[][] {
{AnnotationNode.class},
+ {AssignmentNode.class},
{VariableDeclaration.class}
});
}
@@ -99,6 +108,12 @@ public class ValueObjectTests {
private static Object generateFirstInstance(Class<?> type) {
if (type.equals(String.class)) {
return "[string 1]";
+ } else if (type.equals(PrimitiveValue.class)) {
+ return generateFirstInstance(StringValue.class);
+ } else if (type.equals(ExpressionNode.class)) {
+ return generateFirstInstance(LiteralNode.class);
+ } else if (type.equals(AssignableExpressionNode.class)) {
+ return generateFirstInstance(VariableReferenceNode.class);
} else {
return generateValue(type, ValueObjectTests::generateFirstInstance).instance;
}
@@ -107,6 +122,12 @@ public class ValueObjectTests {
private static Object generateSecondInstance(Class<?> type) {
if (type.equals(String.class)) {
return "[string 2]";
+ } else if (type.equals(PrimitiveValue.class)) {
+ return generateSecondInstance(StringValue.class);
+ } else if (type.equals(ExpressionNode.class)) {
+ return generateSecondInstance(LiteralNode.class);
+ } else if (type.equals(AssignableExpressionNode.class)) {
+ return generateSecondInstance(VariableReferenceNode.class);
} else {
return generateValue(type, ValueObjectTests::generateSecondInstance).instance;
}
@@ -115,6 +136,12 @@ public class ValueObjectTests {
private static Object generateInstance(Class<?> type) {
if (type.equals(String.class)) {
return "[string]";
+ } else if (type.equals(PrimitiveValue.class)) {
+ return generateInstance(StringValue.class);
+ } else if (type.equals(ExpressionNode.class)) {
+ return generateInstance(LiteralNode.class);
+ } else if (type.equals(AssignableExpressionNode.class)) {
+ return generateInstance(VariableReferenceNode.class);
} else {
return generateValue(type, ValueObjectTests::generateInstance).instance;
}
@@ -134,8 +161,10 @@ public class ValueObjectTests {
}
private static Class<?>[] fieldTypes(Class<?> type) {
- Field[] fields = type.getDeclaredFields();
- return ExtraArrays.map(fields, field -> field.getType())
+ return asList(type.getDeclaredFields())
+ .stream()
+ .filter(field -> !Modifier.isStatic(field.getModifiers()))
+ .map(field -> field.getType())
.toArray(Class<?>[]::new);
}
diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java
index 9d23a45..9ef64d2 100644
--- a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java
@@ -4,7 +4,6 @@ import java.util.List;
import java.util.stream.Collectors;
import org.junit.Test;
-import org.zwobble.couscous.ast.AssignmentNode;
import org.zwobble.couscous.ast.ClassNode;
import org.zwobble.couscous.ast.ExpressionStatementNode;
import org.zwobble.couscous.ast.LiteralNode;
@@ -24,6 +23,7 @@ import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.StringValue;
import static org.junit.Assert.assertEquals;
+import static org.zwobble.couscous.ast.AssignmentNode.assign;
import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration;
@@ -52,7 +52,7 @@ public class InterpreterMethodTests extends BackendMethodTests {
val arg = formalArg(var(ANY_ID, "x", StringValue.REF));
val method = staticMethod("hello")
.argument(arg)
- .statement(new ExpressionStatementNode(new AssignmentNode(reference(arg), literal(0))));
+ .statement(new ExpressionStatementNode(assign(reference(arg), literal(0))));
val exception = assertThrows(UnexpectedValueType.class,
() -> runMethod(method, value("")));
@@ -65,7 +65,7 @@ public class InterpreterMethodTests extends BackendMethodTests {
val localVariableDeclaration = localVariableDeclaration(
ANY_ID, "x", StringValue.REF, literal(""));
val method = staticMethod("hello")
- .statement(new ExpressionStatementNode(new AssignmentNode(reference(localVariableDeclaration), LiteralNode.literal("[updated value]"))));
+ .statement(new ExpressionStatementNode(assign(reference(localVariableDeclaration), LiteralNode.literal("[updated value]"))));
val exception = assertThrows(VariableNotInScope.class,
() -> runMethod(method));