aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-04 18:58:19 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-04 18:58:19 +0000
commitbb0b36b86f841ec6340fe6e727ed2ea9db1c2d64 (patch)
tree463348e681f5140169f852db1d32297e7611d700 /src/main/java/org/zwobble/couscous/ast
parent909f9d629808da383e6c9e8e514711382cdc331e (diff)
Capture "this" references
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ReferenceNode.java10
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java7
-rw-r--r--src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java7
-rw-r--r--src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java2
5 files changed, 27 insertions, 7 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java b/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java
index ab4b1ea..cad359d 100644
--- a/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java
@@ -10,16 +10,16 @@ import static org.zwobble.couscous.util.ExtraLists.eagerMap;
public class ConstructorCallNode implements ExpressionNode {
public static ConstructorCallNode constructorCall(
TypeName type,
- List<ExpressionNode> arguments) {
+ List<? extends ExpressionNode> arguments) {
return new ConstructorCallNode(type, arguments);
}
private final TypeName type;
- private final List<ExpressionNode> arguments;
+ private final List<? extends ExpressionNode> arguments;
public ConstructorCallNode(
TypeName type,
- List<ExpressionNode> arguments) {
+ List<? extends ExpressionNode> arguments) {
this.type = type;
this.arguments = arguments;
}
@@ -29,7 +29,7 @@ public class ConstructorCallNode implements ExpressionNode {
return type;
}
- public List<ExpressionNode> getArguments() {
+ public List<? extends ExpressionNode> getArguments() {
return arguments;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/ReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/ReferenceNode.java
new file mode 100644
index 0000000..6e76fcd
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/ReferenceNode.java
@@ -0,0 +1,10 @@
+package org.zwobble.couscous.ast;
+
+public interface ReferenceNode extends ExpressionNode {
+ interface Visitor<T> {
+ T visit(VariableReferenceNode variableReference);
+ T visit(ThisReferenceNode thisReference);
+ }
+
+ <T> T accept(Visitor<T> visitor);
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java
index 3ef5527..a4851c8 100644
--- a/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java
@@ -4,7 +4,7 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import java.util.function.Function;
-public class ThisReferenceNode implements ExpressionNode {
+public class ThisReferenceNode implements ExpressionNode, ReferenceNode {
public static ThisReferenceNode thisReference(TypeName type) {
return new ThisReferenceNode(type);
}
@@ -30,6 +30,11 @@ public class ThisReferenceNode implements ExpressionNode {
}
@Override
+ public <T> T accept(Visitor<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
public String toString() {
return "ThisReferenceNode(type=" + type + ")";
}
diff --git a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
index 50462e9..c1b022a 100644
--- a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
@@ -6,7 +6,7 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import java.util.function.Function;
-public class VariableReferenceNode implements AssignableExpressionNode {
+public class VariableReferenceNode implements AssignableExpressionNode, ReferenceNode {
public static VariableReferenceNode reference(VariableNode variable) {
return new VariableReferenceNode(variable.getDeclaration());
}
@@ -50,6 +50,11 @@ public class VariableReferenceNode implements AssignableExpressionNode {
}
@Override
+ public <T> T accept(Visitor<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
public String toString() {
return "VariableReferenceNode(referent=" + referent + ")";
}
diff --git a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
index 6054711..47ba9b6 100644
--- a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
+++ b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
@@ -70,7 +70,7 @@ public class NodeStructure {
}
@Override
- public Stream<ExpressionNode> visit(ConstructorCallNode call) {
+ public Stream<? extends ExpressionNode> visit(ConstructorCallNode call) {
return call.getArguments().stream();
}