refactoring: ResolverClassData internal structure in JavaDescriptorResolver

This commit is contained in:
Stepan Koltsov
2011-12-30 00:05:29 +04:00
parent 855142e35d
commit 047fe9df9a
@@ -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