aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-05 22:51:25 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-05 22:51:25 +0100
commit8fe29f6add04fb9c2dbc3ad1d13d582787aa6e88 (patch)
treeddfaa3d0dd651e2ad26def00119773529677d8b7 /src/main/java/org/zwobble/couscous/ast
parent63fc003231e92e8f5ea2af29a04ba5507c212325 (diff)
Add MethodTypeParameter
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodSignature.java20
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java6
4 files changed, 28 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index 5e55153..adc3b05 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -10,6 +10,7 @@ import java.util.List;
import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver;
import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+import static org.zwobble.couscous.util.ExtraLists.list;
public class MethodCallNode implements ExpressionNode {
public static ExpressionNode staticMethodCall(
@@ -74,6 +75,7 @@ public class MethodCallNode implements ExpressionNode {
{
MethodSignature signature = new MethodSignature(
methodName,
+ list(),
eagerMap(arguments, argument -> argument.getType()),
type);
return methodCall(receiver, methodName, arguments, signature);
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
index 1e682fb..de86a15 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
@@ -10,6 +10,7 @@ import java.util.List;
import java.util.Optional;
import java.util.function.Function;
+import static org.zwobble.couscous.types.MethodTypeParameter.methodTypeParameter;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
import static org.zwobble.couscous.util.ExtraLists.list;
@@ -173,6 +174,7 @@ public class MethodNode implements Node {
public MethodSignature signature() {
return new MethodSignature(
name,
+ eagerMap(typeParameters, parameter -> methodTypeParameter(parameter.getName())),
eagerMap(arguments, argument -> argument.getType()),
returnType);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodSignature.java b/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
index 715dade..8c907e3 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodSignature.java
@@ -1,23 +1,31 @@
package org.zwobble.couscous.ast;
+import org.zwobble.couscous.types.MethodTypeParameter;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.types.Types;
import java.util.List;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+import static org.zwobble.couscous.util.ExtraLists.list;
public class MethodSignature {
public static MethodSignature signature(String name, List<Type> arguments, Type returnType) {
- return new MethodSignature(name, arguments, returnType);
+ return signature(name, list(), arguments, returnType);
+ }
+
+ public static MethodSignature signature(String name, List<MethodTypeParameter> typeParameters, List<Type> arguments, Type returnType) {
+ return new MethodSignature(name, typeParameters, arguments, returnType);
}
private final String name;
+ private final List<MethodTypeParameter> typeParameters;
private final List<Type> arguments;
private final Type returnType;
- public MethodSignature(String name, List<Type> arguments, Type returnType) {
+ public MethodSignature(String name, List<MethodTypeParameter> typeParameters, List<Type> arguments, Type returnType) {
this.name = name;
+ this.typeParameters = typeParameters;
this.arguments = arguments;
this.returnType = returnType;
}
@@ -26,6 +34,10 @@ public class MethodSignature {
return name;
}
+ public List<MethodTypeParameter> getTypeParameters() {
+ return typeParameters;
+ }
+
public List<Type> getArguments() {
return arguments;
}
@@ -37,6 +49,7 @@ public class MethodSignature {
public MethodSignature generic() {
return new MethodSignature(
name,
+ typeParameters,
eagerMap(arguments, Types::generic),
Types.generic(returnType));
}
@@ -45,6 +58,7 @@ public class MethodSignature {
public String toString() {
return "MethodSignature(" +
"name='" + name + '\'' +
+ ", typeParameters=" + typeParameters +
", arguments=" + arguments +
", returnType=" + returnType +
')';
@@ -58,6 +72,7 @@ public class MethodSignature {
MethodSignature that = (MethodSignature) o;
if (!name.equals(that.name)) return false;
+ if (!typeParameters.equals(that.typeParameters)) return false;
if (!arguments.equals(that.arguments)) return false;
return returnType.equals(that.returnType);
@@ -66,6 +81,7 @@ public class MethodSignature {
@Override
public int hashCode() {
int result = name.hashCode();
+ result = 31 * result + typeParameters.hashCode();
result = 31 * result + arguments.hashCode();
result = 31 * result + returnType.hashCode();
return result;
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
index 710ef99..afa1681 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
@@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import org.zwobble.couscous.ast.*;
+import org.zwobble.couscous.types.MethodTypeParameter;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
@@ -207,6 +208,7 @@ public class NodeTransformer {
public MethodSignature transform(MethodSignature signature) {
return new MethodSignature(
transformMethodName(signature),
+ eagerMap(signature.getTypeParameters(), this::transform),
eagerMap(signature.getArguments(), this::transform),
transform(signature.getReturnType()));
}
@@ -219,6 +221,10 @@ public class NodeTransformer {
return (ScalarType)transformType.apply(type);
}
+ public MethodTypeParameter transform(MethodTypeParameter type) {
+ return (MethodTypeParameter)transformType.apply(type);
+ }
+
public String transformMethodName(MethodSignature signature) {
return transformMethodName.apply(signature);
}