getDeclaredCallableMembers() added to ClassDescriptorWithResolutionScopes

This commit is contained in:
Andrey Breslav
2014-02-05 16:28:37 +01:00
parent ac94dc5411
commit d9dceca0c3
6 changed files with 61 additions and 16 deletions
@@ -51,7 +51,8 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
private final MemoizedFunctionToNotNull<Name, Set<FunctionDescriptor>> functionDescriptors;
private final MemoizedFunctionToNotNull<Name, Set<VariableDescriptor>> propertyDescriptors;
private final NotNullLazyValue<Collection<DeclarationDescriptor>> allDescriptors;
private final NotNullLazyValue<Collection<DeclarationDescriptor>> descriptorsFromDeclaredElements;
private final NotNullLazyValue<Collection<DeclarationDescriptor>> extraDescriptors;
protected AbstractLazyMemberScope(
@NotNull ResolveSession resolveSession,
@@ -83,10 +84,16 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
}
});
this.allDescriptors = storageManager.createLazyValue(new Function0<Collection<DeclarationDescriptor>>() {
this.descriptorsFromDeclaredElements = storageManager.createLazyValue(new Function0<Collection<DeclarationDescriptor>>() {
@Override
public Collection<DeclarationDescriptor> invoke() {
return computeAllDescriptors();
return computeDescriptorsFromDeclaredElements();
}
});
this.extraDescriptors = storageManager.createLazyValue(new Function0<Collection<DeclarationDescriptor>>() {
@Override
public Collection<DeclarationDescriptor> invoke() {
return computeExtraDescriptors();
}
});
}
@@ -199,13 +206,21 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
@NotNull
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
return allDescriptors.invoke();
Collection<DeclarationDescriptor> result = new LinkedHashSet<DeclarationDescriptor>(getDescriptorsFromDeclaredElements());
result.addAll(extraDescriptors.invoke());
return result;
}
@NotNull
private Collection<DeclarationDescriptor> computeAllDescriptors() {
Collection<DeclarationDescriptor> result = new LinkedHashSet<DeclarationDescriptor>();
for (JetDeclaration declaration : declarationProvider.getAllDeclarations()) {
/*package*/ Collection<DeclarationDescriptor> getDescriptorsFromDeclaredElements() {
return descriptorsFromDeclaredElements.invoke();
}
@NotNull
private Collection<DeclarationDescriptor> computeDescriptorsFromDeclaredElements() {
List<JetDeclaration> declarations = declarationProvider.getAllDeclarations();
ArrayList<DeclarationDescriptor> result = new ArrayList<DeclarationDescriptor>(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<D extends DeclarationDescriptor, D
throw new IllegalArgumentException("Unsupported declaration kind: " + declaration);
}
}
addExtraDescriptors(result);
result.trimToSize();
return result;
}
protected abstract void addExtraDescriptors(@NotNull Collection<DeclarationDescriptor> result);
@NotNull
protected abstract Collection<DeclarationDescriptor> computeExtraDescriptors();
@NotNull
@Override
@@ -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<CallableMemberDescriptor> getDeclaredCallableMembers() {
//noinspection unchecked
return (Collection) KotlinPackage.filter(
unsubstitutedMemberScope.getDescriptorsFromDeclaredElements(),
new Function1<DeclarationDescriptor, Boolean>() {
@Override
public Boolean invoke(DeclarationDescriptor descriptor) {
return descriptor instanceof CallableMemberDescriptor
&& ((CallableMemberDescriptor) descriptor).getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE;
}
}
);
}
@NotNull
private JetScope computeScopeForPropertyInitializerResolution() {
ConstructorDescriptor primaryConstructor = getUnsubstitutedPrimaryConstructor();
@@ -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<LazyClassDescr
}
@Override
protected void addExtraDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
@NotNull
protected Collection<DeclarationDescriptor> computeExtraDescriptors() {
ArrayList<DeclarationDescriptor> result = new ArrayList<DeclarationDescriptor>();
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<LazyClassDescr
result.addAll(getFunctions(DescriptorFactory.VALUE_OF_METHOD_NAME));
addDataClassMethods(result);
result.trimToSize();
return result;
}
private void addDataClassMethods(@NotNull Collection<DeclarationDescriptor> result) {
@@ -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<PackageFragmentDescriptor, PackageMemberDeclarationProvider> {
@@ -72,8 +73,10 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<PackageFragm
// No extra properties
}
@NotNull
@Override
protected void addExtraDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
protected Collection<DeclarationDescriptor> computeExtraDescriptors() {
return Collections.emptyList();
}
@Override
@@ -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<CallableMemberDescriptor> getDeclaredCallableMembers();
}
@@ -107,6 +107,7 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite implement
return properties;
}
@Override
@NotNull
public Set<CallableMemberDescriptor> getDeclaredCallableMembers() {
return declaredCallableMembers;