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