aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-04 20:57:00 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-04 20:57:00 +0100
commitcdf51cdb9b3f8cef5896315496f348d9f7220903 (patch)
tree6dc623930652236499980f46da75547797511045 /src/main/java
parent6e45abd92526df9fce5d263eefed7fcaa400a86d (diff)
Add separate notion of VariableDeclaration
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java10
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java14
-rw-r--r--src/main/java/org/zwobble/couscous/ast/VariableDeclaration.java12
-rw-r--r--src/main/java/org/zwobble/couscous/ast/VariableNode.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Environment.java7
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/StackFrameBuilder.java9
7 files changed, 40 insertions, 19 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java b/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java
index 947a015..cd2cb86 100644
--- a/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java
@@ -4,9 +4,11 @@ import org.zwobble.couscous.values.TypeReference;
import lombok.Value;
-@Value
+@Value(staticConstructor="formalArg")
public class FormalArgumentNode implements VariableNode {
- int id;
- TypeReference type;
- String name;
+ VariableDeclaration declaration;
+
+ public TypeReference getType() {
+ return declaration.getType();
+ }
}
diff --git a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
index 880a7fd..cf6c5f0 100644
--- a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
@@ -3,13 +3,21 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.ast.visitors.StatementNodeVisitor;
import org.zwobble.couscous.values.TypeReference;
+import static org.zwobble.couscous.ast.VariableDeclaration.var;
+
import lombok.Value;
@Value(staticConstructor="localVariableDeclaration")
public class LocalVariableDeclarationNode implements VariableNode, StatementNode {
- int id;
- TypeReference type;
- String name;
+ public static LocalVariableDeclarationNode localVariableDeclaration(
+ int id,
+ String name,
+ TypeReference type,
+ ExpressionNode initialValue) {
+ return localVariableDeclaration(var(id, name, type), initialValue);
+ }
+
+ VariableDeclaration declaration;
ExpressionNode initialValue;
@Override
diff --git a/src/main/java/org/zwobble/couscous/ast/VariableDeclaration.java b/src/main/java/org/zwobble/couscous/ast/VariableDeclaration.java
new file mode 100644
index 0000000..3a60412
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/VariableDeclaration.java
@@ -0,0 +1,12 @@
+package org.zwobble.couscous.ast;
+
+import org.zwobble.couscous.values.TypeReference;
+
+import lombok.Value;
+
+@Value(staticConstructor="var")
+public class VariableDeclaration {
+ int id;
+ String name;
+ TypeReference type;
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/VariableNode.java b/src/main/java/org/zwobble/couscous/ast/VariableNode.java
index acfa29b..c526db1 100644
--- a/src/main/java/org/zwobble/couscous/ast/VariableNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/VariableNode.java
@@ -1,8 +1,5 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.values.TypeReference;
-
public interface VariableNode {
- int getId();
- TypeReference getType();
+ VariableDeclaration getDeclaration();
}
diff --git a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
index 536a7c3..2410549 100644
--- a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
@@ -7,7 +7,7 @@ import lombok.Value;
@Value
public class VariableReferenceNode implements ExpressionNode {
public static VariableReferenceNode reference(VariableNode variable) {
- return new VariableReferenceNode(variable.getId());
+ return new VariableReferenceNode(variable.getDeclaration().getId());
}
int referentId;
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Environment.java b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
index 21cfe04..6838ba5 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Environment.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
@@ -4,6 +4,7 @@ import java.util.Map;
import java.util.Optional;
import org.zwobble.couscous.Project;
+import org.zwobble.couscous.ast.VariableDeclaration;
import org.zwobble.couscous.ast.VariableNode;
import org.zwobble.couscous.values.ConcreteType;
import org.zwobble.couscous.values.InterpreterValue;
@@ -20,7 +21,7 @@ public class Environment {
private final Project project;
private final Map<Integer, VariableEntry> stackFrame;
- public Environment(Project project, Map<VariableNode, Optional<InterpreterValue>> stackFrame) {
+ public Environment(Project project, Map<VariableDeclaration, Optional<InterpreterValue>> stackFrame) {
this.project = project;
this.stackFrame = stackFrame.entrySet()
.stream()
@@ -42,7 +43,7 @@ public class Environment {
}
public void put(VariableNode variable, InterpreterValue value) {
- put(variable.getId(), value);
+ put(variable.getDeclaration().getId(), value);
}
public ConcreteType<?> findClass(String className) {
@@ -50,7 +51,7 @@ public class Environment {
return project.findClass(className);
}
- public Environment withStackFrame(Map<VariableNode, Optional<InterpreterValue>> stackFrame) {
+ public Environment withStackFrame(Map<VariableDeclaration, Optional<InterpreterValue>> stackFrame) {
return new Environment(project, stackFrame);
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/StackFrameBuilder.java b/src/main/java/org/zwobble/couscous/interpreter/StackFrameBuilder.java
index 658bf42..3b163f3 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/StackFrameBuilder.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/StackFrameBuilder.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.interpreter;
import java.util.Map;
+import org.zwobble.couscous.ast.VariableDeclaration;
import org.zwobble.couscous.ast.VariableNode;
import org.zwobble.couscous.values.InterpreterValue;
@@ -10,20 +11,20 @@ import com.google.common.collect.ImmutableMap;
import java.util.Optional;
public class StackFrameBuilder {
- private final ImmutableMap.Builder<VariableNode, Optional<InterpreterValue>> variables
+ private final ImmutableMap.Builder<VariableDeclaration, Optional<InterpreterValue>> variables
= ImmutableMap.builder();
public StackFrameBuilder declare(VariableNode variable, InterpreterValue value) {
- variables.put(variable, Optional.of(value));
+ variables.put(variable.getDeclaration(), Optional.of(value));
return this;
}
public StackFrameBuilder declare(VariableNode variable) {
- variables.put(variable, Optional.empty());
+ variables.put(variable.getDeclaration(), Optional.empty());
return this;
}
- public Map<VariableNode, Optional<InterpreterValue>> build() {
+ public Map<VariableDeclaration, Optional<InterpreterValue>> build() {
return variables.build();
}
}