Move caching logic from java class scope to descriptor

This commit is contained in:
Alexander Udalov
2013-08-28 21:33:29 +04:00
parent d0e4245112
commit 01e46bbd11
3 changed files with 23 additions and 35 deletions
@@ -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) {
@@ -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
@@ -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);