From cea82209e5aa312f4a513308c148d3e944004cb4 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 17 Mar 2016 22:33:15 +0000 Subject: Improve support for generics --- .../couscous/frontends/java/JavaExpressionReader.java | 5 ++--- .../org/zwobble/couscous/frontends/java/JavaMethods.java | 15 +++++++++++---- .../org/zwobble/couscous/frontends/java/JavaReader.java | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/frontends') diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java index 096162f..46d2ab4 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java @@ -185,7 +185,6 @@ public class JavaExpressionReader { expression.resolveMethodBinding(), expression.arguments()); MethodSignature signature = JavaMethods.signature(expression.resolveMethodBinding()); - final Type type = signature.getReturnType(); IMethodBinding methodBinding = expression.resolveMethodBinding(); Type receiverType = typeOf(methodBinding.getDeclaringClass()); @@ -194,7 +193,7 @@ public class JavaExpressionReader { Types.erasure(receiverType), methodName, arguments, - type); + signature); } else { ExpressionNode receiver = expression.getExpression() == null ? ThisReferenceNode.thisReference(receiverType) @@ -203,7 +202,7 @@ public class JavaExpressionReader { receiver, methodName, arguments, - type); + signature); } } 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 42211fe..0273faa 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethods.java @@ -34,10 +34,17 @@ class JavaMethods { eagerMap( argumentTypes, asList(erasedMethod.getParameterTypes()), - (argumentType, erasedParameterType) -> new BoundTypeParameter((TypeParameter) typeOf(erasedParameterType), argumentType)), - new BoundTypeParameter( - (TypeParameter) typeOf(erasedMethod.getReturnType()), - returnType)); + (argumentType, erasedParameterType) -> typeParameterForGeneric(erasedParameterType, argumentType)), + typeParameterForGeneric(erasedMethod.getReturnType(), returnType)); + } + } + + private static Type typeParameterForGeneric(ITypeBinding erasedTypeBinding, Type type) { + Type erasedType = typeOf(erasedTypeBinding); + if (erasedType.equals(type)) { + return type; + } else { + return new BoundTypeParameter((TypeParameter) typeOf(erasedTypeBinding), type); } } } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 4afe02b..42d8f28 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -417,7 +417,7 @@ public class JavaReader { thisReference(type), methodNode.getName(), eagerMap(arguments, argument -> reference(argument)), - methodNode.getReturnType()), + methodNode.signature()), override.getReturnType())) ))); }); -- cgit v1.2.3