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 {
|
public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite {
|
||||||
private JetType functionTypeForSamInterface;
|
private JetType functionTypeForSamInterface;
|
||||||
|
|
||||||
private JavaClassNonStaticMembersScope scopeForConstructorResolve;
|
private JavaClassNonStaticMembersScope scopeForConstructorResolve;
|
||||||
|
private ConstructorDescriptor primaryConstructor;
|
||||||
|
private Collection<ConstructorDescriptor> constructors;
|
||||||
|
|
||||||
public ClassDescriptorFromJvmBytecode(
|
public ClassDescriptorFromJvmBytecode(
|
||||||
@NotNull DeclarationDescriptor containingDeclaration,
|
@NotNull DeclarationDescriptor containingDeclaration,
|
||||||
@@ -45,18 +46,31 @@ public class ClassDescriptorFromJvmBytecode extends MutableClassDescriptorLite {
|
|||||||
super(containingDeclaration, name, kind, isInner);
|
super(containingDeclaration, name, kind, isInner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<ConstructorDescriptor> getConstructors() {
|
public Collection<ConstructorDescriptor> getConstructors() {
|
||||||
assert scopeForConstructorResolve != null;
|
assert scopeForConstructorResolve != null;
|
||||||
return scopeForConstructorResolve.getConstructors();
|
if (constructors == null) {
|
||||||
|
constructors = scopeForConstructorResolve.getConstructors();
|
||||||
|
}
|
||||||
|
return constructors;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public ConstructorDescriptor getUnsubstitutedPrimaryConstructor() {
|
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) {
|
public void setScopeForConstructorResolve(@NotNull JavaClassNonStaticMembersScope scopeForConstructorResolve) {
|
||||||
|
|||||||
+1
-28
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.jet.lang.resolve.java.scope;
|
package org.jetbrains.jet.lang.resolve.java.scope;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver;
|
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;
|
import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.IGNORE_KOTLIN_SOURCES;
|
||||||
|
|
||||||
public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope {
|
public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope {
|
||||||
private Collection<ConstructorDescriptor> constructors = null;
|
|
||||||
private ConstructorDescriptor primaryConstructor = null;
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final ClassDescriptor descriptor;
|
private final ClassDescriptor descriptor;
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -52,33 +49,9 @@ public final class JavaClassNonStaticMembersScope extends JavaClassMembersScope
|
|||||||
this.staticMembersOfPsiClass = staticMembersOfClass;
|
this.staticMembersOfPsiClass = staticMembersOfClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Collection<ConstructorDescriptor> getConstructors() {
|
public Collection<ConstructorDescriptor> getConstructors() {
|
||||||
initConstructorsIfNeeded();
|
return memberResolver.resolveConstructors(javaClass, descriptor);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
+4
-3
@@ -42,7 +42,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
|
|||||||
import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace;
|
import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaBindingContext;
|
import org.jetbrains.jet.lang.resolve.java.JavaBindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
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.FqName;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
@@ -187,8 +187,9 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
|
|||||||
Name name = Name.identifier(memberNameAsString);
|
Name name = Name.identifier(memberNameAsString);
|
||||||
if (member instanceof PsiMethod) {
|
if (member instanceof PsiMethod) {
|
||||||
if (((PsiMethod) member).isConstructor()) {
|
if (((PsiMethod) member).isConstructor()) {
|
||||||
assert memberScope instanceof JavaClassNonStaticMembersScope : memberScope + ": " + memberScope.getClass().getName();
|
DeclarationDescriptor container = memberScope.getContainingDeclaration();
|
||||||
((JavaClassNonStaticMembersScope) memberScope).getConstructors();
|
assert container instanceof ClassDescriptorFromJvmBytecode : container + "\n" + memberScope;
|
||||||
|
((ClassDescriptorFromJvmBytecode) container).getConstructors();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
memberScope.getFunctions(name);
|
memberScope.getFunctions(name);
|
||||||
|
|||||||
Reference in New Issue
Block a user