aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-17 16:59:05 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-17 16:59:05 +0100
commita97acb1a85c588a38a4a8a8b761beddb71cb960a (patch)
tree658f878936c3fcdbca452feb8dc972ac3449b21b /src
parent886358792f8b2bee4fb2a2e16b8f34162be50cfe (diff)
Use String instead of int for declaration IDs
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/VariableDeclaration.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Environment.java10
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/UnboundVariable.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/VariableNotInScope.java2
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java5
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java9
-rw-r--r--src/test/java/org/zwobble/couscous/tests/TestIds.java5
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java5
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java15
11 files changed, 34 insertions, 25 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
index 66d06aa..6294e38 100644
--- a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
@@ -9,7 +9,7 @@ import lombok.Value;
@Value(staticConstructor="localVariableDeclaration")
public class LocalVariableDeclarationNode implements VariableNode, StatementNode {
public static LocalVariableDeclarationNode localVariableDeclaration(
- int id,
+ String id,
String name,
TypeName type,
ExpressionNode initialValue) {
diff --git a/src/main/java/org/zwobble/couscous/ast/VariableDeclaration.java b/src/main/java/org/zwobble/couscous/ast/VariableDeclaration.java
index 009dea4..84c0d43 100644
--- a/src/main/java/org/zwobble/couscous/ast/VariableDeclaration.java
+++ b/src/main/java/org/zwobble/couscous/ast/VariableDeclaration.java
@@ -4,7 +4,7 @@ import lombok.Value;
@Value(staticConstructor="var")
public class VariableDeclaration {
- int id;
+ String id;
String name;
TypeName type;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
index ebe79b0..6fc00f6 100644
--- a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
@@ -18,7 +18,7 @@ public class VariableReferenceNode implements AssignableExpressionNode {
return visitor.visit(this);
}
- public int getReferentId() {
+ public String getReferentId() {
return referent.getId();
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Environment.java b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
index 9a884f3..675cfda 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Environment.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
@@ -19,7 +19,7 @@ import lombok.val;
public class Environment {
private final Project project;
private final Optional<InterpreterValue> thisValue;
- private final Map<Integer, VariableEntry> stackFrame;
+ private final Map<String, VariableEntry> stackFrame;
public Environment(
Project project,
@@ -38,13 +38,13 @@ public class Environment {
return thisValue;
}
- public InterpreterValue get(int variableId) {
+ public InterpreterValue get(String variableId) {
checkVariableIsInScope(variableId);
val entry = stackFrame.get(variableId);
return entry.getValue().orElseThrow(() -> new UnboundVariable(variableId));
}
- public void put(int variableId, InterpreterValue value) {
+ public void put(String variableId, InterpreterValue value) {
checkVariableIsInScope(variableId);
checkVariableType(variableId, value);
stackFrame.get(variableId).setValue(Optional.of(value));
@@ -62,13 +62,13 @@ public class Environment {
return new Environment(project, thisValue, stackFrame);
}
- private void checkVariableIsInScope(int variableId) {
+ private void checkVariableIsInScope(String variableId) {
if (!stackFrame.containsKey(variableId)) {
throw new VariableNotInScope(variableId);
}
}
- private void checkVariableType(int variableId, InterpreterValue value) {
+ private void checkVariableType(String variableId, InterpreterValue value) {
val variableType = stackFrame.get(variableId).getType();
InterpreterTypes.checkIsInstance(variableType, value);
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/UnboundVariable.java b/src/main/java/org/zwobble/couscous/interpreter/UnboundVariable.java
index c4aebfb..684a3b9 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/UnboundVariable.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/UnboundVariable.java
@@ -8,5 +8,5 @@ import lombok.Value;
public class UnboundVariable extends InterpreterException {
private static final long serialVersionUID = 1L;
- int variableId;
+ String variableId;
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/VariableNotInScope.java b/src/main/java/org/zwobble/couscous/interpreter/VariableNotInScope.java
index 7760326..17ab6af 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/VariableNotInScope.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/VariableNotInScope.java
@@ -8,5 +8,5 @@ import lombok.Value;
public class VariableNotInScope extends InterpreterException {
private static final long serialVersionUID = 1L;
- int variableId;
+ String variableId;
}
diff --git a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java
index 08911c9..99c1479 100644
--- a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java
@@ -24,6 +24,7 @@ import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall;
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;
import static org.zwobble.couscous.values.PrimitiveValues.value;
import lombok.val;
@@ -100,7 +101,7 @@ public abstract class BackendEvalTests {
@Test
public void canCallInstanceMethodWithArgumentsOnUserDefinedClass() {
- val argument = formalArg(var(42, "x", IntegerValue.REF));
+ val argument = formalArg(var(ANY_ID, "x", IntegerValue.REF));
val classNode = ClassNode.builder("com.example.Example")
.method("main", method -> method
.argument(argument)
@@ -120,7 +121,7 @@ public abstract class BackendEvalTests {
@Test
public void constructorIsExecutedOnConstruction() {
- val argument = formalArg(var(42, "x", IntegerValue.REF));
+ val argument = formalArg(var(ANY_ID, "x", IntegerValue.REF));
val classNode = ClassNode.builder("com.example.Example")
.field("value", IntegerValue.REF)
.constructor(constructor -> constructor
diff --git a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
index fd6d91e..44ad2a4 100644
--- a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
@@ -19,6 +19,7 @@ import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariabl
import static org.zwobble.couscous.ast.MethodNode.staticMethod;
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;
import static org.zwobble.couscous.values.PrimitiveValues.value;
import lombok.val;
@@ -42,7 +43,7 @@ public abstract class BackendMethodTests {
}
@Test
public void canPassValueToMethod() {
- val arg = formalArg(var(42, "x", StringValue.REF));
+ val arg = formalArg(var(ANY_ID, "x", StringValue.REF));
val method = staticMethod("hello")
.argument(arg)
.statement(new ReturnNode(reference(arg)));
@@ -53,7 +54,7 @@ public abstract class BackendMethodTests {
@Test
public void canReassignValueToArgument() {
- val arg = formalArg(var(42, "x", StringValue.REF));
+ 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]"))))
@@ -66,7 +67,7 @@ public abstract class BackendMethodTests {
@Test
public void canDeclareVariable() {
val localVariableDeclaration = localVariableDeclaration(
- 42, "x", StringValue.REF, LiteralNode.literal("[initial value]"));
+ ANY_ID, "x", StringValue.REF, LiteralNode.literal("[initial value]"));
val method = staticMethod("hello")
.statement(localVariableDeclaration)
.statement(new ReturnNode(reference(localVariableDeclaration)));
@@ -78,7 +79,7 @@ public abstract class BackendMethodTests {
@Test
public void canDeclareVariableAndThenAssignValues() {
val localVariableDeclaration = localVariableDeclaration(
- 42, "x", StringValue.REF, LiteralNode.literal("[initial value]"));
+ 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]"))))
diff --git a/src/test/java/org/zwobble/couscous/tests/TestIds.java b/src/test/java/org/zwobble/couscous/tests/TestIds.java
new file mode 100644
index 0000000..50f0ad9
--- /dev/null
+++ b/src/test/java/org/zwobble/couscous/tests/TestIds.java
@@ -0,0 +1,5 @@
+package org.zwobble.couscous.tests;
+
+public class TestIds {
+ public static final String ANY_ID = "[id]";
+}
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 005eebb..c438128 100644
--- a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
@@ -38,6 +38,7 @@ import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
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;
+import static org.zwobble.couscous.tests.TestIds.ANY_ID;
import static org.zwobble.couscous.tests.util.ExtraAsserts.assertThrows;
import lombok.val;
@@ -45,7 +46,7 @@ import lombok.val;
public class EvaluatorTests extends BackendEvalTests {
@Test
public void valueOfAssignmentExpressionIsNewValue() {
- val arg = formalArg(var(42, "x", StringValue.REF));
+ val arg = formalArg(var(ANY_ID, "x", StringValue.REF));
val environment = new Environment(
new MapBackedProject(ImmutableMap.of()),
Optional.empty(),
@@ -100,7 +101,7 @@ public class EvaluatorTests extends BackendEvalTests {
@Test
public void errorIfConstructorArgumentIsWrongType() {
- val argument = formalArg(var(42, "x", IntegerValue.REF));
+ val argument = formalArg(var(ANY_ID, "x", IntegerValue.REF));
val classNode = ClassNode.builder("com.example.Example")
.constructor(constructor -> constructor
.argument(argument))
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 cd00690..9d23a45 100644
--- a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java
@@ -30,6 +30,7 @@ import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariabl
import static org.zwobble.couscous.ast.MethodNode.staticMethod;
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;
import static org.zwobble.couscous.tests.util.ExtraAsserts.assertThrows;
import static org.zwobble.couscous.values.PrimitiveValues.value;
@@ -48,7 +49,7 @@ public class InterpreterMethodTests extends BackendMethodTests {
@Test
public void errorIfTryingToAssignValueOfWrongTypeToVariable() {
- val arg = formalArg(var(42, "x", StringValue.REF));
+ val arg = formalArg(var(ANY_ID, "x", StringValue.REF));
val method = staticMethod("hello")
.argument(arg)
.statement(new ExpressionStatementNode(new AssignmentNode(reference(arg), literal(0))));
@@ -62,33 +63,33 @@ public class InterpreterMethodTests extends BackendMethodTests {
@Test
public void errorIfTryingToAssignToVariableNotInScope() {
val localVariableDeclaration = localVariableDeclaration(
- 42, "x", StringValue.REF, literal(""));
+ ANY_ID, "x", StringValue.REF, literal(""));
val method = staticMethod("hello")
.statement(new ExpressionStatementNode(new AssignmentNode(reference(localVariableDeclaration), LiteralNode.literal("[updated value]"))));
val exception = assertThrows(VariableNotInScope.class,
() -> runMethod(method));
- assertEquals(new VariableNotInScope(42), exception);
+ assertEquals(new VariableNotInScope(ANY_ID), exception);
}
@Test
public void errorIfTryingToGetValueOfVariableNotInScope() {
val localVariableDeclaration = localVariableDeclaration(
- 42, "x", StringValue.REF, literal(""));
+ ANY_ID, "x", StringValue.REF, literal(""));
val method = staticMethod("hello")
.statement(new ReturnNode(reference(localVariableDeclaration)));
val exception = assertThrows(VariableNotInScope.class,
() -> runMethod(method));
- assertEquals(new VariableNotInScope(42), exception);
+ assertEquals(new VariableNotInScope(ANY_ID), exception);
}
@Test
public void errorIfTryingToGetValueOfUnboundVariable() {
val localVariableDeclaration = localVariableDeclaration(
- 42, "x", StringValue.REF, literal(""));
+ ANY_ID, "x", StringValue.REF, literal(""));
val method = staticMethod("hello")
.statement(new ReturnNode(reference(localVariableDeclaration)))
.statement(localVariableDeclaration);
@@ -96,7 +97,7 @@ public class InterpreterMethodTests extends BackendMethodTests {
val exception = assertThrows(UnboundVariable.class,
() -> runMethod(method));
- assertEquals(new UnboundVariable(42), exception);
+ assertEquals(new UnboundVariable(ANY_ID), exception);
}
@Override