aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-09 14:59:32 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-09 14:59:32 +0100
commit2bc236438ce5d5120c9c34f213b4b49b475dcee2 (patch)
treebe5008e70cf11ebece0c07165c86c034ddef3920 /src/main/java/org/zwobble/couscous/ast
parent0a550c3bb4e624d76b3876e92a2bd0e235301fba (diff)
Read generic signature for method calls
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java87
-rw-r--r--src/main/java/org/zwobble/couscous/ast/StaticReceiver.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java6
4 files changed, 55 insertions, 46 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index adc3b05..3f9b06b 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -87,23 +87,36 @@ public class MethodCallNode implements ExpressionNode {
List<ExpressionNode> arguments,
MethodSignature signature)
{
- return new MethodCallNode(receiver, methodName, arguments, signature);
+ return new MethodCallNode(receiver, methodName, arguments, signature.getReturnType(), signature);
+ }
+
+ public static MethodCallNode methodCall(
+ Receiver receiver,
+ String methodName,
+ List<ExpressionNode> arguments,
+ Type returnType,
+ MethodSignature signature)
+ {
+ return new MethodCallNode(receiver, methodName, arguments, returnType, signature);
}
private final Receiver receiver;
private final String methodName;
private final List<ExpressionNode> arguments;
+ private final Type returnType;
private final MethodSignature signature;
private MethodCallNode(
Receiver receiver,
String methodName,
List<ExpressionNode> arguments,
+ Type returnType,
MethodSignature signature)
{
this.receiver = receiver;
this.methodName = methodName;
this.arguments = arguments;
+ this.returnType = returnType;
this.signature = signature;
}
@@ -121,7 +134,7 @@ public class MethodCallNode implements ExpressionNode {
@Override
public Type getType() {
- return signature.getReturnType();
+ return returnType;
}
public MethodSignature signature() {
@@ -139,59 +152,43 @@ public class MethodCallNode implements ExpressionNode {
transformer.transformReceiver(receiver),
transformer.transformMethodName(signature()),
transformer.transformExpressions(arguments),
+ transformer.transform(returnType),
transformer.transform(signature));
}
@Override
public String toString() {
- return "MethodCallNode(receiver=" + receiver + ", methodName="
- + methodName + ", arguments=" + arguments + ", signature=" + signature
- + ")";
+ return "MethodCallNode(" +
+ "receiver=" + receiver +
+ ", methodName=" + methodName +
+ ", arguments=" + arguments +
+ ", returnType=" + returnType +
+ ", signature=" + signature +
+ ')';
}
@Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result
- + ((arguments == null) ? 0 : arguments.hashCode());
- result = prime * result
- + ((methodName == null) ? 0 : methodName.hashCode());
- result = prime * result
- + ((receiver == null) ? 0 : receiver.hashCode());
- result = prime * result + ((signature == null) ? 0 : signature.hashCode());
- return result;
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ MethodCallNode that = (MethodCallNode) o;
+
+ if (!receiver.equals(that.receiver)) return false;
+ if (!methodName.equals(that.methodName)) return false;
+ if (!arguments.equals(that.arguments)) return false;
+ if (!returnType.equals(that.returnType)) return false;
+ return signature.equals(that.signature);
+
}
@Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- MethodCallNode other = (MethodCallNode) obj;
- if (arguments == null) {
- if (other.arguments != null)
- return false;
- } else if (!arguments.equals(other.arguments))
- return false;
- if (methodName == null) {
- if (other.methodName != null)
- return false;
- } else if (!methodName.equals(other.methodName))
- return false;
- if (receiver == null) {
- if (other.receiver != null)
- return false;
- } else if (!receiver.equals(other.receiver))
- return false;
- if (signature == null) {
- if (other.signature != null)
- return false;
- } else if (!signature.equals(other.signature))
- return false;
- return true;
+ public int hashCode() {
+ int result = receiver.hashCode();
+ result = 31 * result + methodName.hashCode();
+ result = 31 * result + arguments.hashCode();
+ result = 31 * result + returnType.hashCode();
+ result = 31 * result + signature.hashCode();
+ return result;
}
}
diff --git a/src/main/java/org/zwobble/couscous/ast/StaticReceiver.java b/src/main/java/org/zwobble/couscous/ast/StaticReceiver.java
index 4a90ee7..bd59261 100644
--- a/src/main/java/org/zwobble/couscous/ast/StaticReceiver.java
+++ b/src/main/java/org/zwobble/couscous/ast/StaticReceiver.java
@@ -5,6 +5,10 @@ import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
public class StaticReceiver implements Receiver {
+ public static Receiver staticReceiver(String type) {
+ return new StaticReceiver(ScalarType.of(type));
+ }
+
public static Receiver staticReceiver(ScalarType type) {
return new StaticReceiver(type);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
index 721027f..503aa7e 100644
--- a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
@@ -4,9 +4,11 @@ import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import static org.zwobble.couscous.types.Types.concrete;
+
public class TypeCoercionNode implements ExpressionNode {
public static ExpressionNode coerce(ExpressionNode expression, Type type) {
- if (type.equals(expression.getType())) {
+ if (concrete(type).equals(concrete(expression.getType()))) {
return expression;
} else {
return new TypeCoercionNode(expression, type);
diff --git a/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java b/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java
index 9beac27..f413ec0 100644
--- a/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java
+++ b/src/main/java/org/zwobble/couscous/ast/identifiers/Identifiers.java
@@ -1,5 +1,7 @@
package org.zwobble.couscous.ast.identifiers;
+import org.zwobble.couscous.types.ScalarType;
+
public class Identifiers {
public static final Identifier TOP = new TopIdentifier();
@@ -26,4 +28,8 @@ public class Identifiers {
public static Identifier forType(String name) {
return type(TOP, name);
}
+
+ public static Identifier forType(ScalarType type) {
+ return forType(type.getQualifiedName());
+ }
}