refactoring: ResolverClassData internal structure in JavaDescriptorResolver
This commit is contained in:
+46
-34
@@ -86,7 +86,17 @@ public class JavaDescriptorResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final Map<String, ClassDescriptor> classDescriptorCache = Maps.newHashMap();
|
private static class ResolverClassData {
|
||||||
|
private JavaClassDescriptor classDescriptor;
|
||||||
|
private boolean kotlin;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public ClassDescriptor getClassDescriptor() {
|
||||||
|
return classDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final Map<String, ResolverClassData> classDescriptorCache = Maps.newHashMap();
|
||||||
protected final Map<PsiTypeParameter, TypeParameterDescriptorInitialization> 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();
|
||||||
@@ -122,12 +132,12 @@ public class JavaDescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Not let's take a descriptor of a Java class
|
// Not let's take a descriptor of a Java class
|
||||||
ClassDescriptor classDescriptor = classDescriptorCache.get(qualifiedName);
|
ResolverClassData classData = classDescriptorCache.get(qualifiedName);
|
||||||
if (classDescriptor == null) {
|
if (classData == null) {
|
||||||
classDescriptor = createJavaClassDescriptor(psiClass);
|
classData = createJavaClassDescriptor(psiClass);
|
||||||
classDescriptorCache.put(qualifiedName, classDescriptor);
|
classDescriptorCache.put(qualifiedName, classData);
|
||||||
}
|
}
|
||||||
return classDescriptor;
|
return classData.getClassDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -145,26 +155,27 @@ public class JavaDescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Not let's take a descriptor of a Java class
|
// Not let's take a descriptor of a Java class
|
||||||
ClassDescriptor classDescriptor = classDescriptorCache.get(qualifiedName);
|
ResolverClassData classData = classDescriptorCache.get(qualifiedName);
|
||||||
if (classDescriptor == null) {
|
if (classData == null) {
|
||||||
PsiClass psiClass = findClass(qualifiedName);
|
PsiClass psiClass = findClass(qualifiedName);
|
||||||
if (psiClass == null) {
|
if (psiClass == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
classDescriptor = createJavaClassDescriptor(psiClass);
|
classData = createJavaClassDescriptor(psiClass);
|
||||||
}
|
}
|
||||||
return classDescriptor;
|
return classData.getClassDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ClassDescriptor createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
|
private ResolverClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
|
||||||
assert !classDescriptorCache.containsKey(psiClass.getQualifiedName()) : psiClass.getQualifiedName();
|
assert !classDescriptorCache.containsKey(psiClass.getQualifiedName()) : psiClass.getQualifiedName();
|
||||||
classDescriptorCache.put(psiClass.getQualifiedName(), null); // TODO
|
classDescriptorCache.put(psiClass.getQualifiedName(), null); // TODO
|
||||||
|
|
||||||
String name = psiClass.getName();
|
String name = psiClass.getName();
|
||||||
JavaClassDescriptor classDescriptor = new JavaClassDescriptor(
|
ResolverClassData classData = new ResolverClassData();
|
||||||
|
classData.classDescriptor = new JavaClassDescriptor(
|
||||||
resolveParentDescriptor(psiClass), psiClass.isInterface() ? ClassKind.TRAIT : ClassKind.CLASS
|
resolveParentDescriptor(psiClass), psiClass.isInterface() ? ClassKind.TRAIT : ClassKind.CLASS
|
||||||
);
|
);
|
||||||
classDescriptor.setName(name);
|
classData.classDescriptor.setName(name);
|
||||||
|
|
||||||
class OuterClassTypeVariableResolver implements TypeVariableResolver {
|
class OuterClassTypeVariableResolver implements TypeVariableResolver {
|
||||||
|
|
||||||
@@ -176,9 +187,9 @@ public class JavaDescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<JetType> supertypes = new ArrayList<JetType>();
|
List<JetType> supertypes = new ArrayList<JetType>();
|
||||||
List<TypeParameterDescriptor> typeParameters = resolveClassTypeParameters(psiClass, classDescriptor, new OuterClassTypeVariableResolver());
|
List<TypeParameterDescriptor> typeParameters = resolveClassTypeParameters(psiClass, classData, new OuterClassTypeVariableResolver());
|
||||||
classDescriptor.setTypeConstructor(new TypeConstructorImpl(
|
classData.classDescriptor.setTypeConstructor(new TypeConstructorImpl(
|
||||||
classDescriptor,
|
classData.classDescriptor,
|
||||||
Collections.<AnnotationDescriptor>emptyList(), // TODO
|
Collections.<AnnotationDescriptor>emptyList(), // TODO
|
||||||
// TODO
|
// TODO
|
||||||
psiClass.hasModifierProperty(PsiModifier.FINAL),
|
psiClass.hasModifierProperty(PsiModifier.FINAL),
|
||||||
@@ -186,20 +197,20 @@ public class JavaDescriptorResolver {
|
|||||||
typeParameters,
|
typeParameters,
|
||||||
supertypes
|
supertypes
|
||||||
));
|
));
|
||||||
classDescriptor.setModality(Modality.convertFromFlags(
|
classData.classDescriptor.setModality(Modality.convertFromFlags(
|
||||||
psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
|
psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
|
||||||
!psiClass.hasModifierProperty(PsiModifier.FINAL))
|
!psiClass.hasModifierProperty(PsiModifier.FINAL))
|
||||||
);
|
);
|
||||||
classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
|
classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
|
||||||
classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor);
|
classDescriptorCache.put(psiClass.getQualifiedName(), classData);
|
||||||
classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false));
|
classData.classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classData.classDescriptor, psiClass, semanticServices, false));
|
||||||
|
|
||||||
// UGLY HACK (Andrey Breslav is not sure what did he mean)
|
// UGLY HACK (Andrey Breslav is not sure what did he mean)
|
||||||
initializeTypeParameters(psiClass);
|
initializeTypeParameters(psiClass);
|
||||||
|
|
||||||
supertypes.addAll(getSupertypes(psiClass));
|
supertypes.addAll(getSupertypes(psiClass));
|
||||||
if (psiClass.isInterface()) {
|
if (psiClass.isInterface()) {
|
||||||
classDescriptor.setSuperclassType(JetStandardClasses.getAnyType()); // TODO : Make it java.lang.Object
|
classData.classDescriptor.setSuperclassType(JetStandardClasses.getAnyType()); // TODO : Make it java.lang.Object
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PsiClassType[] extendsListTypes = psiClass.getExtendsListTypes();
|
PsiClassType[] extendsListTypes = psiClass.getExtendsListTypes();
|
||||||
@@ -207,7 +218,7 @@ public class JavaDescriptorResolver {
|
|||||||
JetType superclassType = extendsListTypes.length == 0
|
JetType superclassType = extendsListTypes.length == 0
|
||||||
? JetStandardClasses.getAnyType()
|
? JetStandardClasses.getAnyType()
|
||||||
: semanticServices.getTypeTransformer().transformToType(extendsListTypes[0]);
|
: semanticServices.getTypeTransformer().transformToType(extendsListTypes[0]);
|
||||||
classDescriptor.setSuperclassType(superclassType);
|
classData.classDescriptor.setSuperclassType(superclassType);
|
||||||
}
|
}
|
||||||
|
|
||||||
PsiMethod[] psiConstructors = psiClass.getConstructors();
|
PsiMethod[] psiConstructors = psiClass.getConstructors();
|
||||||
@@ -219,19 +230,19 @@ public class JavaDescriptorResolver {
|
|||||||
// abstract public class Java {}
|
// abstract public class Java {}
|
||||||
if (!psiClass.isInterface()) {
|
if (!psiClass.isInterface()) {
|
||||||
ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
|
ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
|
||||||
classDescriptor,
|
classData.classDescriptor,
|
||||||
Collections.<AnnotationDescriptor>emptyList(),
|
Collections.<AnnotationDescriptor>emptyList(),
|
||||||
false);
|
false);
|
||||||
constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), Modality.FINAL, classDescriptor.getVisibility());
|
constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), Modality.FINAL, classData.classDescriptor.getVisibility());
|
||||||
constructorDescriptor.setReturnType(classDescriptor.getDefaultType());
|
constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
|
||||||
classDescriptor.addConstructor(constructorDescriptor);
|
classData.classDescriptor.addConstructor(constructorDescriptor);
|
||||||
semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
|
semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (PsiMethod constructor : psiConstructors) {
|
for (PsiMethod constructor : psiConstructors) {
|
||||||
ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
|
ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
|
||||||
classDescriptor,
|
classData.classDescriptor,
|
||||||
Collections.<AnnotationDescriptor>emptyList(), // TODO
|
Collections.<AnnotationDescriptor>emptyList(), // TODO
|
||||||
false);
|
false);
|
||||||
ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(constructorDescriptor,
|
ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(constructorDescriptor,
|
||||||
@@ -243,30 +254,31 @@ public class JavaDescriptorResolver {
|
|||||||
}
|
}
|
||||||
constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.descriptors, Modality.FINAL,
|
constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.descriptors, Modality.FINAL,
|
||||||
resolveVisibilityFromPsiModifiers(constructor));
|
resolveVisibilityFromPsiModifiers(constructor));
|
||||||
constructorDescriptor.setReturnType(classDescriptor.getDefaultType());
|
constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
|
||||||
classDescriptor.addConstructor(constructorDescriptor);
|
classData.classDescriptor.addConstructor(constructorDescriptor);
|
||||||
semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, constructor, constructorDescriptor);
|
semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, constructor, constructorDescriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
semanticServices.getTrace().record(BindingContext.CLASS, psiClass, classDescriptor);
|
semanticServices.getTrace().record(BindingContext.CLASS, psiClass, classData.classDescriptor);
|
||||||
|
|
||||||
return classDescriptor;
|
return classData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<TypeParameterDescriptor> resolveClassTypeParameters(PsiClass psiClass, JavaClassDescriptor classDescriptor, TypeVariableResolver typeVariableResolver) {
|
private List<TypeParameterDescriptor> resolveClassTypeParameters(PsiClass psiClass, ResolverClassData classData, TypeVariableResolver typeVariableResolver) {
|
||||||
for (PsiAnnotation annotation : psiClass.getModifierList().getAnnotations()) {
|
for (PsiAnnotation annotation : psiClass.getModifierList().getAnnotations()) {
|
||||||
if (annotation.getQualifiedName().equals(JvmStdlibNames.JET_CLASS.getFqName())) {
|
if (annotation.getQualifiedName().equals(JvmStdlibNames.JET_CLASS.getFqName())) {
|
||||||
|
classData.kotlin = true;
|
||||||
PsiLiteralExpression attributeValue = (PsiLiteralExpression) annotation.findAttributeValue(JvmStdlibNames.JET_CLASS_SIGNATURE);
|
PsiLiteralExpression attributeValue = (PsiLiteralExpression) annotation.findAttributeValue(JvmStdlibNames.JET_CLASS_SIGNATURE);
|
||||||
if (attributeValue != null) {
|
if (attributeValue != null) {
|
||||||
String typeParametersString = (String) attributeValue.getValue();
|
String typeParametersString = (String) attributeValue.getValue();
|
||||||
if (typeParametersString != null) {
|
if (typeParametersString != null) {
|
||||||
return resolveClassTypeParametersFromJetSignature(typeParametersString, psiClass, classDescriptor, typeVariableResolver);
|
return resolveClassTypeParametersFromJetSignature(typeParametersString, psiClass, classData.classDescriptor, typeVariableResolver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return makeUninitializedTypeParameters(classDescriptor, psiClass.getTypeParameters());
|
return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
Reference in New Issue
Block a user