create TypeParameterDescriptorInitialization
This commit is contained in:
+44
-19
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user