diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java index a1b0b20e255..812af6eed8e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java @@ -51,7 +51,8 @@ public abstract class AbstractLazyMemberScope> functionDescriptors; private final MemoizedFunctionToNotNull> propertyDescriptors; - private final NotNullLazyValue> allDescriptors; + private final NotNullLazyValue> descriptorsFromDeclaredElements; + private final NotNullLazyValue> extraDescriptors; protected AbstractLazyMemberScope( @NotNull ResolveSession resolveSession, @@ -83,10 +84,16 @@ public abstract class AbstractLazyMemberScope>() { + this.descriptorsFromDeclaredElements = storageManager.createLazyValue(new Function0>() { @Override public Collection invoke() { - return computeAllDescriptors(); + return computeDescriptorsFromDeclaredElements(); + } + }); + this.extraDescriptors = storageManager.createLazyValue(new Function0>() { + @Override + public Collection invoke() { + return computeExtraDescriptors(); } }); } @@ -199,13 +206,21 @@ public abstract class AbstractLazyMemberScope getAllDescriptors() { - return allDescriptors.invoke(); + Collection result = new LinkedHashSet(getDescriptorsFromDeclaredElements()); + result.addAll(extraDescriptors.invoke()); + return result; } @NotNull - private Collection computeAllDescriptors() { - Collection result = new LinkedHashSet(); - for (JetDeclaration declaration : declarationProvider.getAllDeclarations()) { + /*package*/ Collection getDescriptorsFromDeclaredElements() { + return descriptorsFromDeclaredElements.invoke(); + } + + @NotNull + private Collection computeDescriptorsFromDeclaredElements() { + List declarations = declarationProvider.getAllDeclarations(); + ArrayList result = new ArrayList(declarations.size()); + for (JetDeclaration declaration : declarations) { if (declaration instanceof JetClassOrObject) { JetClassOrObject classOrObject = (JetClassOrObject) declaration; result.addAll(classDescriptors.invoke(safeNameForLazyResolve(classOrObject.getNameAsName()))); @@ -230,11 +245,12 @@ public abstract class AbstractLazyMemberScope result); + @NotNull + protected abstract Collection computeExtraDescriptors(); @NotNull @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java index 365b9630359..dfb15ae442a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -23,6 +23,7 @@ import com.intellij.psi.PsiElement; import jet.Function0; import jet.Function1; import jet.Unit; +import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -31,7 +32,6 @@ import org.jetbrains.jet.lang.descriptors.impl.ClassDescriptorBase; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.AnnotationResolver; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.descriptors.ClassDescriptorWithResolutionScopes; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil; import org.jetbrains.jet.lang.resolve.lazy.LazyEntity; @@ -209,6 +209,22 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti return scopeForPropertyInitializerResolution.invoke(); } + @NotNull + @Override + public Collection getDeclaredCallableMembers() { + //noinspection unchecked + return (Collection) KotlinPackage.filter( + unsubstitutedMemberScope.getDescriptorsFromDeclaredElements(), + new Function1() { + @Override + public Boolean invoke(DeclarationDescriptor descriptor) { + return descriptor instanceof CallableMemberDescriptor + && ((CallableMemberDescriptor) descriptor).getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE; + } + } + ); + } + @NotNull private JetScope computeScopeForPropertyInitializerResolution() { ConstructorDescriptor primaryConstructor = getUnsubstitutedPrimaryConstructor(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java index 2bfb29a0ccc..cd807b5a5d5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java @@ -36,10 +36,7 @@ import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.storage.NullableLazyValue; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DELEGATION; import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE; @@ -290,7 +287,9 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope result) { + @NotNull + protected Collection computeExtraDescriptors() { + ArrayList result = new ArrayList(); for (JetType supertype : thisDescriptor.getTypeConstructor().getSupertypes()) { for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) { if (descriptor instanceof FunctionDescriptor) { @@ -307,6 +306,9 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope result) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.java index eea90829f92..c3788aa3432 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.Collection; +import java.util.Collections; import java.util.Set; public class LazyPackageMemberScope extends AbstractLazyMemberScope { @@ -72,8 +73,10 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope result) { + protected Collection computeExtraDescriptors() { + return Collections.emptyList(); } @Override diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorWithResolutionScopes.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorWithResolutionScopes.java index 3ad08c246d9..1a4e561a699 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorWithResolutionScopes.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorWithResolutionScopes.java @@ -17,8 +17,11 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.ReadOnly; import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import java.util.Collection; + public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor { @NotNull JetScope getScopeForClassHeaderResolution(); @@ -28,4 +31,8 @@ public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor { @NotNull JetScope getScopeForInitializerResolution(); + + @NotNull + @ReadOnly + Collection getDeclaredCallableMembers(); } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java index 329edf6b0be..e71edc99b1d 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java @@ -107,6 +107,7 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite implement return properties; } + @Override @NotNull public Set getDeclaredCallableMembers() { return declaredCallableMembers;