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<FunctionDescriptor>> functionDescriptors;
private final MemoizedFunctionToNotNull<Name, Set<VariableDescriptor>> propertyDescriptors; 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( protected AbstractLazyMemberScope(
@NotNull ResolveSession resolveSession, @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 @Override
public Collection<DeclarationDescriptor> invoke() { 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 @NotNull
@Override @Override
public Collection<DeclarationDescriptor> getAllDescriptors() { public Collection<DeclarationDescriptor> getAllDescriptors() {
return allDescriptors.invoke(); Collection<DeclarationDescriptor> result = new LinkedHashSet<DeclarationDescriptor>(getDescriptorsFromDeclaredElements());
result.addAll(extraDescriptors.invoke());
return result;
} }
@NotNull @NotNull
private Collection<DeclarationDescriptor> computeAllDescriptors() { /*package*/ Collection<DeclarationDescriptor> getDescriptorsFromDeclaredElements() {
Collection<DeclarationDescriptor> result = new LinkedHashSet<DeclarationDescriptor>(); return descriptorsFromDeclaredElements.invoke();
for (JetDeclaration declaration : declarationProvider.getAllDeclarations()) { }
@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) { if (declaration instanceof JetClassOrObject) {
JetClassOrObject classOrObject = (JetClassOrObject) declaration; JetClassOrObject classOrObject = (JetClassOrObject) declaration;
result.addAll(classDescriptors.invoke(safeNameForLazyResolve(classOrObject.getNameAsName()))); 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); throw new IllegalArgumentException("Unsupported declaration kind: " + declaration);
} }
} }
addExtraDescriptors(result); result.trimToSize();
return result; return result;
} }
protected abstract void addExtraDescriptors(@NotNull Collection<DeclarationDescriptor> result); @NotNull
protected abstract Collection<DeclarationDescriptor> computeExtraDescriptors();
@NotNull @NotNull
@Override @Override
@@ -23,6 +23,7 @@ import com.intellij.psi.PsiElement;
import jet.Function0; import jet.Function0;
import jet.Function1; import jet.Function1;
import jet.Unit; import jet.Unit;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; 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.psi.*;
import org.jetbrains.jet.lang.resolve.AnnotationResolver; import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.BindingContext; 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.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil; import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil;
import org.jetbrains.jet.lang.resolve.lazy.LazyEntity; import org.jetbrains.jet.lang.resolve.lazy.LazyEntity;
@@ -209,6 +209,22 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
return scopeForPropertyInitializerResolution.invoke(); 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 @NotNull
private JetScope computeScopeForPropertyInitializerResolution() { private JetScope computeScopeForPropertyInitializerResolution() {
ConstructorDescriptor primaryConstructor = getUnsubstitutedPrimaryConstructor(); 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.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.storage.NullableLazyValue; import org.jetbrains.jet.storage.NullableLazyValue;
import java.util.Collection; import java.util.*;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DELEGATION; import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DELEGATION;
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE; import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE;
@@ -290,7 +287,9 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
} }
@Override @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 (JetType supertype : thisDescriptor.getTypeConstructor().getSupertypes()) {
for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) { for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) {
if (descriptor instanceof FunctionDescriptor) { if (descriptor instanceof FunctionDescriptor) {
@@ -307,6 +306,9 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
result.addAll(getFunctions(DescriptorFactory.VALUE_OF_METHOD_NAME)); result.addAll(getFunctions(DescriptorFactory.VALUE_OF_METHOD_NAME));
addDataClassMethods(result); addDataClassMethods(result);
result.trimToSize();
return result;
} }
private void addDataClassMethods(@NotNull Collection<DeclarationDescriptor> 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 org.jetbrains.jet.lang.resolve.scopes.JetScope;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Set; import java.util.Set;
public class LazyPackageMemberScope extends AbstractLazyMemberScope<PackageFragmentDescriptor, PackageMemberDeclarationProvider> { public class LazyPackageMemberScope extends AbstractLazyMemberScope<PackageFragmentDescriptor, PackageMemberDeclarationProvider> {
@@ -72,8 +73,10 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<PackageFragm
// No extra properties // No extra properties
} }
@NotNull
@Override @Override
protected void addExtraDescriptors(@NotNull Collection<DeclarationDescriptor> result) { protected Collection<DeclarationDescriptor> computeExtraDescriptors() {
return Collections.emptyList();
} }
@Override @Override
@@ -17,8 +17,11 @@
package org.jetbrains.jet.lang.descriptors; package org.jetbrains.jet.lang.descriptors;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.ReadOnly;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import java.util.Collection;
public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor { public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor {
@NotNull @NotNull
JetScope getScopeForClassHeaderResolution(); JetScope getScopeForClassHeaderResolution();
@@ -28,4 +31,8 @@ public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor {
@NotNull @NotNull
JetScope getScopeForInitializerResolution(); JetScope getScopeForInitializerResolution();
@NotNull
@ReadOnly
Collection<CallableMemberDescriptor> getDeclaredCallableMembers();
} }
@@ -107,6 +107,7 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite implement
return properties; return properties;
} }
@Override
@NotNull @NotNull
public Set<CallableMemberDescriptor> getDeclaredCallableMembers() { public Set<CallableMemberDescriptor> getDeclaredCallableMembers() {
return declaredCallableMembers; return declaredCallableMembers;