diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java index e9664817474..1b00ec93f05 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -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); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java index e030c4aae1d..e58f6f46bee 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaSemanticServices.java @@ -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); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 70d701c2f60..f179c458522 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -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); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 40fbbfc5c78..fead3423353 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -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 resolveConstructors( - @NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptorFromJvmBytecode classDescriptor + @NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptor classDescriptor ) { return constructorResolver.resolveConstructors(classData, classDescriptor); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java index e5bea1875d4..f91bd5ca0e3 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java @@ -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 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 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; } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java index c31e36370a2..bed83a1ba8e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java @@ -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.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.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.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); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java index b5bb7e447ea..9ff6b7027e7 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java @@ -73,7 +73,6 @@ public final class JavaClassResolver { private final Set 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 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); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java index 9e63f50d8cc..daa1719da44 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java @@ -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 resolveConstructors( - @NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptorFromJvmBytecode containingClass + @NotNull ClassPsiDeclarationProvider classData, @NotNull ClassDescriptor containingClass ) { Collection 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); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java index 63c64534464..bc5200b98da 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java @@ -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 classifiers = Maps.newHashMap(); + private Collection 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 getConstructors() { + if (constructors == null) { + this.constructors = getResolver().resolveConstructors(declarationProvider, descriptor); + } + return constructors; + } + @NotNull @Override protected Collection computeInnerClasses() {