aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
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
parent63fc003231e92e8f5ea2af29a04ba5507c212325 (diff)
Add MethodTypeParameter
Diffstat (limited to 'src/main/java')
-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
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java10
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java6
-rw-r--r--src/main/java/org/zwobble/couscous/backends/naming/Names.java5
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java4
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Interpreter.java1
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java5
-rw-r--r--src/main/java/org/zwobble/couscous/types/MethodTypeParameter.java45
-rw-r--r--src/main/java/org/zwobble/couscous/types/Type.java1
-rw-r--r--src/main/java/org/zwobble/couscous/types/Types.java15
13 files changed, 117 insertions, 5 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);
}
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java
index 00de205..86afe8e 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java
@@ -59,6 +59,11 @@ public class CsharpCodeGenerator {
}
@Override
+ public Type visit(MethodTypeParameter parameter) {
+ return parameter;
+ }
+
+ @Override
public TypeParameter visit(TypeParameter parameter) {
return parameter;
}
@@ -114,6 +119,11 @@ public class CsharpCodeGenerator {
}
@Override
+ public Type visit(MethodTypeParameter parameter) {
+ return parameter;
+ }
+
+ @Override
public TypeParameter visit(TypeParameter parameter) {
return parameter;
}
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
index 13c3756..f5f75ec 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -537,6 +537,12 @@ public class CsharpSerializer implements NodeVisitor {
}
@Override
+ public Void visit(MethodTypeParameter parameter) {
+ writer.writeIdentifier(parameter.getName());
+ return null;
+ }
+
+ @Override
public Void visit(TypeParameter parameter) {
writer.writeIdentifier(parameter.getName());
return null;
diff --git a/src/main/java/org/zwobble/couscous/backends/naming/Names.java b/src/main/java/org/zwobble/couscous/backends/naming/Names.java
index a547742..e018e7b 100644
--- a/src/main/java/org/zwobble/couscous/backends/naming/Names.java
+++ b/src/main/java/org/zwobble/couscous/backends/naming/Names.java
@@ -24,6 +24,11 @@ public class Names {
}
@Override
+ public String visit(MethodTypeParameter parameter) {
+ return parameter.getName();
+ }
+
+ @Override
public String visit(TypeParameter parameter) {
return typeToString(parameter.getDeclaringType()) + "_" + parameter.getName();
}
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java
index f803fff..b52110f 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java
@@ -11,6 +11,7 @@ import java.util.List;
import static java.util.Arrays.asList;
import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+import static org.zwobble.couscous.util.ExtraLists.list;
class JavaMethods {
static MethodSignature signature(IMethodBinding method) {
@@ -21,7 +22,7 @@ class JavaMethods {
Type returnType = typeOf(method.getReturnType());
if (declaringClass.isEqualTo(erasedDeclaringClass)) {
- return new MethodSignature(method.getName(), argumentTypes, returnType);
+ return new MethodSignature(method.getName(), list(), argumentTypes, returnType);
} else {
IMethodBinding[] erasedMethods = erasedDeclaringClass.getDeclaredMethods();
IMethodBinding erasedMethod = Iterables.getOnlyElement(Iterables.filter(
@@ -29,6 +30,7 @@ class JavaMethods {
m -> m.isSubsignature(method)));
return new MethodSignature(
method.getName(),
+ list(),
eagerMap(
argumentTypes,
asList(erasedMethod.getParameterTypes()),
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
index a87b203..3df2540 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
@@ -29,6 +29,7 @@ public class Interpreter {
StaticReceiverValue clazz = environment.findClass(className);
MethodSignature signature = new MethodSignature(
methodName,
+ list(),
eagerMap(arguments, argument -> argument.getType().getType()),
returnType);
return clazz.callMethod(environment, signature, new Arguments(list(), arguments));
diff --git a/src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java b/src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java
index 01418fa..b53b274 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java
@@ -17,6 +17,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.function.BiFunction;
+import static org.zwobble.couscous.ast.MethodSignature.signature;
import static org.zwobble.couscous.util.Casts.tryCast;
import static org.zwobble.couscous.util.ExtraLists.list;
import static org.zwobble.couscous.util.ExtraSets.set;
@@ -63,7 +64,7 @@ public class IntrinsicInterpreterType implements InterpreterType {
Type returnType,
BiFunction<Environment, MethodCallArguments<T>, InterpreterValue> method)
{
- methods.put(new MethodSignature(name, argumentsTypes, returnType), toMethodValue(argumentsTypes, method));
+ methods.put(signature(name, argumentsTypes, returnType), toMethodValue(argumentsTypes, method));
return this;
}
@@ -82,7 +83,7 @@ public class IntrinsicInterpreterType implements InterpreterType {
Type returnType,
BiFunction<Environment, Arguments, InterpreterValue> method)
{
- staticMethods.put(new MethodSignature(name, argumentsTypes, returnType), new StaticMethodValue(argumentsTypes, method));
+ staticMethods.put(signature(name, argumentsTypes, returnType), new StaticMethodValue(argumentsTypes, method));
return this;
}
diff --git a/src/main/java/org/zwobble/couscous/types/MethodTypeParameter.java b/src/main/java/org/zwobble/couscous/types/MethodTypeParameter.java
new file mode 100644
index 0000000..323ec17
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/types/MethodTypeParameter.java
@@ -0,0 +1,45 @@
+package org.zwobble.couscous.types;
+
+public class MethodTypeParameter implements Type {
+ public static MethodTypeParameter methodTypeParameter(String name) {
+ return new MethodTypeParameter(name);
+ }
+
+ private final String name;
+
+ public MethodTypeParameter(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public <T> T accept(Visitor<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public String toString() {
+ return "MethodTypeParameter(" +
+ "name=" + name +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ MethodTypeParameter that = (MethodTypeParameter) o;
+
+ return name.equals(that.name);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return name.hashCode();
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/types/Type.java b/src/main/java/org/zwobble/couscous/types/Type.java
index ad0f6fc..5261aa2 100644
--- a/src/main/java/org/zwobble/couscous/types/Type.java
+++ b/src/main/java/org/zwobble/couscous/types/Type.java
@@ -5,6 +5,7 @@ public interface Type {
interface Visitor<T> {
T visit(ScalarType type);
+ T visit(MethodTypeParameter parameter);
T visit(TypeParameter parameter);
T visit(ParameterizedType type);
T visit(BoundTypeParameter type);
diff --git a/src/main/java/org/zwobble/couscous/types/Types.java b/src/main/java/org/zwobble/couscous/types/Types.java
index 89e88a6..1dfc202 100644
--- a/src/main/java/org/zwobble/couscous/types/Types.java
+++ b/src/main/java/org/zwobble/couscous/types/Types.java
@@ -28,6 +28,11 @@ public class Types {
}
@Override
+ public ScalarType visit(MethodTypeParameter parameter) {
+ return OBJECT;
+ }
+
+ @Override
public ScalarType visit(TypeParameter parameter) {
return OBJECT;
}
@@ -52,6 +57,11 @@ public class Types {
}
@Override
+ public Type visit(MethodTypeParameter parameter) {
+ return parameter;
+ }
+
+ @Override
public Type visit(TypeParameter type) {
return replacements.getOrDefault(type, type);
}
@@ -78,6 +88,11 @@ public class Types {
}
@Override
+ public Type visit(MethodTypeParameter parameter) {
+ return parameter;
+ }
+
+ @Override
public Type visit(TypeParameter parameter) {
return parameter;
}