create TypeParameterDescriptorInitialization

This commit is contained in:
Stepan Koltsov
2011-12-19 21:36:34 +04:00
parent 67ca049683
commit f0dfa436ad
@@ -56,9 +56,24 @@ public class JavaDescriptorResolver {
return visitor.visitDeclarationDescriptor(this, data); return visitor.visitDeclarationDescriptor(this, data);
} }
}; };
private enum TypeParameterDescriptorOrigin {
JAVA,
KOTLIN,
}
private static class TypeParameterDescriptorInitialization {
private final TypeParameterDescriptorOrigin origin;
private final TypeParameterDescriptor descriptor;
private TypeParameterDescriptorInitialization(TypeParameterDescriptorOrigin origin, TypeParameterDescriptor descriptor) {
this.origin = origin;
this.descriptor = descriptor;
}
}
protected final Map<String, ClassDescriptor> classDescriptorCache = Maps.newHashMap(); protected final Map<String, ClassDescriptor> classDescriptorCache = Maps.newHashMap();
protected final Map<PsiTypeParameter, TypeParameterDescriptor> typeParameterDescriptorCache = Maps.newHashMap(); protected final Map<PsiTypeParameter, TypeParameterDescriptorInitialization> typeParameterDescriptorCache = Maps.newHashMap();
protected final Map<PsiMethod, FunctionDescriptor> methodDescriptorCache = Maps.newHashMap(); protected final Map<PsiMethod, FunctionDescriptor> methodDescriptorCache = Maps.newHashMap();
protected final Map<PsiField, VariableDescriptor> fieldDescriptorCache = Maps.newHashMap(); protected final Map<PsiField, VariableDescriptor> fieldDescriptorCache = Maps.newHashMap();
protected final Map<PsiElement, NamespaceDescriptor> namespaceDescriptorCache = Maps.newHashMap(); protected final Map<PsiElement, NamespaceDescriptor> namespaceDescriptorCache = Maps.newHashMap();
@@ -264,7 +279,7 @@ public class JavaDescriptorResolver {
name, name,
++index); ++index);
PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(clazz, clazz.getQualifiedName(), name); PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(clazz, clazz.getQualifiedName(), name);
typeParameterDescriptorCache.put(psiTypeParameter, typeParameter); typeParameterDescriptorCache.put(psiTypeParameter, new TypeParameterDescriptorInitialization(TypeParameterDescriptorOrigin.KOTLIN, typeParameter));
r.add(typeParameter); r.add(typeParameter);
} }
@@ -317,21 +332,26 @@ public class JavaDescriptorResolver {
psiTypeParameter.getName(), psiTypeParameter.getName(),
psiTypeParameter.getIndex() psiTypeParameter.getIndex()
); );
typeParameterDescriptorCache.put(psiTypeParameter, typeParameterDescriptor); typeParameterDescriptorCache.put(psiTypeParameter, new TypeParameterDescriptorInitialization(TypeParameterDescriptorOrigin.JAVA, typeParameterDescriptor));
return typeParameterDescriptor; return typeParameterDescriptor;
} }
private void initializeTypeParameter(PsiTypeParameter typeParameter, TypeParameterDescriptor typeParameterDescriptor) { private void initializeTypeParameter(PsiTypeParameter typeParameter, TypeParameterDescriptorInitialization typeParameterDescriptorInitialization) {
PsiClassType[] referencedTypes = typeParameter.getExtendsList().getReferencedTypes(); TypeParameterDescriptor typeParameterDescriptor = typeParameterDescriptorInitialization.descriptor;
if (referencedTypes.length == 0){ if (typeParameterDescriptorInitialization.origin == TypeParameterDescriptorOrigin.KOTLIN) {
typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType()); // TODO
} } else {
else if (referencedTypes.length == 1) { PsiClassType[] referencedTypes = typeParameter.getExtendsList().getReferencedTypes();
typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0])); if (referencedTypes.length == 0){
} typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
else { }
for (PsiClassType referencedType : referencedTypes) { else if (referencedTypes.length == 1) {
typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType)); typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0]));
}
else {
for (PsiClassType referencedType : referencedTypes) {
typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType));
}
} }
} }
typeParameterDescriptor.setInitialized(); typeParameterDescriptor.setInitialized();
@@ -339,13 +359,13 @@ public class JavaDescriptorResolver {
private void initializeTypeParameters(PsiTypeParameterListOwner typeParameterListOwner) { private void initializeTypeParameters(PsiTypeParameterListOwner typeParameterListOwner) {
for (PsiTypeParameter psiTypeParameter : typeParameterListOwner.getTypeParameters()) { for (PsiTypeParameter psiTypeParameter : typeParameterListOwner.getTypeParameters()) {
initializeTypeParameter(psiTypeParameter, resolveTypeParameter(psiTypeParameter)); initializeTypeParameter(psiTypeParameter, resolveTypeParameterInitialization(psiTypeParameter));
} }
} }
@NotNull @NotNull
private TypeParameterDescriptor resolveTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) { private TypeParameterDescriptorInitialization resolveTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
TypeParameterDescriptor typeParameterDescriptor = typeParameterDescriptorCache.get(psiTypeParameter); TypeParameterDescriptorInitialization typeParameterDescriptor = typeParameterDescriptorCache.get(psiTypeParameter);
assert typeParameterDescriptor != null : psiTypeParameter.getText(); assert typeParameterDescriptor != null : psiTypeParameter.getText();
return typeParameterDescriptor; return typeParameterDescriptor;
} }
@@ -681,7 +701,7 @@ public class JavaDescriptorResolver {
name, name,
++index); ++index);
PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(method, method.getName(), name); PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(method, method.getName(), name);
typeParameterDescriptorCache.put(psiTypeParameter, typeParameter); typeParameterDescriptorCache.put(psiTypeParameter, new TypeParameterDescriptorInitialization(TypeParameterDescriptorOrigin.KOTLIN, typeParameter));
r.add(typeParameter); r.add(typeParameter);
} }
}; };
@@ -733,7 +753,8 @@ public class JavaDescriptorResolver {
(modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL)); (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
} }
public TypeParameterDescriptor resolveTypeParameter(PsiTypeParameter typeParameter) { @NotNull
private TypeParameterDescriptorInitialization resolveTypeParameterInitialization(PsiTypeParameter typeParameter) {
PsiTypeParameterListOwner owner = typeParameter.getOwner(); PsiTypeParameterListOwner owner = typeParameter.getOwner();
if (owner instanceof PsiClass) { if (owner instanceof PsiClass) {
PsiClass psiClass = (PsiClass) owner; PsiClass psiClass = (PsiClass) owner;
@@ -758,4 +779,8 @@ public class JavaDescriptorResolver {
} }
throw new IllegalStateException("Unknown parent type: " + owner); throw new IllegalStateException("Unknown parent type: " + owner);
} }
public TypeParameterDescriptor resolveTypeParameter(PsiTypeParameter typeParameter) {
return resolveTypeParameterInitialization(typeParameter).descriptor;
}
} }