Refactor: move ClassDescriptorFromJvmBytecode#getConstructors() logic to JavaClassNonStaticMembersScope

This commit is contained in:
Pavel V. Talanov
2012-11-08 20:38:03 +04:00
parent 8ac63a53ad
commit 4b64e312fe
9 changed files with 42 additions and 62 deletions
@@ -112,7 +112,6 @@ public class InjectorForJavaDescriptorResolver {
javaClassResolver.setAnnotationResolver(javaAnnotationResolver);
javaClassResolver.setClassObjectResolver(javaClassObjectResolver);
javaClassResolver.setJavaDescriptorResolver(javaDescriptorResolver);
javaClassResolver.setNamespaceResolver(javaNamespaceResolver);
javaClassResolver.setPsiClassFinder(psiClassFinder);
javaClassResolver.setSemanticServices(javaSemanticServices);
@@ -126,7 +125,6 @@ public class InjectorForJavaDescriptorResolver {
javaCompileTimeConstResolver.setAnnotationResolver(javaAnnotationResolver);
javaCompileTimeConstResolver.setClassResolver(javaClassResolver);
javaClassObjectResolver.setJavaDescriptorResolver(javaDescriptorResolver);
javaClassObjectResolver.setSemanticServices(javaSemanticServices);
javaClassObjectResolver.setSupertypesResolver(javaSupertypeResolver);
javaClassObjectResolver.setTrace(bindingTrace);
@@ -110,7 +110,6 @@ public class InjectorForJavaSemanticServices {
javaClassResolver.setAnnotationResolver(javaAnnotationResolver);
javaClassResolver.setClassObjectResolver(javaClassObjectResolver);
javaClassResolver.setJavaDescriptorResolver(javaDescriptorResolver);
javaClassResolver.setNamespaceResolver(javaNamespaceResolver);
javaClassResolver.setPsiClassFinder(psiClassFinder);
javaClassResolver.setSemanticServices(javaSemanticServices);
@@ -124,7 +123,6 @@ public class InjectorForJavaSemanticServices {
javaCompileTimeConstResolver.setAnnotationResolver(javaAnnotationResolver);
javaCompileTimeConstResolver.setClassResolver(javaClassResolver);
javaClassObjectResolver.setJavaDescriptorResolver(javaDescriptorResolver);
javaClassObjectResolver.setSemanticServices(javaSemanticServices);
javaClassObjectResolver.setSupertypesResolver(javaSupertypeResolver);
javaClassObjectResolver.setTrace(bindingTrace);
@@ -275,7 +275,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
javaClassResolver.setAnnotationResolver(javaAnnotationResolver);
javaClassResolver.setClassObjectResolver(javaClassObjectResolver);
javaClassResolver.setJavaDescriptorResolver(javaDescriptorResolver);
javaClassResolver.setNamespaceResolver(javaNamespaceResolver);
javaClassResolver.setPsiClassFinder(psiClassFinder);
javaClassResolver.setSemanticServices(javaSemanticServices);
@@ -289,7 +288,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
javaCompileTimeConstResolver.setAnnotationResolver(javaAnnotationResolver);
javaCompileTimeConstResolver.setClassResolver(javaClassResolver);
javaClassObjectResolver.setJavaDescriptorResolver(javaDescriptorResolver);
javaClassObjectResolver.setSemanticServices(javaSemanticServices);
javaClassObjectResolver.setSupertypesResolver(javaSupertypeResolver);
javaClassObjectResolver.setTrace(bindingTrace);
@@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.resolver.*;
@@ -109,7 +108,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
@NotNull
public Collection<ConstructorDescriptor> resolveConstructors(
@NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptorFromJvmBytecode classDescriptor
@NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptor classDescriptor
) {
return constructorResolver.resolveConstructors(classData, classDescriptor);
}
@@ -21,8 +21,7 @@ import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.MutableClassDescriptorLite;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope;
import org.jetbrains.jet.lang.resolve.lazy.LazyClassDescriptor;
import java.util.Collection;
@@ -33,32 +32,25 @@ import java.util.Collection;
* @see LazyClassDescriptor
*/
public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite {
@NotNull
private final JavaDescriptorResolver javaDescriptorResolver;
@NotNull
private final ClassPsiDeclarationProvider resolverBinaryClassData;
// lazy
private Collection<ConstructorDescriptor> constructors;
private JavaClassNonStaticMembersScope scopeForConstructorResolve;
public ClassDescriptorFromJvmBytecode(
@NotNull DeclarationDescriptor containingDeclaration, @NotNull ClassKind kind,
@NotNull JavaDescriptorResolver javaDescriptorResolver,
@NotNull ClassPsiDeclarationProvider data
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull ClassKind kind
) {
super(containingDeclaration, kind);
this.javaDescriptorResolver = javaDescriptorResolver;
this.resolverBinaryClassData = data;
}
@NotNull
@Override
public Collection<ConstructorDescriptor> getConstructors() {
if (constructors == null) {
this.constructors = javaDescriptorResolver.resolveConstructors(resolverBinaryClassData, this);
}
return constructors;
assert scopeForConstructorResolve != null;
return scopeForConstructorResolve.getConstructors();
}
public void setScopeForConstructorResolve(@NotNull JavaClassNonStaticMembersScope scopeForConstructorResolve) {
this.scopeForConstructorResolve = scopeForConstructorResolve;
}
}
@@ -25,13 +25,11 @@ import org.jetbrains.jet.lang.descriptors.Modality;
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassMembersScope;
import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiClassWrapper;
import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -52,7 +50,6 @@ import static org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils.isInne
public final class JavaClassObjectResolver {
private JavaDescriptorResolver javaDescriptorResolver;
private BindingTrace trace;
private JavaSemanticServices semanticServices;
private JavaSupertypeResolver supertypesResolver;
@@ -62,11 +59,6 @@ public final class JavaClassObjectResolver {
this.supertypesResolver = supertypesResolver;
}
@Inject
public void setJavaDescriptorResolver(JavaDescriptorResolver javaDescriptorResolver) {
this.javaDescriptorResolver = javaDescriptorResolver;
}
@Inject
public void setTrace(BindingTrace trace) {
this.trace = trace;
@@ -114,12 +106,12 @@ public final class JavaClassObjectResolver {
FqName fqName = new FqName(qualifiedName);
ClassPsiDeclarationProvider classObjectData = PsiDeclarationProviderFactory.createBinaryClassData(classObjectPsiClass);
ClassDescriptorFromJvmBytecode classObjectDescriptor
= new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT, javaDescriptorResolver, classObjectData);
classObjectDescriptor.setSupertypes(supertypesResolver.getSupertypes(classObjectDescriptor, new PsiClassWrapper(classObjectPsiClass), classObjectData,
Collections.<TypeParameterDescriptor>emptyList()
));
setUpClassObjectDescriptor(classObjectDescriptor, containing, fqName, classObjectData, getClassObjectName(containing.getName())
);
= new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT);
classObjectDescriptor.setSupertypes(supertypesResolver.getSupertypes(classObjectDescriptor,
new PsiClassWrapper(classObjectPsiClass),
classObjectData,
Collections.<TypeParameterDescriptor>emptyList()));
setUpClassObjectDescriptor(classObjectDescriptor, containing, fqName, classObjectData, getClassObjectName(containing.getName()));
return classObjectDescriptor;
}
@@ -151,14 +143,9 @@ public final class JavaClassObjectResolver {
@NotNull PsiClass psiClass
) {
FqNameUnsafe fqName = DescriptorResolverUtils.getFqNameForClassObject(psiClass);
ClassPsiDeclarationProvider classData = PsiDeclarationProviderFactory.createBinaryClassData(psiClass);
ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode(
containing, ClassKind.CLASS_OBJECT, javaDescriptorResolver, classData);
ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT);
ClassPsiDeclarationProvider data = PsiDeclarationProviderFactory.createSyntheticClassObjectClassData(psiClass);
setUpClassObjectDescriptor(classObjectDescriptor, containing, fqName, data, getClassObjectName(containing.getName().getName()));
return classObjectDescriptor;
}
@@ -174,11 +161,12 @@ public final class JavaClassObjectResolver {
classObjectDescriptor.setVisibility(containing.getVisibility());
classObjectDescriptor.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList());
classObjectDescriptor.createTypeConstructor();
JavaClassMembersScope classMembersScope = new JavaClassNonStaticMembersScope(classObjectDescriptor, data, semanticServices);
JavaClassNonStaticMembersScope classMembersScope = new JavaClassNonStaticMembersScope(classObjectDescriptor, data, semanticServices);
WritableScopeImpl writableScope =
new WritableScopeImpl(classMembersScope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, fqName.toString());
writableScope.changeLockLevel(WritableScope.LockLevel.BOTH);
classObjectDescriptor.setScopeForMemberLookup(writableScope);
classObjectDescriptor.setScopeForConstructorResolve(classMembersScope);
}
@@ -73,7 +73,6 @@ public final class JavaClassResolver {
private final Set<FqNameBase> unresolvedCache = Sets.newHashSet();
private BindingTrace trace;
private JavaDescriptorResolver javaDescriptorResolver;
private JavaSignatureResolver signatureResolver;
private JavaSemanticServices semanticServices;
private JavaAnnotationResolver annotationResolver;
@@ -90,11 +89,6 @@ public final class JavaClassResolver {
this.trace = trace;
}
@Inject
public void setJavaDescriptorResolver(JavaDescriptorResolver javaDescriptorResolver) {
this.javaDescriptorResolver = javaDescriptorResolver;
}
@Inject
public void setSignatureResolver(JavaSignatureResolver signatureResolver) {
this.signatureResolver = signatureResolver;
@@ -226,8 +220,7 @@ public final class JavaClassResolver {
JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
ClassKind kind = getClassKind(psiClass, jetClassAnnotation);
ClassPsiDeclarationProvider classData = PsiDeclarationProviderFactory.createBinaryClassData(psiClass);
ClassDescriptorFromJvmBytecode classDescriptor
= new ClassDescriptorFromJvmBytecode(containingDeclaration, kind, javaDescriptorResolver, classData);
ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(containingDeclaration, kind);
cache(javaClassToKotlinFqName(fqName), classDescriptor);
classDescriptor.setName(Name.identifier(psiClass.getName()));
@@ -241,15 +234,16 @@ public final class JavaClassResolver {
classDescriptor.setVisibility(DescriptorResolverUtils.resolveVisibility(psiClass, jetClassAnnotation));
classDescriptor.setModality(resolveModality(psiClass, classDescriptor));
classDescriptor.createTypeConstructor();
classDescriptor.setScopeForMemberLookup(new JavaClassNonStaticMembersScope(classDescriptor, classData, semanticServices));
JavaClassNonStaticMembersScope membersScope = new JavaClassNonStaticMembersScope(classDescriptor, classData, semanticServices);
classDescriptor.setScopeForMemberLookup(membersScope);
classDescriptor.setScopeForConstructorResolve(membersScope);
String context = "class " + psiClass.getQualifiedName();
signatureResolver.initializeTypeParameters(typeParameterDescriptorInitializations, classDescriptor, context);
// TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes
List<TypeParameterDescriptor> classTypeParameters = classDescriptor.getTypeConstructor().getParameters();
supertypes.addAll(supertypesResolver.getSupertypes(classDescriptor, new PsiClassWrapper(psiClass), classData, classTypeParameters
));
supertypes.addAll(supertypesResolver.getSupertypes(classDescriptor, new PsiClassWrapper(psiClass), classData, classTypeParameters));
ClassDescriptorFromJvmBytecode classObjectDescriptor = classObjectResolver.createClassObjectDescriptor(classDescriptor, psiClass);
cache(DescriptorResolverUtils.getFqNameForClassObject(psiClass), classObjectDescriptor);
@@ -26,7 +26,6 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
@@ -63,7 +62,7 @@ public final class JavaConstructorResolver {
@NotNull
public Collection<ConstructorDescriptor> resolveConstructors(
@NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptorFromJvmBytecode containingClass
@NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptor containingClass
) {
Collection<ConstructorDescriptor> constructors = Lists.newArrayList();
@@ -164,7 +163,7 @@ public final class JavaConstructorResolver {
PsiClass psiClass,
boolean aStatic,
PsiMethod psiConstructor,
ClassDescriptorFromJvmBytecode classDescriptor
ClassDescriptor classDescriptor
) {
PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);
@@ -22,6 +22,7 @@ import com.intellij.psi.PsiModifier;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
@@ -36,12 +37,17 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
@NotNull
private final Map<Name, ClassifierDescriptor> classifiers = Maps.newHashMap();
private Collection<ConstructorDescriptor> constructors = null;
@NotNull
private final ClassDescriptor descriptor;
public JavaClassNonStaticMembersScope(
@NotNull ClassDescriptor descriptor,
@NotNull ClassPsiDeclarationProvider psiDeclarationProvider,
@NotNull JavaSemanticServices semanticServices
) {
super(descriptor, psiDeclarationProvider, semanticServices);
this.descriptor = descriptor;
}
@Override
@@ -72,6 +78,14 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
}
@NotNull
public Collection<ConstructorDescriptor> getConstructors() {
if (constructors == null) {
this.constructors = getResolver().resolveConstructors(declarationProvider, descriptor);
}
return constructors;
}
@NotNull
@Override
protected Collection<ClassDescriptor> computeInnerClasses() {