Split scripts and class/object declarations in DeclarationsProvider

simplifies code in most places, avoids filtering in places where they
should be processed independently
This commit is contained in:
Ilya Chernikov
2019-02-12 15:26:37 +01:00
parent a218455193
commit e28017039d
10 changed files with 45 additions and 51 deletions
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.cli.jvm.repl
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.lazy.declarations.PackageMemberDeclarationProvider
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
@@ -45,6 +46,8 @@ open class DelegatePackageMemberDeclarationProvider(var delegate: PackageMemberD
override fun getClassOrObjectDeclarations(name: Name) = delegate.getClassOrObjectDeclarations(name)
override fun getScriptDeclarations(name: Name): Collection<KtScriptInfo> = delegate.getScriptDeclarations(name)
override fun getTypeAliasDeclarations(name: Name) = delegate.getTypeAliasDeclarations(name)
override fun getDeclarationNames() = delegate.getDeclarationNames()
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.lazy.LazyClassContext
import org.jetbrains.kotlin.resolve.lazy.data.KtClassLikeInfo
import org.jetbrains.kotlin.resolve.lazy.data.KtClassOrObjectInfo
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider
import org.jetbrains.kotlin.resolve.lazy.descriptors.ClassResolutionScopesSupport
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassMemberScope
@@ -136,7 +138,8 @@ class SyntheticClassOrObjectDescriptor(
override fun getFunctionDeclarations(name: Name): Collection<KtNamedFunction> = emptyList()
override fun getPropertyDeclarations(name: Name): Collection<KtProperty> = emptyList()
override fun getDestructuringDeclarationsEntries(name: Name): Collection<KtDestructuringDeclarationEntry> = emptyList()
override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo> = emptyList()
override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassOrObjectInfo<*>> = emptyList()
override fun getScriptDeclarations(name: Name): Collection<KtScriptInfo> = emptyList()
override fun getTypeAliasDeclarations(name: Name): Collection<KtTypeAlias> = emptyList()
override fun getDeclarationNames() = emptySet<Name>()
}
@@ -36,8 +36,6 @@ import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.*;
import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor;
import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension;
import org.jetbrains.kotlin.resolve.lazy.data.KtClassOrObjectInfo;
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo;
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory;
import org.jetbrains.kotlin.resolve.lazy.declarations.PackageMemberDeclarationProvider;
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotations;
@@ -263,20 +261,12 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
result.addAll(ContainerUtil.mapNotNull(
provider.getClassOrObjectDeclarations(fqName.shortName()),
classLikeInfo -> {
if (classLikeInfo instanceof KtClassOrObjectInfo) {
//noinspection RedundantCast
return getClassDescriptor(((KtClassOrObjectInfo) classLikeInfo).getCorrespondingClassOrObject(), location);
}
else if (classLikeInfo instanceof KtScriptInfo) {
return getScriptDescriptor(((KtScriptInfo) classLikeInfo).getScript());
}
else {
throw new IllegalStateException(
"Unexpected " + classLikeInfo + " of type " + classLikeInfo.getClass().getName()
);
}
}
classOrObjectInfo -> getClassDescriptor(classOrObjectInfo.getCorrespondingClassOrObject(), location)
));
result.addAll(ContainerUtil.mapNotNull(
provider.getScriptDeclarations(fqName.shortName()),
scriptInfo -> getScriptDescriptor(scriptInfo.getScript())
));
result.addAll(ContainerUtil.map(
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.psi.KtObjectDeclaration;
public class KtClassInfoUtil {
@NotNull
public static KtClassLikeInfo createClassLikeInfo(@NotNull KtClassOrObject classOrObject) {
public static KtClassOrObjectInfo<? extends KtClassOrObject> createClassLikeInfo(@NotNull KtClassOrObject classOrObject) {
if (classOrObject instanceof KtClass) {
return new KtClassInfo((KtClass) classOrObject);
}
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.safeNameForLazyResolve
import org.jetbrains.kotlin.resolve.lazy.data.KtClassInfoUtil
import org.jetbrains.kotlin.resolve.lazy.data.KtClassLikeInfo
import org.jetbrains.kotlin.resolve.lazy.data.KtClassOrObjectInfo
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.storage.StorageManager
@@ -34,7 +34,8 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage
val allDeclarations = ArrayList<KtDeclaration>()
val functions = ArrayListMultimap.create<Name, KtNamedFunction>()
val properties = ArrayListMultimap.create<Name, KtProperty>()
val classesAndObjects = ArrayListMultimap.create<Name, KtClassLikeInfo>() // order matters here
val classesAndObjects = ArrayListMultimap.create<Name, KtClassOrObjectInfo<*>>() // order matters here
val scripts = ArrayListMultimap.create<Name, KtScriptInfo>()
val typeAliases = ArrayListMultimap.create<Name, KtTypeAlias>()
val destructuringDeclarationsEntries = ArrayListMultimap.create<Name, KtDestructuringDeclarationEntry>()
val names = hashSetOf<Name>()
@@ -52,10 +53,8 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage
typeAliases.put(declaration.nameAsName.safeNameForLazyResolve(), declaration)
is KtClassOrObject ->
classesAndObjects.put(declaration.nameAsName.safeNameForLazyResolve(), KtClassInfoUtil.createClassLikeInfo(declaration))
is KtScript -> {
val scriptInfo = KtScriptInfo(declaration)
classesAndObjects.put(scriptInfo.script.nameAsName, scriptInfo)
}
is KtScript ->
scripts.put(KtScriptInfo(declaration).script.nameAsName, KtScriptInfo(declaration))
is KtDestructuringDeclaration -> {
for (entry in declaration.entries) {
val name = entry.nameAsName.safeNameForLazyResolve()
@@ -99,8 +98,11 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage
override fun getDestructuringDeclarationsEntries(name: Name): Collection<KtDestructuringDeclarationEntry> =
index().destructuringDeclarationsEntries[name.safeNameForLazyResolve()].toList()
override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo> =
override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassOrObjectInfo<*>> =
index().classesAndObjects[name.safeNameForLazyResolve()]
override fun getScriptDeclarations(name: Name): MutableList<KtScriptInfo> =
index().scripts[name.safeNameForLazyResolve()]
override fun getTypeAliasDeclarations(name: Name): Collection<KtTypeAlias> = index().typeAliases[name.safeNameForLazyResolve()]
}
@@ -43,6 +43,8 @@ class CombinedPackageMemberDeclarationProvider(
override fun getClassOrObjectDeclarations(name: Name) = providers.flatMap { it.getClassOrObjectDeclarations(name) }
override fun getScriptDeclarations(name: Name) = providers.flatMap { it.getScriptDeclarations(name) }
override fun getTypeAliasDeclarations(name: Name) = providers.flatMap { it.getTypeAliasDeclarations(name) }
override fun getDeclarationNames(): Set<Name> = providers.flatMapTo(HashSet()) { it.getDeclarationNames() }
@@ -18,7 +18,8 @@ package org.jetbrains.kotlin.resolve.lazy.declarations
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.lazy.data.KtClassLikeInfo
import org.jetbrains.kotlin.resolve.lazy.data.KtClassOrObjectInfo
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
interface DeclarationProvider {
@@ -30,7 +31,9 @@ interface DeclarationProvider {
fun getDestructuringDeclarationsEntries(name: Name): Collection<KtDestructuringDeclarationEntry>
fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo>
fun getClassOrObjectDeclarations(name: Name): Collection<KtClassOrObjectInfo<*>>
fun getScriptDeclarations(name: Name): Collection<KtScriptInfo>
fun getTypeAliasDeclarations(name: Name): Collection<KtTypeAlias>
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.lazy.LazyClassContext
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.lazy.declarations.AbstractPsiBasedDeclarationProvider
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProvider
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
@@ -54,12 +53,9 @@ protected constructor(
private fun doGetClasses(name: Name): List<ClassDescriptor> {
val result = linkedSetOf<ClassDescriptor>()
declarationProvider.getClassOrObjectDeclarations(name).mapNotNullTo(result) {
if (it is KtScriptInfo) null
else {
val isExternal = it.modifierList?.hasModifier(KtTokens.EXTERNAL_KEYWORD) ?: false
LazyClassDescriptor(c, thisDescriptor, name, it, isExternal)
}
declarationProvider.getClassOrObjectDeclarations(name).mapTo(result) {
val isExternal = it.modifierList?.hasModifier(KtTokens.EXTERNAL_KEYWORD) ?: false
LazyClassDescriptor(c, thisDescriptor, name, it, isExternal)
}
getNonDeclaredClasses(name, result)
return result.toList()
@@ -27,9 +27,8 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.safeNameForLazyResolve
import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils
import org.jetbrains.kotlin.resolve.lazy.data.KtClassInfoUtil
import org.jetbrains.kotlin.resolve.lazy.data.KtClassLikeInfo
import org.jetbrains.kotlin.resolve.lazy.data.KtClassOrObjectInfo
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.lazy.declarations.PackageMemberDeclarationProvider
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
@@ -74,18 +73,17 @@ class StubBasedPackageMemberDeclarationProvider(
override fun getDeclarationNames() = declarationNames_
override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassLikeInfo> {
val result = ArrayList<KtClassLikeInfo>()
runReadAction {
KotlinFullClassNameIndex.getInstance().get(childName(name), project, searchScope)
.mapTo(result) { KtClassInfoUtil.createClassLikeInfo(it) }
KotlinScriptFqnIndex.instance.get(childName(name), project, searchScope)
.mapTo(result, ::KtScriptInfo)
}
return result
override fun getClassOrObjectDeclarations(name: Name): Collection<KtClassOrObjectInfo<*>> = runReadAction {
KotlinFullClassNameIndex.getInstance().get(childName(name), project, searchScope)
.map { KtClassInfoUtil.createClassLikeInfo(it) }
}
override fun getScriptDeclarations(name: Name): Collection<KtScriptInfo> = runReadAction {
KotlinScriptFqnIndex.instance.get(childName(name), project, searchScope)
.map(::KtScriptInfo)
}
override fun getFunctionDeclarations(name: Name): Collection<KtNamedFunction> {
return runReadAction {
KotlinTopLevelFunctionFqnNameIndex.getInstance().get(childName(name), project, searchScope)
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
import org.jetbrains.kotlin.resolve.lazy.LazyClassContext
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.lazy.declarations.PackageMemberDeclarationProvider
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor
@@ -23,10 +22,8 @@ class ScriptingResolveExtension : SyntheticResolveExtension {
declarationProvider: PackageMemberDeclarationProvider,
result: MutableSet<ClassDescriptor>
) {
declarationProvider.getClassOrObjectDeclarations(name).mapNotNullTo(result) {
if (it is KtScriptInfo) {
LazyScriptDescriptor(ctx as ResolveSession, thisDescriptor, name, it)
} else null
declarationProvider.getScriptDeclarations(name).mapTo(result) {
LazyScriptDescriptor(ctx as ResolveSession, thisDescriptor, name, it)
}
super.generateSyntheticClasses(thisDescriptor, name, ctx, declarationProvider, result)