diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-04-09 12:28:19 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-04-09 12:28:19 +0100 |
| commit | f005b283a1b1c74c8b98499069e6afcb5e9a9ade (patch) | |
| tree | d56dfb884ba10225c7268e8b950f8ef826b51670 /src/main/java/org/zwobble/couscous/frontends | |
| parent | 8fe29f6add04fb9c2dbc3ad1d13d582787aa6e88 (diff) | |
Use Identifier instead of ScalarType in TypeParameter
Diffstat (limited to 'src/main/java/org/zwobble/couscous/frontends')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java index 3b7a472..4b3c5ea 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java @@ -2,6 +2,7 @@ package org.zwobble.couscous.frontends.java; import com.google.common.collect.ImmutableSet; import org.eclipse.jdt.core.dom.*; +import org.zwobble.couscous.ast.identifiers.Identifier; import org.zwobble.couscous.types.*; import org.zwobble.couscous.types.ParameterizedType; import org.zwobble.couscous.types.Type; @@ -42,11 +43,8 @@ public class JavaTypes { } ITypeBinding outerClass = typeBinding.getDeclaringClass(); if (typeBinding.isTypeVariable()) { - if (outerClass == null) { - // TODO: handle type variables for methods properly - outerClass = typeBinding.getDeclaringMethod().getDeclaringClass(); - } - return new TypeParameter(erasure(typeOf(outerClass)), typeBinding.getName()); + Identifier declaringScope = getDeclaringScope(typeBinding); + return new TypeParameter(declaringScope, typeBinding.getName()); } ScalarType rawType = outerClass == null ? ScalarType.of(typeBinding.getErasure().getQualifiedName()) @@ -62,6 +60,20 @@ public class JavaTypes { } } + private static Identifier getDeclaringScope(ITypeBinding typeParameter) { + if (typeParameter.getDeclaringClass() == null) { + IMethodBinding method = typeParameter.getDeclaringMethod(); + // TODO: disambiguate overloads + return identifierForType(method.getDeclaringClass()).extend(method.getName()); + } else { + return identifierForType(typeParameter.getDeclaringClass()); + } + } + + private static Identifier identifierForType(ITypeBinding type) { + return Identifier.TOP.extend(erasure(typeOf(type)).getQualifiedName()); + } + static Set<Type> superTypes(TypeDeclaration declaration) { return superTypes(declaration.resolveBinding()); } |
