DeclarationProvider now returns ClassLikeInfo's instead of PSI

This commit is contained in:
Andrey Breslav
2014-03-28 18:24:07 +04:00
parent 06e901e2c7
commit caa80a0552
6 changed files with 27 additions and 17 deletions
@@ -23,8 +23,6 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Function; import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import kotlin.Function0; import kotlin.Function0;
import kotlin.Function1;
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.annotations.ReadOnly; import org.jetbrains.annotations.ReadOnly;
@@ -210,14 +208,17 @@ public class ResolveSession implements KotlinCodeAnalyzer {
PackageMemberDeclarationProvider provider = declarationProviderFactory.getPackageMemberDeclarationProvider(fqName.parent()); PackageMemberDeclarationProvider provider = declarationProviderFactory.getPackageMemberDeclarationProvider(fqName.parent());
if (provider == null) return Collections.emptyList(); if (provider == null) return Collections.emptyList();
return KotlinPackage.map( return ContainerUtil.mapNotNull(
provider.getClassOrObjectDeclarations(fqName.shortName()), provider.getClassOrObjectDeclarations(fqName.shortName()),
new Function1<JetClassOrObject, ClassDescriptor>() { new Function<JetClassLikeInfo, ClassDescriptor>() {
@Override @Override
public ClassDescriptor invoke(JetClassOrObject classOrObject) { public ClassDescriptor fun(JetClassLikeInfo classLikeInfo) {
JetClassOrObject classOrObject = classLikeInfo.getCorrespondingClassOrObject();
if (classOrObject == null) return null;
return getClassDescriptor(classOrObject); return getClassDescriptor(classOrObject);
} }
}); }
);
} }
@Override @Override
@@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
public class JetClassInfoUtil { public class JetClassInfoUtil {
@NotNull
public static JetClassLikeInfo createClassLikeInfo(@NotNull JetClassOrObject classOrObject) { public static JetClassLikeInfo createClassLikeInfo(@NotNull JetClassOrObject classOrObject) {
if (classOrObject instanceof JetClass) { if (classOrObject instanceof JetClass) {
return new JetClassInfo((JetClass) classOrObject); return new JetClassInfo((JetClass) classOrObject);
@@ -23,6 +23,8 @@ import com.google.common.collect.Multimap;
import kotlin.Function0; import kotlin.Function0;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.storage.NotNullLazyValue; import org.jetbrains.jet.storage.NotNullLazyValue;
import org.jetbrains.jet.storage.StorageManager; import org.jetbrains.jet.storage.StorageManager;
@@ -39,7 +41,7 @@ public abstract class AbstractPsiBasedDeclarationProvider implements Declaration
private final List<JetDeclaration> allDeclarations = Lists.newArrayList(); private final List<JetDeclaration> allDeclarations = Lists.newArrayList();
private final Multimap<Name, JetNamedFunction> functions = HashMultimap.create(); private final Multimap<Name, JetNamedFunction> functions = HashMultimap.create();
private final Multimap<Name, JetProperty> properties = HashMultimap.create(); private final Multimap<Name, JetProperty> properties = HashMultimap.create();
private final Multimap<Name, JetClassOrObject> classesAndObjects = ArrayListMultimap.create(); // order matters here private final Multimap<Name, JetClassLikeInfo> classesAndObjects = ArrayListMultimap.create(); // order matters here
public void putToIndex(@NotNull JetDeclaration declaration) { public void putToIndex(@NotNull JetDeclaration declaration) {
if (declaration instanceof JetClassInitializer) { if (declaration instanceof JetClassInitializer) {
@@ -56,7 +58,10 @@ public abstract class AbstractPsiBasedDeclarationProvider implements Declaration
} }
else if (declaration instanceof JetClassOrObject) { else if (declaration instanceof JetClassOrObject) {
JetClassOrObject classOrObject = (JetClassOrObject) declaration; JetClassOrObject classOrObject = (JetClassOrObject) declaration;
classesAndObjects.put(safeNameForLazyResolve(classOrObject.getNameAsName()), classOrObject); classesAndObjects.put(
safeNameForLazyResolve(classOrObject.getNameAsName()),
JetClassInfoUtil.createClassLikeInfo(classOrObject)
);
} }
else if (declaration instanceof JetParameter || else if (declaration instanceof JetParameter ||
declaration instanceof JetTypedef || declaration instanceof JetTypedef ||
@@ -105,7 +110,7 @@ public abstract class AbstractPsiBasedDeclarationProvider implements Declaration
@NotNull @NotNull
@Override @Override
public Collection<JetClassOrObject> getClassOrObjectDeclarations(@NotNull Name name) { public Collection<JetClassLikeInfo> getClassOrObjectDeclarations(@NotNull Name name) {
return index.invoke().classesAndObjects.get(name); return index.invoke().classesAndObjects.get(name);
} }
} }
@@ -18,10 +18,10 @@ package org.jetbrains.jet.lang.resolve.lazy.declarations;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.ReadOnly; import org.jetbrains.annotations.ReadOnly;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetNamedFunction;
import org.jetbrains.jet.lang.psi.JetProperty; import org.jetbrains.jet.lang.psi.JetProperty;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collection; import java.util.Collection;
@@ -42,5 +42,5 @@ public interface DeclarationProvider {
@ReadOnly @ReadOnly
@NotNull @NotNull
Collection<JetClassOrObject> getClassOrObjectDeclarations(@NotNull Name name); Collection<JetClassLikeInfo> getClassOrObjectDeclarations(@NotNull Name name);
} }
@@ -28,7 +28,7 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo;
import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProvider; import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProvider;
import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.LabelName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -104,12 +104,12 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
@Nullable @Nullable
private List<ClassDescriptor> resolveClassDescriptor(@NotNull final Name name) { private List<ClassDescriptor> resolveClassDescriptor(@NotNull final Name name) {
Collection<JetClassOrObject> classOrObjectDeclarations = declarationProvider.getClassOrObjectDeclarations(name); Collection<JetClassLikeInfo> classOrObjectDeclarations = declarationProvider.getClassOrObjectDeclarations(name);
return ContainerUtil.mapNotNull(classOrObjectDeclarations, new Function<JetClassOrObject, ClassDescriptor>() { return ContainerUtil.mapNotNull(classOrObjectDeclarations, new Function<JetClassLikeInfo, ClassDescriptor>() {
@Override @Override
public ClassDescriptor fun(JetClassOrObject classOrObject) { public ClassDescriptor fun(JetClassLikeInfo classLikeInfo) {
return new LazyClassDescriptor(resolveSession, thisDescriptor, name, JetClassInfoUtil.createClassLikeInfo(classOrObject)); return new LazyClassDescriptor(resolveSession, thisDescriptor, name, classLikeInfo);
} }
}); });
} }
@@ -27,6 +27,8 @@ import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex
import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex
import org.jetbrains.jet.plugin.stubindex.PackageIndexUtil import org.jetbrains.jet.plugin.stubindex.PackageIndexUtil
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil
public class StubBasedPackageMemberDeclarationProvider( public class StubBasedPackageMemberDeclarationProvider(
private val fqName: FqName, private val fqName: FqName,
@@ -42,8 +44,9 @@ public class StubBasedPackageMemberDeclarationProvider(
} }
} }
override fun getClassOrObjectDeclarations(name: Name): Collection<JetClassOrObject> { override fun getClassOrObjectDeclarations(name: Name): Collection<JetClassLikeInfo> {
return JetFullClassNameIndex.getInstance().get(childName(name), project, searchScope) return JetFullClassNameIndex.getInstance().get(childName(name), project, searchScope)
.map { JetClassInfoUtil.createClassLikeInfo(it) }
} }
override fun getFunctionDeclarations(name: Name): Collection<JetNamedFunction> { override fun getFunctionDeclarations(name: Name): Collection<JetNamedFunction> {