Extract ResolverClassData as superclass from ResolverBinaryClassData. Use it instead.

This commit is contained in:
Natalia.Ukhorskaya
2012-08-21 16:11:27 +04:00
parent 5b77210c95
commit 546ec296e2
3 changed files with 44 additions and 31 deletions
@@ -16,7 +16,6 @@
package org.jetbrains.jet.lang.resolve.java; package org.jetbrains.jet.lang.resolve.java;
import com.google.common.collect.Lists;
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassKind; import org.jetbrains.jet.lang.descriptors.ClassKind;
@@ -27,8 +26,6 @@ import org.jetbrains.jet.lang.resolve.lazy.LazyClassDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Set;
/** /**
* @author Stepan Koltsov * @author Stepan Koltsov
@@ -39,7 +36,7 @@ public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite {
@NotNull @NotNull
private final JavaDescriptorResolver javaDescriptorResolver; private final JavaDescriptorResolver javaDescriptorResolver;
@NotNull @NotNull
private final JavaDescriptorResolver.ResolverBinaryClassData resolverBinaryClassData; private final JavaDescriptorResolver.ResolverClassData resolverBinaryClassData;
// lazy // lazy
@@ -55,7 +52,7 @@ public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite {
} }
@NotNull @NotNull
public JavaDescriptorResolver.ResolverBinaryClassData getResolverBinaryClassData() { public JavaDescriptorResolver.ResolverClassData getResolverBinaryClassData() {
return resolverBinaryClassData; return resolverBinaryClassData;
} }
@@ -148,22 +148,42 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
/** Class with instance members */ /** Class with instance members */
static class ResolverBinaryClassData extends ResolverScopeData { static class ResolverBinaryClassData extends ResolverClassData {
final ClassDescriptorFromJvmBytecode classDescriptor;
ResolverBinaryClassData(@NotNull PsiClass psiClass, @NotNull FqName fqName, @NotNull ClassDescriptorFromJvmBytecode classDescriptor) { ResolverBinaryClassData(@NotNull PsiClass psiClass, @NotNull FqName fqName, @NotNull ClassDescriptorFromJvmBytecode classDescriptor) {
super(psiClass, null, fqName, false, classDescriptor); super(psiClass, null, fqName, false, classDescriptor);
this.classDescriptor = classDescriptor;
} }
private ResolverBinaryClassData(boolean negative) { ResolverBinaryClassData(boolean negative) {
super(negative);
}
static final ResolverClassData NEGATIVE = new ResolverBinaryClassData(true);
}
static class ResolverClassData extends ResolverScopeData {
final ClassDescriptorFromJvmBytecode classDescriptor;
List<JavaDescriptorSignatureResolver.TypeParameterDescriptorInitialization> typeParameters;
protected ResolverClassData(boolean negative) {
super(negative); super(negative);
this.classDescriptor = null; this.classDescriptor = null;
} }
static final ResolverBinaryClassData NEGATIVE = new ResolverBinaryClassData(true);
List<JavaDescriptorSignatureResolver.TypeParameterDescriptorInitialization> typeParameters; protected ResolverClassData(
@Nullable PsiClass psiClass,
@Nullable PsiPackage psiPackage,
@NotNull FqName fqName,
boolean staticMembers,
@NotNull ClassDescriptorFromJvmBytecode descriptor
) {
super(psiClass, psiPackage, fqName, staticMembers, descriptor);
classDescriptor = descriptor;
}
@NotNull @NotNull
public ClassDescriptor getClassDescriptor() { public ClassDescriptor getClassDescriptor() {
@@ -203,7 +223,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
} }
protected final Map<FqName, ResolverBinaryClassData> classDescriptorCache = Maps.newHashMap(); protected final Map<FqName, ResolverClassData> classDescriptorCache = Maps.newHashMap();
protected final Map<FqName, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap(); protected final Map<FqName, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
protected Project project; protected Project project;
@@ -297,11 +317,11 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
// Not let's take a descriptor of a Java class // Not let's take a descriptor of a Java class
ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName); ResolverClassData classData = classDescriptorCache.get(qualifiedName);
if (classData == null) { if (classData == null) {
PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW); PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW);
if (psiClass == null) { if (psiClass == null) {
ResolverBinaryClassData oldValue = classDescriptorCache.put(qualifiedName, ResolverBinaryClassData.NEGATIVE); ResolverClassData oldValue = classDescriptorCache.put(qualifiedName, ResolverBinaryClassData.NEGATIVE);
if (oldValue != null) { if (oldValue != null) {
throw new IllegalStateException("rewrite at " + qualifiedName); throw new IllegalStateException("rewrite at " + qualifiedName);
} }
@@ -313,7 +333,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
@NotNull @NotNull
private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass, List<Runnable> taskList) { private ResolverClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass, List<Runnable> taskList) {
FqName fqName = new FqName(psiClass.getQualifiedName()); FqName fqName = new FqName(psiClass.getQualifiedName());
if (classDescriptorCache.containsKey(fqName)) { if (classDescriptorCache.containsKey(fqName)) {
throw new IllegalStateException(psiClass.getQualifiedName()); throw new IllegalStateException(psiClass.getQualifiedName());
@@ -326,7 +346,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass); ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
// class may be resolved during resolution of parent // class may be resolved during resolution of parent
ResolverBinaryClassData classData = classDescriptorCache.get(fqName); ResolverClassData classData = classDescriptorCache.get(fqName);
if (classData != null) { if (classData != null) {
return classData; return classData;
} }
@@ -379,7 +399,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
@NotNull @NotNull
public Collection<ConstructorDescriptor> resolveConstructors(@NotNull ResolverBinaryClassData classData) { public Collection<ConstructorDescriptor> resolveConstructors(@NotNull ResolverClassData classData) {
Collection<ConstructorDescriptor> constructors = Lists.newArrayList(); Collection<ConstructorDescriptor> constructors = Lists.newArrayList();
PsiClass psiClass = classData.psiClass; PsiClass psiClass = classData.psiClass;
@@ -473,7 +493,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
@Nullable @Nullable
private ConstructorDescriptor resolveConstructor(PsiClass psiClass, ResolverBinaryClassData classData, boolean aStatic, PsiMethod psiConstructor) { private ConstructorDescriptor resolveConstructor(PsiClass psiClass, ResolverClassData classData, boolean aStatic, PsiMethod psiConstructor) {
PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor); PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);
if (constructor.getJetConstructor().hidden()) { if (constructor.getJetConstructor().hidden()) {
@@ -528,7 +548,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
checkPsiClassIsNotJet(psiClass); checkPsiClassIsNotJet(psiClass);
FqName fqName = new FqName(classObjectPsiClass.getQualifiedName()); FqName fqName = new FqName(classObjectPsiClass.getQualifiedName());
ResolverBinaryClassData classData = new ClassDescriptorFromJvmBytecode( ResolverClassData classData = new ClassDescriptorFromJvmBytecode(
containing, ClassKind.OBJECT, classObjectPsiClass, fqName, this) containing, ClassKind.OBJECT, classObjectPsiClass, fqName, this)
.getResolverBinaryClassData(); .getResolverBinaryClassData();
@@ -573,7 +593,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
return ns; return ns;
} }
private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ResolverBinaryClassData classData, List<TypeParameterDescriptor> typeParameters) { private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ResolverClassData classData, List<TypeParameterDescriptor> typeParameters) {
ClassDescriptor classDescriptor = classData.classDescriptor; ClassDescriptor classDescriptor = classData.classDescriptor;
final List<JetType> result = new ArrayList<JetType>(); final List<JetType> result = new ArrayList<JetType>();
@@ -1514,8 +1534,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
private Collection<JetType> getSupertypes(ResolverScopeData scope) { private Collection<JetType> getSupertypes(ResolverScopeData scope) {
if (scope instanceof ResolverBinaryClassData) { if (scope instanceof ResolverClassData) {
return ((ResolverBinaryClassData) scope).classDescriptor.getSupertypes(); return ((ResolverClassData) scope).classDescriptor.getSupertypes();
} }
else if (scope instanceof ResolverNamespaceData) { else if (scope instanceof ResolverNamespaceData) {
return Collections.emptyList(); return Collections.emptyList();
@@ -1526,8 +1546,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
} }
private TypeSubstitutor typeSubstitutorForGenericSupertypes(ResolverScopeData scopeData) { private TypeSubstitutor typeSubstitutorForGenericSupertypes(ResolverScopeData scopeData) {
if (scopeData instanceof ResolverBinaryClassData) { if (scopeData instanceof ResolverClassData) {
return createSubstitutorForGenericSupertypes(((ResolverBinaryClassData) scopeData).getClassDescriptor()); return createSubstitutorForGenericSupertypes(((ResolverClassData) scopeData).getClassDescriptor());
} }
else { else {
return TypeSubstitutor.EMPTY; return TypeSubstitutor.EMPTY;
@@ -17,11 +17,7 @@
package org.jetbrains.jet.lang.resolve.java; package org.jetbrains.jet.lang.resolve.java;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.intellij.psi.PsiClass; import com.intellij.psi.*;
import com.intellij.psi.PsiClassType;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiTypeParameter;
import com.intellij.psi.PsiTypeParameterListOwner;
import jet.typeinfo.TypeInfoVariance; import jet.typeinfo.TypeInfoVariance;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -318,7 +314,7 @@ public class JavaDescriptorSignatureResolver {
} }
List<TypeParameterDescriptorInitialization> createUninitializedClassTypeParameters(PsiClass psiClass, JavaDescriptorResolver.ResolverBinaryClassData classData) { List<TypeParameterDescriptorInitialization> createUninitializedClassTypeParameters(PsiClass psiClass, JavaDescriptorResolver.ResolverClassData classData) {
JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass); JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
if (jetClassAnnotation.signature().length() > 0) { if (jetClassAnnotation.signature().length() > 0) {