Move caching logic from java class scope to descriptor
This commit is contained in:
+18
-4
@@ -33,8 +33,9 @@ import java.util.Collection;
|
||||
*/
|
||||
public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite {
|
||||
private JetType functionTypeForSamInterface;
|
||||
|
||||
private JavaClassNonStaticMembersScope scopeForConstructorResolve;
|
||||
private ConstructorDescriptor primaryConstructor;
|
||||
private Collection<ConstructorDescriptor> constructors;
|
||||
|
||||
public ClassDescriptorFromJvmBytecode(
|
||||
@NotNull DeclarationDescriptor containingDeclaration,
|
||||
@@ -45,18 +46,31 @@ public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite {
|
||||
super(containingDeclaration, name, kind, isInner);
|
||||
}
|
||||
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Collection<ConstructorDescriptor> 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) {
|
||||
|
||||
+1
-28
@@ -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<ConstructorDescriptor> 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<ConstructorDescriptor> 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
|
||||
|
||||
Reference in New Issue
Block a user