diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt index 854b8038076..0301f58140e 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/DelegatePackageMemberDeclarationProvider.kt @@ -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 = delegate.getScriptDeclarations(name) + override fun getTypeAliasDeclarations(name: Name) = delegate.getTypeAliasDeclarations(name) override fun getDeclarationNames() = delegate.getDeclarationNames() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt index 67731aafdc8..87c57a9e338 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/synthetics/SyntheticClassOrObjectDescriptor.kt @@ -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 = emptyList() override fun getPropertyDeclarations(name: Name): Collection = emptyList() override fun getDestructuringDeclarationsEntries(name: Name): Collection = emptyList() - override fun getClassOrObjectDeclarations(name: Name): Collection = emptyList() + override fun getClassOrObjectDeclarations(name: Name): Collection> = emptyList() + override fun getScriptDeclarations(name: Name): Collection = emptyList() override fun getTypeAliasDeclarations(name: Name): Collection = emptyList() override fun getDeclarationNames() = emptySet() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java index b23b7db005d..a1652dbfa11 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java @@ -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( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/KtClassInfoUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/KtClassInfoUtil.java index df5149e14ee..218e681bc57 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/KtClassInfoUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/KtClassInfoUtil.java @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.psi.KtObjectDeclaration; public class KtClassInfoUtil { @NotNull - public static KtClassLikeInfo createClassLikeInfo(@NotNull KtClassOrObject classOrObject) { + public static KtClassOrObjectInfo createClassLikeInfo(@NotNull KtClassOrObject classOrObject) { if (classOrObject instanceof KtClass) { return new KtClassInfo((KtClass) classOrObject); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt index 4806de21fac..75c71f2b6ad 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt @@ -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() val functions = ArrayListMultimap.create() val properties = ArrayListMultimap.create() - val classesAndObjects = ArrayListMultimap.create() // order matters here + val classesAndObjects = ArrayListMultimap.create>() // order matters here + val scripts = ArrayListMultimap.create() val typeAliases = ArrayListMultimap.create() val destructuringDeclarationsEntries = ArrayListMultimap.create() val names = hashSetOf() @@ -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 = index().destructuringDeclarationsEntries[name.safeNameForLazyResolve()].toList() - override fun getClassOrObjectDeclarations(name: Name): Collection = + override fun getClassOrObjectDeclarations(name: Name): Collection> = index().classesAndObjects[name.safeNameForLazyResolve()] + override fun getScriptDeclarations(name: Name): MutableList = + index().scripts[name.safeNameForLazyResolve()] + override fun getTypeAliasDeclarations(name: Name): Collection = index().typeAliases[name.safeNameForLazyResolve()] } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt index 22a62b108bf..ee6a39b68ae 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/CombinedPackageMemberDeclarationProvider.kt @@ -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 = providers.flatMapTo(HashSet()) { it.getDeclarationNames() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt index cf484b2588e..420c64de236 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider.kt @@ -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 - fun getClassOrObjectDeclarations(name: Name): Collection + fun getClassOrObjectDeclarations(name: Name): Collection> + + fun getScriptDeclarations(name: Name): Collection fun getTypeAliasDeclarations(name: Name): Collection diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt index 953a4d19204..b10816026ae 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt @@ -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 { val result = linkedSetOf() - 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() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt index 6e6107145d0..31793e9e676 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt @@ -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 { - val result = ArrayList() - 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> = runReadAction { + KotlinFullClassNameIndex.getInstance().get(childName(name), project, searchScope) + .map { KtClassInfoUtil.createClassLikeInfo(it) } } + override fun getScriptDeclarations(name: Name): Collection = runReadAction { + KotlinScriptFqnIndex.instance.get(childName(name), project, searchScope) + .map(::KtScriptInfo) + } + + override fun getFunctionDeclarations(name: Name): Collection { return runReadAction { KotlinTopLevelFunctionFqnNameIndex.getInstance().get(childName(name), project, searchScope) diff --git a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/scriptingResolveExtension.kt b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/scriptingResolveExtension.kt index 46622764ef2..6a6c3110372 100644 --- a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/scriptingResolveExtension.kt +++ b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/scriptingResolveExtension.kt @@ -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 ) { - 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)