diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-04 18:58:19 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-04 18:58:19 +0000 |
| commit | bb0b36b86f841ec6340fe6e727ed2ea9db1c2d64 (patch) | |
| tree | 463348e681f5140169f852db1d32297e7611d700 /src/main/java/org/zwobble/couscous/ast | |
| parent | 909f9d629808da383e6c9e8e514711382cdc331e (diff) | |
Capture "this" references
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
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(); } |
