diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-03-17 22:33:15 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-03-18 08:00:10 +0000 |
| commit | cea82209e5aa312f4a513308c148d3e944004cb4 (patch) | |
| tree | 6f7e5fa7bb1656b4650bb227866195f35bc962e0 /src/main/java/org/zwobble/couscous/frontends | |
| parent | 5687fd7f88485f95e970b3d93fbf2800e84eb3b8 (diff) | |
Improve support for generics
Diffstat (limited to 'src/main/java/org/zwobble/couscous/frontends')
3 files changed, 14 insertions, 8 deletions
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())) ))); }); |
