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:
+3
@@ -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()
|
||||
|
||||
+4
-1
@@ -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);
|
||||
}
|
||||
|
||||
+9
-7
@@ -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()]
|
||||
}
|
||||
|
||||
+2
@@ -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() }
|
||||
|
||||
+5
-2
@@ -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>
|
||||
|
||||
|
||||
+3
-7
@@ -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()
|
||||
|
||||
+10
-12
@@ -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)
|
||||
|
||||
+2
-5
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user