Properly load objects nested into class objects from Java

This commit is contained in:
Andrey Breslav
2013-06-07 17:47:40 +04:00
parent 56f040608a
commit 3e8031acbd
9 changed files with 76 additions and 11 deletions
@@ -149,7 +149,7 @@ public final class JavaClassObjectResolver {
classObjectDescriptor.createTypeConstructor();
JavaClassNonStaticMembersScope classMembersScope = new JavaClassNonStaticMembersScope(classObjectDescriptor, data, semanticServices);
WritableScopeImpl writableScope =
new WritableScopeImpl(classMembersScope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, fqName.toString());
new WritableScopeImpl(classMembersScope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, "Member lookup scope");
writableScope.changeLockLevel(WritableScope.LockLevel.BOTH);
classObjectDescriptor.setScopeForMemberLookup(writableScope);
classObjectDescriptor.setScopeForConstructorResolve(classMembersScope);
@@ -20,7 +20,9 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.intellij.openapi.progress.ProgressIndicatorProvider;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.PsiElement;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
@@ -33,10 +35,7 @@ import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.*;
public abstract class JavaBaseScope extends JetScopeImpl {
@@ -50,6 +49,8 @@ public abstract class JavaBaseScope extends JetScopeImpl {
private final Map<Name, Set<VariableDescriptor>> propertyDescriptors = Maps.newHashMap();
@Nullable
private Collection<DeclarationDescriptor> allDescriptors = null;
@Nullable
private Set<ClassDescriptor> objectDescriptors = null;
@NotNull
protected final ClassOrNamespaceDescriptor descriptor;
@@ -130,10 +131,19 @@ public abstract class JavaBaseScope extends JetScopeImpl {
protected Collection<DeclarationDescriptor> computeAllDescriptors() {
Collection<DeclarationDescriptor> result = Sets.newHashSet();
result.addAll(computeFieldAndFunctionDescriptors());
result.addAll(getInnerClasses());
result.addAll(filterObjects(getInnerClasses(), false));
return result;
}
@NotNull
@Override
public Set<ClassDescriptor> getObjectDescriptors() {
if (objectDescriptors == null) {
objectDescriptors = new HashSet<ClassDescriptor>(filterObjects(getInnerClasses(), true));
}
return objectDescriptors;
}
@NotNull
protected abstract Collection<ClassDescriptor> computeInnerClasses();
@@ -174,4 +184,13 @@ public abstract class JavaBaseScope extends JetScopeImpl {
}
return innerClasses;
}
private static <T extends ClassDescriptor> Collection<T> filterObjects(Collection<T> classes, final boolean objects) {
return ContainerUtil.filter(classes, new Condition<T>() {
@Override
public boolean value(T classDescriptor) {
return classDescriptor.getKind().isObject() == objects;
}
});
}
}