aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/frontends
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-09 12:28:19 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-09 12:28:19 +0100
commitf005b283a1b1c74c8b98499069e6afcb5e9a9ade (patch)
treed56dfb884ba10225c7268e8b950f8ef826b51670 /src/main/java/org/zwobble/couscous/frontends
parent8fe29f6add04fb9c2dbc3ad1d13d582787aa6e88 (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.java22
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());
}