diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java index 60e2ecb4102..3becdcffc01 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/ClassDescriptorFromJvmBytecode.java @@ -33,8 +33,9 @@ import java.util.Collection; */ public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite { private JetType functionTypeForSamInterface; - private JavaClassNonStaticMembersScope scopeForConstructorResolve; + private ConstructorDescriptor primaryConstructor; + private Collection constructors; public ClassDescriptorFromJvmBytecode( @NotNull DeclarationDescriptor containingDeclaration, @@ -45,18 +46,31 @@ public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite { super(containingDeclaration, name, kind, isInner); } - @NotNull @Override public Collection getConstructors() { assert scopeForConstructorResolve != null; - return scopeForConstructorResolve.getConstructors(); + if (constructors == null) { + constructors = scopeForConstructorResolve.getConstructors(); + } + return constructors; } @Nullable @Override public ConstructorDescriptor getUnsubstitutedPrimaryConstructor() { - return scopeForConstructorResolve.getPrimaryConstructor(); + if (primaryConstructor == null) { + for (ConstructorDescriptor constructor : getConstructors()) { + if (constructor.isPrimary()) { + if (primaryConstructor != null) { + throw new IllegalStateException( + "Class has more than one primary constructor: " + primaryConstructor + "\n" + constructor); + } + primaryConstructor = constructor; + } + } + } + return primaryConstructor; } public void setScopeForConstructorResolve(@NotNull JavaClassNonStaticMembersScope scopeForConstructorResolve) { diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java index 0f4d47e6d41..bd36883dca4 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassNonStaticMembersScope.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.resolve.java.scope; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver; @@ -32,8 +31,6 @@ import java.util.List; import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.IGNORE_KOTLIN_SOURCES; public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope { - private Collection constructors = null; - private ConstructorDescriptor primaryConstructor = null; @NotNull private final ClassDescriptor descriptor; @NotNull @@ -52,33 +49,9 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope this.staticMembersOfPsiClass = staticMembersOfClass; } - @NotNull public Collection getConstructors() { - initConstructorsIfNeeded(); - return constructors; - } - - @Nullable - public ConstructorDescriptor getPrimaryConstructor() { - initConstructorsIfNeeded(); - return primaryConstructor; - } - - private void initConstructorsIfNeeded() { - if (constructors == null) { - constructors = memberResolver.resolveConstructors(javaClass, descriptor); - - for (ConstructorDescriptor constructor : constructors) { - if (constructor.isPrimary()) { - if (primaryConstructor != null) { - throw new IllegalStateException( - "Class has more than one primary constructor: " + primaryConstructor + "\n" + constructor); - } - primaryConstructor = constructor; - } - } - } + return memberResolver.resolveConstructors(javaClass, descriptor); } @NotNull diff --git a/idea/src/org/jetbrains/jet/plugin/ktSignature/KotlinSignatureInJavaMarkerProvider.java b/idea/src/org/jetbrains/jet/plugin/ktSignature/KotlinSignatureInJavaMarkerProvider.java index 7141d372f09..85c60dc29ba 100644 --- a/idea/src/org/jetbrains/jet/plugin/ktSignature/KotlinSignatureInJavaMarkerProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/ktSignature/KotlinSignatureInJavaMarkerProvider.java @@ -42,7 +42,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace; import org.jetbrains.jet.lang.resolve.java.JavaBindingContext; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; -import org.jetbrains.jet.lang.resolve.java.scope.JavaClassNonStaticMembersScope; +import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -187,8 +187,9 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider { Name name = Name.identifier(memberNameAsString); if (member instanceof PsiMethod) { if (((PsiMethod) member).isConstructor()) { - assert memberScope instanceof JavaClassNonStaticMembersScope : memberScope + ": " + memberScope.getClass().getName(); - ((JavaClassNonStaticMembersScope) memberScope).getConstructors(); + DeclarationDescriptor container = memberScope.getContainingDeclaration(); + assert container instanceof ClassDescriptorFromJvmBytecode : container + "\n" + memberScope; + ((ClassDescriptorFromJvmBytecode) container).getConstructors(); } else { memberScope.getFunctions(name);