diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-04-05 22:51:25 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-04-05 22:51:25 +0100 |
| commit | 8fe29f6add04fb9c2dbc3ad1d13d582787aa6e88 (patch) | |
| tree | ddfaa3d0dd651e2ad26def00119773529677d8b7 /src/main/java/org | |
| parent | 63fc003231e92e8f5ea2af29a04ba5507c212325 (diff) | |
Add MethodTypeParameter
Diffstat (limited to 'src/main/java/org')
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; } |
