From 606c3c136c227f23b0fee2ecb483a77f75242bbf Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sat, 19 Jun 2021 22:01:29 +0200 Subject: [PATCH] FIR IDE: remove dependency to IDEA from low-level-api fir impl module --- idea/idea-fir-fe10-binding/build.gradle.kts | 1 + idea/idea-frontend-fir/build.gradle.kts | 10 ++-- .../low/level/api/ide/DeclarationProvider.kt | 52 ++++++++++++++++--- ...irModuleResolveStateConfiguratorIdeImpl.kt | 8 +-- .../level/api/ide/KtPackageProviderIdeImpl.kt | 32 ++++++++++++ .../api/ide/PackageExistenceCheckerIdeImpl.kt | 17 ------ .../low/level/api/DeclarationProviderBase.kt | 29 ++++++++--- .../fir/low/level/api/KtPackageProvider.kt | 26 ++++++++++ .../low/level/api/PackageExistenceChecker.kt | 12 ----- .../api/FirModuleResolveStateConfigurator.kt | 8 +-- .../low/level/api/providers/FirIdeProvider.kt | 7 +-- .../level/api/providers/FirProviderHelper.kt | 10 ++-- .../api/sessions/FirIdeSessionFactory.kt | 3 +- .../idea/fir/low/level/api/util/utils.kt | 8 +-- .../based/FrontendApiTestWithTestdata.kt | 27 +++++----- .../test/base/DeclarationProviderTestImpl.kt | 2 +- ...stImpl.kt => KtPackageProviderTestImpl.kt} | 12 +++-- .../FirLightClassForClassOrObjectSymbol.kt | 2 - .../asJava/fields/FirLightFieldEnumEntry.kt | 1 - .../kotlin/idea/asJava/lightClassUtils.kt | 6 ++- .../FirLightAccessorMethodForSymbol.kt | 1 - .../idea/asJava/methods/FirLightMethod.kt | 11 ++-- .../methods/FirLightSimpleMethodForSymbol.kt | 1 - .../parameters/FirLightParameterForSymbol.kt | 1 - ...deDeserializedDeclarationSourceProvider.kt | 43 ++++++--------- .../frontend/api/fir/KtFirAnalysisSession.kt | 3 +- .../frontend/api/fir/KtSymbolByFirBuilder.kt | 5 +- .../KtFirCompletionCandidateChecker.kt | 2 +- .../fir/components/KtFirReferenceShortener.kt | 15 +++--- .../api/fir/components/KtFirScopeProvider.kt | 2 +- ...tFirSymbolContainingDeclarationProvider.kt | 2 +- .../fir/components/KtFirVisibilityChecker.kt | 2 +- .../api/fir/renderer/FirIdeRenderer.kt | 2 +- .../api/fir/scopes/KtFirPackageScope.kt | 28 +++++----- .../api/fir/scopes/KtFirStarImportingScope.kt | 50 +++++------------- .../api/fir/symbols/KtFirPackageSymbol.kt | 4 +- .../api/fir/symbols/firSymbolUtils.kt | 2 +- .../idea/references/KtFirReferenceResolver.kt | 2 +- idea/resources-fir/META-INF/plugin.xml | 7 +++ 39 files changed, 246 insertions(+), 210 deletions(-) create mode 100644 idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/KtPackageProviderIdeImpl.kt delete mode 100644 idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/PackageExistenceCheckerIdeImpl.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/KtPackageProvider.kt delete mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/PackageExistenceChecker.kt rename idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/{PackageExistenceCheckerTestImpl.kt => KtPackageProviderTestImpl.kt} (63%) diff --git a/idea/idea-fir-fe10-binding/build.gradle.kts b/idea/idea-fir-fe10-binding/build.gradle.kts index 1122e5b0b11..f4ae0846fcd 100644 --- a/idea/idea-fir-fe10-binding/build.gradle.kts +++ b/idea/idea-fir-fe10-binding/build.gradle.kts @@ -5,6 +5,7 @@ plugins { dependencies { implementation(project(":idea:idea-frontend-fir")) + implementation(project(":idea")) testImplementation(projectTests(":idea:idea-fir")) testImplementation(projectTests(":idea:idea-frontend-independent")) diff --git a/idea/idea-frontend-fir/build.gradle.kts b/idea/idea-frontend-fir/build.gradle.kts index a4872913053..1d0a8cdbf58 100644 --- a/idea/idea-frontend-fir/build.gradle.kts +++ b/idea/idea-frontend-fir/build.gradle.kts @@ -14,14 +14,10 @@ dependencies { compile(project(":compiler:fir:java")) compile(project(":compiler:fir:jvm")) compile(project(":idea:idea-frontend-fir:idea-fir-low-level-api")) - compile(project(":idea:idea-frontend-fir:fir-low-level-api-ide-impl")) - compile(intellijDep()) + compile(project(":idea:idea-frontend-api")) + compile(project(":compiler:light-classes")) compile(intellijCoreDep()) -// - compile(project(":idea:idea-core")) -// - testCompile(project(":idea:idea-fir")) testCompile(intellijDep()) testCompile(intellijCoreDep()) @@ -34,7 +30,7 @@ dependencies { testCompile(commonDep("junit:junit")) testCompile(projectTests(":idea:idea-frontend-independent")) - compile(intellijPluginDep("java")) +// compile(intellijPluginDep("java")) } sourceSets { diff --git a/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/DeclarationProvider.kt b/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/DeclarationProvider.kt index fb3be6cf793..ad53ed176bc 100644 --- a/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/DeclarationProvider.kt +++ b/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/DeclarationProvider.kt @@ -11,6 +11,7 @@ import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.stubs.StubIndex import com.intellij.psi.stubs.StubIndexKey import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.KtDeclarationProviderFactory import org.jetbrains.kotlin.idea.stubindex.* import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId @@ -19,7 +20,11 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* -internal class DeclarationProviderByIndexesImpl(val project: Project, private val scope: GlobalSearchScope) : DeclarationProvider() { +internal class DeclarationProviderByIndexesImpl( + val project: Project, + override val searchScope: GlobalSearchScope +) : DeclarationProvider() { + private val stubIndex: StubIndex = StubIndex.getInstance() private inline fun firstMatchingOrNull( @@ -29,7 +34,7 @@ internal class DeclarationProviderByIndexesImpl(val project: Project, private va ): PSI? { var result: PSI? = null stubIndex.processElements( - stubKey, key, project, scope, PSI::class.java, + stubKey, key, project, searchScope, PSI::class.java, ) { candidate -> if (filter(candidate)) { result = candidate @@ -40,12 +45,39 @@ internal class DeclarationProviderByIndexesImpl(val project: Project, private va return result } - override fun getClassByClassId(classId: ClassId) = firstMatchingOrNull( + + override fun getClassesByClassId(classId: ClassId): Collection { + return listOfNotNull(getClassByClassId(classId))//todo + } + + override fun getTypeAliasesByClassId(classId: ClassId): Collection { + return listOfNotNull(getTypeAliasByClassId(classId))//todo + } + + override fun getTypeAliasNamesInPackage(packageFqName: FqName): Set { + return KotlinTopLevelTypeAliasByPackageIndex + .getInstance()[packageFqName.asStringForIndexes(), project, searchScope] + .mapNotNullTo(mutableSetOf()) { it.nameAsName } + } + + override fun getPropertyNamesInPackage(packageFqName: FqName): Set { + return KotlinTopLevelPropertyByPackageIndex + .getInstance()[packageFqName.asStringForIndexes(), project, searchScope] + .mapNotNullTo(mutableSetOf()) { it.nameAsName } + } + + override fun getFunctionsNamesInPackage(packageFqName: FqName): Set { + return KotlinTopLevelFunctionByPackageIndex + .getInstance()[packageFqName.asStringForIndexes(), project, searchScope] + .mapNotNullTo(mutableSetOf()) { it.nameAsName } + } + + private fun getClassByClassId(classId: ClassId) = firstMatchingOrNull( KotlinFullClassNameIndex.KEY, classId.asStringForIndexes(), ) { candidate -> candidate.containingKtFile.packageFqName == classId.packageFqName } - override fun getTypeAliasByClassId(classId: ClassId): KtTypeAlias? = firstMatchingOrNull( + private fun getTypeAliasByClassId(classId: ClassId): KtTypeAlias? = firstMatchingOrNull( KotlinTopLevelTypeAliasFqNameIndex.KEY, key = classId.asStringForIndexes(), ) { candidate -> candidate.containingKtFile.packageFqName == classId.packageFqName } @@ -55,15 +87,15 @@ internal class DeclarationProviderByIndexesImpl(val project: Project, private va ) override fun getTopLevelProperties(callableId: CallableId): Collection = - KotlinTopLevelPropertyFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, scope] + KotlinTopLevelPropertyFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, searchScope] override fun getTopLevelFunctions(callableId: CallableId): Collection = - KotlinTopLevelFunctionFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, scope] + KotlinTopLevelFunctionFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, searchScope] override fun getClassNamesInPackage(packageFqName: FqName): Set = KotlinTopLevelClassByPackageIndex.getInstance() - .get(packageFqName.asStringForIndexes(), project, scope) + .get(packageFqName.asStringForIndexes(), project, searchScope) .mapNotNullTo(hashSetOf()) { it.nameAsName } @@ -78,3 +110,9 @@ internal class DeclarationProviderByIndexesImpl(val project: Project, private va asSingleFqName().asStringForIndexes() } } + +class KtDeclarationProviderFactoryIdeImpl(private val project: Project) : KtDeclarationProviderFactory() { + override fun createDeclarationProvider(searchScope: GlobalSearchScope): DeclarationProvider { + return DeclarationProviderByIndexesImpl(project, searchScope) + } +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/FirModuleResolveStateConfiguratorIdeImpl.kt b/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/FirModuleResolveStateConfiguratorIdeImpl.kt index a8aa979e635..2d7df0fc10d 100644 --- a/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/FirModuleResolveStateConfiguratorIdeImpl.kt +++ b/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/FirModuleResolveStateConfiguratorIdeImpl.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.idea.caches.project.SdkInfo import org.jetbrains.kotlin.idea.caches.project.getModuleInfo import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider -import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceChecker +import org.jetbrains.kotlin.idea.fir.low.level.api.KtPackageProvider import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveStateConfigurator import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.load.kotlin.PackagePartProvider @@ -32,12 +32,6 @@ import java.nio.file.Path import java.nio.file.Paths class FirModuleResolveStateConfiguratorIdeImpl(private val project: Project) : FirModuleResolveStateConfigurator() { - override fun createDeclarationProvider(scope: GlobalSearchScope): DeclarationProvider = - DeclarationProviderByIndexesImpl(project, scope) - - override fun createPackageExistingCheckerForModule(moduleInfo: ModuleInfo): PackageExistenceChecker = - PackageExistenceCheckerIdeImpl(project, moduleInfo) - override fun createPackagePartsProvider(scope: GlobalSearchScope): PackagePartProvider = IDEPackagePartProvider(scope) diff --git a/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/KtPackageProviderIdeImpl.kt b/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/KtPackageProviderIdeImpl.kt new file mode 100644 index 00000000000..ede090b8889 --- /dev/null +++ b/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/KtPackageProviderIdeImpl.kt @@ -0,0 +1,32 @@ +package org.jetbrains.kotlin.idea.fir.low.level.api.ide + +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.idea.fir.low.level.api.KtPackageProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.KtPackageProviderFactory +import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.TargetPlatform +import org.jetbrains.kotlin.idea.util.module + +internal class KtPackageProviderIdeImpl( + private val project: Project, + private val searchScope: GlobalSearchScope, +) : KtPackageProvider() { + + override fun isPackageExists(packageFqName: FqName): Boolean = + PackageIndexUtil.packageExists(packageFqName, searchScope, project) + + override fun getJavaAndKotlinSubPackageFqNames(packageFqName: FqName, targetPlatform: TargetPlatform): Set { + return PackageIndexUtil + .getJavaAndKotlinSubPackageFqNames(packageFqName, searchScope, project, targetPlatform) { true } + .mapTo(mutableSetOf()) { it.shortName() } + } +} + +class KtPackageProviderFactoryIdeImpl(private val project: Project) : KtPackageProviderFactory() { + override fun createPackageProvider(searchScope: GlobalSearchScope): KtPackageProvider { + return KtPackageProviderIdeImpl(project, searchScope) + } +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/PackageExistenceCheckerIdeImpl.kt b/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/PackageExistenceCheckerIdeImpl.kt deleted file mode 100644 index 1d3b30f801a..00000000000 --- a/idea/idea-frontend-fir/fir-low-level-api-ide-impl/src/org/jetbrains/kotlin/idea/fir/low/level/api/ide/PackageExistenceCheckerIdeImpl.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.jetbrains.kotlin.idea.fir.low.level.api.ide - -import com.intellij.openapi.components.service -import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.idea.caches.resolve.IdePackageOracleFactory -import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceChecker -import org.jetbrains.kotlin.name.FqName - -internal class PackageExistenceCheckerIdeImpl( - project: Project, - module: ModuleInfo -) : PackageExistenceChecker() { - private val oracle = project.service().createOracle(module) - - override fun isPackageExists(packageFqName: FqName): Boolean = oracle.packageExists(packageFqName) -} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProviderBase.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProviderBase.kt index 510ad6cad61..ad04d23b7e0 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProviderBase.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/DeclarationProviderBase.kt @@ -5,6 +5,9 @@ package org.jetbrains.kotlin.idea.fir.low.level.api +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -15,13 +18,25 @@ import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtTypeAlias abstract class DeclarationProvider { - abstract fun getClassByClassId(classId: ClassId): KtClassOrObject? + abstract val searchScope: GlobalSearchScope - abstract fun getTypeAliasByClassId(classId: ClassId): KtTypeAlias? - - abstract fun getTopLevelProperties(callableId: CallableId): Collection - - abstract fun getTopLevelFunctions(callableId: CallableId): Collection + abstract fun getClassesByClassId(classId: ClassId): Collection + abstract fun getTypeAliasesByClassId(classId: ClassId): Collection abstract fun getClassNamesInPackage(packageFqName: FqName): Set -} \ No newline at end of file + abstract fun getTypeAliasNamesInPackage(packageFqName: FqName): Set + + abstract fun getTopLevelProperties(callableId: CallableId): Collection + abstract fun getTopLevelFunctions(callableId: CallableId): Collection + + abstract fun getPropertyNamesInPackage(packageFqName: FqName): Set + abstract fun getFunctionsNamesInPackage(packageFqName: FqName): Set +} + +abstract class KtDeclarationProviderFactory { + abstract fun createDeclarationProvider(searchScope: GlobalSearchScope): DeclarationProvider +} + +fun Project.createDeclarationProvider(searchScope: GlobalSearchScope): DeclarationProvider = + ServiceManager.getService(this, KtDeclarationProviderFactory::class.java) + .createDeclarationProvider(searchScope) \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/KtPackageProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/KtPackageProvider.kt new file mode 100644 index 00000000000..a845dc274f1 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/KtPackageProvider.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api + +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.TargetPlatform + +abstract class KtPackageProvider { + abstract fun isPackageExists(packageFqName: FqName): Boolean + abstract fun getJavaAndKotlinSubPackageFqNames(packageFqName: FqName, targetPlatform: TargetPlatform): Set +} + +abstract class KtPackageProviderFactory { + abstract fun createPackageProvider(searchScope: GlobalSearchScope): KtPackageProvider +} + +fun Project.createPackageProvider(searchScope: GlobalSearchScope): KtPackageProvider = + ServiceManager.getService(this, KtPackageProviderFactory::class.java) + .createPackageProvider(searchScope) \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/PackageExistenceChecker.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/PackageExistenceChecker.kt deleted file mode 100644 index 6697d8b51ed..00000000000 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/PackageExistenceChecker.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.idea.fir.low.level.api - -import org.jetbrains.kotlin.name.FqName - -abstract class PackageExistenceChecker { - abstract fun isPackageExists(packageFqName: FqName): Boolean -} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveStateConfigurator.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveStateConfigurator.kt index 2c547c61f5d..5bbd1fa9861 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveStateConfigurator.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirModuleResolveStateConfigurator.kt @@ -6,29 +6,23 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.api import com.intellij.openapi.components.ServiceManager -import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase -import org.jetbrains.kotlin.analyzer.SdkInfoBase import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider -import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceChecker +import org.jetbrains.kotlin.idea.fir.low.level.api.KtPackageProvider import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.psi.KtElement -import java.nio.file.Path abstract class FirModuleResolveStateConfigurator { - abstract fun createDeclarationProvider(scope: GlobalSearchScope): DeclarationProvider - abstract fun createPackageExistingCheckerForModule(moduleInfo: ModuleInfo): PackageExistenceChecker abstract fun createPackagePartsProvider(scope: GlobalSearchScope): PackagePartProvider abstract fun createModuleDataProvider(moduleInfo: ModuleSourceInfoBase): ModuleDataProvider - abstract fun getLanguageVersionSettings(moduleInfo: ModuleSourceInfoBase): LanguageVersionSettings abstract fun getModuleSourceScope(moduleInfo: ModuleSourceInfoBase): GlobalSearchScope abstract fun createScopeForModuleLibraries(moduleInfo: ModuleSourceInfoBase): GlobalSearchScope diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt index 4a48ed13c77..19742dc492b 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt @@ -21,7 +21,10 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.KtPackageProvider import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveStateConfigurator +import org.jetbrains.kotlin.idea.fir.low.level.api.api.stateConfigurator +import org.jetbrains.kotlin.idea.fir.low.level.api.createPackageProvider import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.name.ClassId @@ -37,12 +40,10 @@ internal class FirIdeProvider( firFileBuilder: FirFileBuilder, val cache: ModuleFileCache, private val declarationProvider: DeclarationProvider, + private val packageExistenceChecker: KtPackageProvider, ) : FirProvider() { override val symbolProvider: FirSymbolProvider = SymbolProvider() - private val packageExistenceChecker = ServiceManager.getService(project, FirModuleResolveStateConfigurator::class.java) - .createPackageExistingCheckerForModule(moduleInfo) - private val providerHelper = FirProviderHelper( cache, firFileBuilder, diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt index 8acbdbcd386..38107ab57de 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider -import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceChecker +import org.jetbrains.kotlin.idea.fir.low.level.api.KtPackageProvider import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.util.FirElementFinder @@ -29,14 +29,14 @@ internal class FirProviderHelper( private val cache: ModuleFileCache, private val firFileBuilder: FirFileBuilder, private val declarationProvider: DeclarationProvider, - private val packageExistenceChecker: PackageExistenceChecker, + private val packageProvider: KtPackageProvider, ) { fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? { if (classId.isLocal) return null return executeOrReturnDefaultValueOnPCE(null) { cache.classifierByClassId.computeIfAbsent(classId) { - val ktClass = when (val klass = declarationProvider.getClassByClassId(classId)) { - null -> declarationProvider.getTypeAliasByClassId(classId) + val ktClass = when (val klass = declarationProvider.getClassesByClassId(classId).firstOrNull()) { + null -> declarationProvider.getTypeAliasesByClassId(classId).firstOrNull() else -> if (klass.getClassId() == null) null else klass } ?: return@computeIfAbsent Optional.empty() val firFile = firFileBuilder.buildRawFirFileWithCaching(ktClass.containingKtFile, cache, preferLazyBodies = true) @@ -86,5 +86,5 @@ internal class FirProviderHelper( } fun getPackage(fqName: FqName): FqName? = - fqName.takeIf(packageExistenceChecker::isPackageExists) + fqName.takeIf(packageProvider::isPackageExists) } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt index 4a34424022b..5eb16923d51 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt @@ -97,7 +97,8 @@ internal object FirIdeSessionFactory { scopeProvider, firFileBuilder, cache, - configurator.createDeclarationProvider(searchScope), + project.createDeclarationProvider(searchScope), + project.createPackageProvider(searchScope), ) register(FirProvider::class, provider) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/utils.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/utils.kt index ee093e9bdfc..77df6046e6e 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/utils.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/utils.kt @@ -126,7 +126,7 @@ internal inline fun cachedValue(project: Project, vararg dependencies: Any, internal fun psiModificationTrackerBasedCachedValue(project: Project, createValue: () -> T) = cachedValue(project, PsiModificationTracker.MODIFICATION_COUNT, createValue = createValue) -internal fun KtElement.getElementTextInContext(): String { +fun KtElement.getElementTextInContext(): String { val context = parentOfType() ?: parentOfType() ?: containingDeclarationForPseudocode @@ -148,13 +148,13 @@ internal fun KtElement.getElementTextInContext(): String { private const val ELEMENT_TAG = "ELEMENT" -internal inline fun PsiElement.parentOfType(withSelf: Boolean = false): T? { +inline fun PsiElement.parentOfType(withSelf: Boolean = false): T? { return PsiTreeUtil.getParentOfType(this, T::class.java, !withSelf) } -internal fun PsiElement.parentsOfType(clazz: Class, withSelf: Boolean = true): Sequence { +fun PsiElement.parentsOfType(clazz: Class, withSelf: Boolean = true): Sequence { return (if (withSelf) parentsWithSelf else parents).filterIsInstance(clazz) } -internal inline fun PsiElement.parentsOfType(withSelf: Boolean = true): Sequence = +inline fun PsiElement.parentsOfType(withSelf: Boolean = true): Sequence = parentsOfType(T::class.java, withSelf) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/compiler/based/FrontendApiTestWithTestdata.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/compiler/based/FrontendApiTestWithTestdata.kt index 3f002f5d998..2b470a939a1 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/compiler/based/FrontendApiTestWithTestdata.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/compiler/based/FrontendApiTestWithTestdata.kt @@ -22,15 +22,12 @@ import org.jetbrains.kotlin.fir.analysis.FirAnalyzerFacade import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider import org.jetbrains.kotlin.fir.session.FirModuleInfoBasedModuleData -import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider -import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeResolveStateService -import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceChecker +import org.jetbrains.kotlin.idea.fir.low.level.api.* import org.jetbrains.kotlin.idea.fir.low.level.api.api.* -import org.jetbrains.kotlin.idea.fir.low.level.api.createResolveStateForNoCaching import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession import org.jetbrains.kotlin.idea.fir.low.level.api.test.base.DeclarationProviderTestImpl import org.jetbrains.kotlin.idea.fir.low.level.api.test.base.KotlinOutOfBlockModificationTrackerFactoryTestImpl -import org.jetbrains.kotlin.idea.fir.low.level.api.test.base.PackageExistenceCheckerTestImpl +import org.jetbrains.kotlin.idea.fir.low.level.api.test.base.KtPackageProviderTestImpl import org.jetbrains.kotlin.idea.fir.low.level.api.test.base.SealedClassInheritorsProviderTestImpl import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.name.Name @@ -39,6 +36,7 @@ import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices +import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory import org.jetbrains.kotlin.test.TestConfiguration import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.testConfiguration @@ -125,15 +123,6 @@ abstract class FrontendApiTestWithTestdata : AbstractKotlinCompilerTest() { val configurator = object : FirModuleResolveStateConfigurator() { private val sealedClassInheritorsProvider = SealedClassInheritorsProviderTestImpl() - private val packageExistenceChecker = PackageExistenceCheckerTestImpl(sourcesScope, ktFiles.values) - - override fun createDeclarationProvider(scope: GlobalSearchScope): DeclarationProvider { - return DeclarationProviderTestImpl(scope, ktFiles.values) - } - - override fun createPackageExistingCheckerForModule(moduleInfo: ModuleInfo): PackageExistenceChecker { - return packageExistenceChecker - } override fun createPackagePartsProvider(scope: GlobalSearchScope): PackagePartProvider { return packagePartProviderFactory.invoke(scope) @@ -188,6 +177,16 @@ abstract class FrontendApiTestWithTestdata : AbstractKotlinCompilerTest() { KotlinOutOfBlockModificationTrackerFactory::class.java, KotlinOutOfBlockModificationTrackerFactoryTestImpl::class.java ) + registerService(KtDeclarationProviderFactory::class.java, object : KtDeclarationProviderFactory() { + override fun createDeclarationProvider(searchScope: GlobalSearchScope): DeclarationProvider { + return DeclarationProviderTestImpl(searchScope, ktFiles.values) + } + }) + registerService(KtPackageProviderFactory::class.java, object : KtPackageProviderFactory() { + override fun createPackageProvider(searchScope: GlobalSearchScope): KtPackageProvider { + return KtPackageProviderTestImpl(searchScope, ktFiles.values) + } + }) } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/DeclarationProviderTestImpl.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/DeclarationProviderTestImpl.kt index 1e70dd1685d..cabd0df3cdb 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/DeclarationProviderTestImpl.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/DeclarationProviderTestImpl.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType internal class DeclarationProviderTestImpl( - searchScope: GlobalSearchScope, + override val searchScope: GlobalSearchScope, ktFiles: Collection ) : DeclarationProvider() { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/PackageExistenceCheckerTestImpl.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/KtPackageProviderTestImpl.kt similarity index 63% rename from idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/PackageExistenceCheckerTestImpl.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/KtPackageProviderTestImpl.kt index 34dd021ccfe..8c77bce512d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/PackageExistenceCheckerTestImpl.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/KtPackageProviderTestImpl.kt @@ -6,17 +6,23 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.test.base import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceChecker +import org.jetbrains.kotlin.idea.fir.low.level.api.KtPackageProvider import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.psi.KtFile -internal class PackageExistenceCheckerTestImpl( +internal class KtPackageProviderTestImpl( scope: GlobalSearchScope, files: Collection -) : PackageExistenceChecker() { +) : KtPackageProvider() { private val filesInScope = files.filter { scope.contains(it.virtualFile) } override fun isPackageExists(packageFqName: FqName): Boolean { return filesInScope.any { it.packageFqName == packageFqName } } + + override fun getJavaAndKotlinSubPackageFqNames(packageFqName: FqName, targetPlatform: TargetPlatform): Set { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForClassOrObjectSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForClassOrObjectSymbol.kt index 1f684d68e16..351c71b7949 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForClassOrObjectSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForClassOrObjectSymbol.kt @@ -21,8 +21,6 @@ import org.jetbrains.kotlin.idea.asJava.classes.getOrCreateFirLightClass import org.jetbrains.kotlin.idea.asJava.elements.FirLightTypeParameterListForSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind -import org.jetbrains.kotlin.idea.util.ifFalse -import org.jetbrains.kotlin.idea.util.ifTrue import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtClassBody diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldEnumEntry.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldEnumEntry.kt index 28182753b7a..9e8c81379bb 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldEnumEntry.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldEnumEntry.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.idea.asJava.* import org.jetbrains.kotlin.idea.frontend.api.isValid import org.jetbrains.kotlin.idea.frontend.api.symbols.KtEnumEntrySymbol -import org.jetbrains.kotlin.idea.util.ifTrue import org.jetbrains.kotlin.psi.KtEnumEntry internal class FirLightFieldForEnumEntry( diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/lightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/lightClassUtils.kt index 9ad03ec02b5..e3351af53da 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/lightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/lightClassUtils.kt @@ -9,4 +9,8 @@ import org.jetbrains.kotlin.idea.frontend.api.tokens.HackToForceAllowRunningAnal import org.jetbrains.kotlin.idea.frontend.api.tokens.hackyAllowRunningOnEdt @OptIn(HackToForceAllowRunningAnalyzeOnEDT::class) -internal inline fun allowLightClassesOnEdt(action: () -> E): E = hackyAllowRunningOnEdt(action) \ No newline at end of file +internal inline fun allowLightClassesOnEdt(action: () -> E): E = hackyAllowRunningOnEdt(action) + +internal inline fun Boolean.ifTrue(body: () -> T?): T? = if (this) body() else null + +internal inline fun Boolean.ifFalse(body: () -> T?): T? = if (!this) body() else null \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt index e4d5c0804f9..655ed346ac9 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.idea.asJava.parameters.FirLightSetterParameterForSymbol import org.jetbrains.kotlin.idea.frontend.api.isValid import org.jetbrains.kotlin.idea.frontend.api.symbols.* -import org.jetbrains.kotlin.idea.util.ifTrue import org.jetbrains.kotlin.load.java.JvmAbi.getterName import org.jetbrains.kotlin.load.java.JvmAbi.setterName import org.jetbrains.kotlin.psi.KtDeclaration diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightMethod.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightMethod.kt index 06a050a6c7c..587585fdb16 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightMethod.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightMethod.kt @@ -22,8 +22,6 @@ import org.jetbrains.kotlin.idea.frontend.api.isValid import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibility -import org.jetbrains.kotlin.idea.util.ifTrue -import org.jetbrains.kotlin.idea.util.module internal abstract class FirLightMethod( lightMemberOrigin: LightMemberOrigin?, @@ -95,10 +93,13 @@ internal abstract class FirLightMethod( if (effectiveVisibilityIfNotInternal != Visibilities.Internal) return defaultName - val moduleName = module?.name ?: return defaultName + //TODO +// val moduleName = module?.name ?: return defaultName - if (hasPublishedApiAnnotation(annotationUseSiteTarget)) return defaultName + return defaultName - return KotlinTypeMapper.InternalNameMapper.mangleInternalName(defaultName, moduleName) +// if (hasPublishedApiAnnotation(annotationUseSiteTarget)) return defaultName +// +// return KotlinTypeMapper.InternalNameMapper.mangleInternalName(defaultName, moduleName) } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt index 14945b8dfb7..b1e6cfa4775 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.idea.asJava.elements.FirLightTypeParameterListForSymbol import org.jetbrains.kotlin.idea.frontend.api.isValid import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol -import org.jetbrains.kotlin.idea.util.ifTrue import org.jetbrains.kotlin.lexer.KtTokens import java.util.* diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForSymbol.kt index d568199afa5..cb13d181c93 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForSymbol.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.idea.frontend.api.isValid import org.jetbrains.kotlin.idea.frontend.api.symbols.KtValueParameterSymbol -import org.jetbrains.kotlin.idea.util.ifTrue internal class FirLightParameterForSymbol( private val parameterSymbol: KtValueParameterSymbol, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt index c4ea25659b2..cd0464a4517 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt @@ -10,13 +10,15 @@ import com.intellij.psi.PsiElement import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.idea.fir.FirIdeDeserializedDeclarationSourceProvider.scope import org.jetbrains.kotlin.idea.fir.low.level.api.api.KtDeclarationAndFirDeclarationEqualityChecker +import org.jetbrains.kotlin.idea.fir.low.level.api.createDeclarationProvider import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession -import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex -import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex -import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelPropertyFqnNameIndex -import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelTypeAliasFqNameIndex + import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFunction @@ -41,11 +43,8 @@ object FirIdeDeserializedDeclarationSourceProvider { project: Project ): PsiElement? { val candidates = if (function.isTopLevel) { - KotlinTopLevelFunctionFqnNameIndex.getInstance().get( - function.symbol.callableId.asSingleFqName().asString(), - project, - function.scope(project) - ).filter(KtNamedFunction::isCompiled) + project.createDeclarationProvider(function.scope(project)).getTopLevelFunctions(function.symbol.callableId) + .filter(KtNamedFunction::isCompiled) } else { function.containingKtClass(project)?.body?.functions ?.filter { it.name == function.name.asString() && it.isCompiled() } @@ -57,11 +56,7 @@ object FirIdeDeserializedDeclarationSourceProvider { private fun provideSourceForProperty(property: FirProperty, project: Project): PsiElement? { val candidates = if (property.isTopLevel) { - KotlinTopLevelPropertyFqnNameIndex.getInstance().get( - property.symbol.callableId.asSingleFqName().asString(), - project, - property.scope(project) - ) + project.createDeclarationProvider(property.scope(project)).getTopLevelFunctions(property.symbol.callableId) } else { property.containingKtClass(project)?.declarations ?.filter { it.name == property.name.asString() } @@ -75,11 +70,7 @@ object FirIdeDeserializedDeclarationSourceProvider { classByClassId(klass.symbol.classId, klass.scope(project), project) private fun provideSourceForTypeAlias(alias: FirTypeAlias, project: Project): PsiElement? { - val candidates = KotlinTopLevelTypeAliasFqNameIndex.getInstance().get( - alias.symbol.classId.asStringForUsingInIndexes(), - project, - alias.scope(project) - ) + val candidates = project.createDeclarationProvider(alias.scope(project)).getTypeAliasesByClassId(alias.symbol.classId) return candidates.firstOrNull(KtElement::isCompiled) } @@ -119,21 +110,17 @@ object FirIdeDeserializedDeclarationSourceProvider { unwrapFakeOverrides().containingClass()?.classId?.let { classByClassId(it, scope(project), project) } private fun classByClassId(classId: ClassId, scope: GlobalSearchScope, project: Project): KtClassOrObject? { - val fqName = classId.asStringForUsingInIndexes().let { classIdMapping[it] ?: it } - return KotlinFullClassNameIndex.getInstance().get( - fqName, - project, - scope - ).firstOrNull(KtElement::isCompiled) + val correctedClassId = classIdMapping[classId] ?: classId + return project.createDeclarationProvider(scope) + .getClassesByClassId(correctedClassId) + .firstOrNull(KtElement::isCompiled) } private val FirCallableDeclaration<*>.isTopLevel get() = symbol.callableId.className == null - private fun ClassId.asStringForUsingInIndexes() = asString().replace('/', '.') - private val classIdMapping = (0..23).associate { i -> - "kotlin.Function$i" to "kotlin.jvm.functions.Function$i" + StandardClassIds.FunctionN(i) to ClassId(FqName("kotlin.jvm.functions"), Name.identifier("Function$i")) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt index 35d45a5a3d9..ffd0c9a9642 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirOverrideInfoProvi import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbolProvider import org.jetbrains.kotlin.idea.frontend.api.fir.utils.threadLocal import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken -import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile @@ -110,7 +109,7 @@ private constructor( val rootModuleSession: FirSession get() = firResolveState.rootModuleSession val firSymbolProvider: FirSymbolProvider get() = rootModuleSession.symbolProvider val targetPlatform: TargetPlatform get() = rootModuleSession.moduleData.platform - val searchScope: GlobalSearchScope = KotlinSourceFilterScope.projectSourceAndClassFiles(element.resolveScope, project) + val searchScope: GlobalSearchScope = element.resolveScope//todo companion object { @InvalidWayOfUsingAnalysisSession diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt index 12598aafae2..a100165fcae 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState +import org.jetbrains.kotlin.idea.fir.low.level.api.createPackageProvider import org.jetbrains.kotlin.idea.frontend.api.* import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.* import org.jetbrains.kotlin.idea.frontend.api.fir.types.* @@ -33,7 +34,6 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.types.KtType -import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.types.Variance @@ -111,10 +111,11 @@ internal class KtSymbolByFirBuilder private constructor( fun buildFileSymbol(fir: FirFile) = filesCache.cache(fir) { KtFirFileSymbol(fir, resolveState, token) } + private val packageProvider = project.createPackageProvider( GlobalSearchScope.allScope(project))//todo scope fun createPackageSymbolIfOneExists(packageFqName: FqName): KtFirPackageSymbol? { val exists = - PackageIndexUtil.packageExists(packageFqName, GlobalSearchScope.allScope(project), project) + packageProvider.isPackageExists(packageFqName) || JavaPsiFacade.getInstance(project).findPackage(packageFqName.asString()) != null if (!exists) { return null diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCompletionCandidateChecker.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCompletionCandidateChecker.kt index 5a87f14c5df..ba84b3784a3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCompletionCandidateChecker.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCompletionCandidateChecker.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.ResolutionParameters import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.SingleCandidateResolutionMode import org.jetbrains.kotlin.idea.fir.low.level.api.resolver.SingleCandidateResolver +import org.jetbrains.kotlin.idea.fir.low.level.api.util.getElementTextInContext import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.components.KtCompletionCandidateChecker import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession @@ -23,7 +24,6 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion -import org.jetbrains.kotlin.idea.util.getElementTextInContext import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtSimpleNameExpression diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt index bba0eb88d92..fec47f1051c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt @@ -8,9 +8,6 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.util.TextRange import com.intellij.psi.SmartPsiElementPointer -import com.intellij.psi.impl.source.PostprocessReformattingAspect -import com.intellij.psi.util.parentsOfType -import com.intellij.util.containers.addIfNotNull import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession @@ -49,6 +46,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForResolveOnAir import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerContextProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.util.parentsOfType import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.components.KtReferenceShortener import org.jetbrains.kotlin.idea.frontend.api.components.ShortenCommand @@ -58,9 +56,8 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer -import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector -import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability +import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.utils.addIfNotNull internal class KtFirReferenceShortener( override val analysisSession: KtFirAnalysisSession, @@ -459,8 +456,8 @@ private class ShortenCommandImpl( for (nameToImport in importsToAdd) { addImportToFile(targetFile.project, targetFile, nameToImport) } - - PostprocessReformattingAspect.getInstance(targetFile.project).disablePostprocessFormattingInside { +//todo +// PostprocessReformattingAspect.getInstance(targetFile.project).disablePostprocessFormattingInside { for (typePointer in typesToShorten) { val type = typePointer.element ?: continue type.deleteQualifier() @@ -470,7 +467,7 @@ private class ShortenCommandImpl( val call = callPointer.element ?: continue call.deleteQualifier() } - } +// } } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt index 0690aa4e8b8..f67340ba5f3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.api.LowLevelFirApiFacadeForResolveOnAir.getTowerContextProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.util.getElementTextInContext import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.components.KtImplicitReceiver @@ -36,7 +37,6 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclar import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion -import org.jetbrains.kotlin.idea.util.getElementTextInContext import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile import java.util.* diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index 39dd082e377..9c3821d0cc7 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -6,9 +6,9 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components import com.intellij.psi.PsiElement -import com.intellij.psi.util.parentOfType import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.psi +import org.jetbrains.kotlin.idea.fir.low.level.api.util.parentOfType import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.components.KtSymbolContainingDeclarationProvider import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirVisibilityChecker.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirVisibilityChecker.kt index 7040b034f3d..950a6eb6b01 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirVisibilityChecker.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirVisibilityChecker.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components import com.intellij.psi.PsiElement -import com.intellij.psi.util.parentsOfType import org.jetbrains.kotlin.fir.FirSymbolOwner import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration @@ -15,6 +14,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue import org.jetbrains.kotlin.fir.visibilityChecker import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDesignation import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirSafe +import org.jetbrains.kotlin.idea.fir.low.level.api.util.parentsOfType import org.jetbrains.kotlin.idea.frontend.api.components.KtVisibilityChecker import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirFileSymbol diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/renderer/FirIdeRenderer.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/renderer/FirIdeRenderer.kt index 6d17c9e4d8b..1e646d19502 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/renderer/FirIdeRenderer.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/renderer/FirIdeRenderer.kt @@ -18,10 +18,10 @@ import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.idea.asJava.applyIf +import org.jetbrains.kotlin.idea.asJava.ifTrue import org.jetbrains.kotlin.idea.frontend.api.components.KtDeclarationRendererOptions import org.jetbrains.kotlin.idea.frontend.api.components.RendererModifier import org.jetbrains.kotlin.idea.frontend.api.fir.types.PublicTypeApproximator -import org.jetbrains.kotlin.idea.util.ifTrue import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.renderer.render diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt index c8feac4a7c3..15ad21b79fa 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt @@ -9,7 +9,8 @@ import com.intellij.openapi.project.Project import com.intellij.psi.JavaPsiFacade import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope -import org.jetbrains.kotlin.idea.fir.low.level.api.api.searchScope +import org.jetbrains.kotlin.idea.fir.low.level.api.createDeclarationProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.createPackageProvider import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.components.KtFirScopeProvider @@ -19,15 +20,11 @@ import org.jetbrains.kotlin.idea.frontend.api.scopes.KtPackageScope import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeNameFilter import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassifierSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion -import org.jetbrains.kotlin.idea.search.getKotlinFqName -import org.jetbrains.kotlin.idea.stubindex.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.TargetPlatform -import org.jetbrains.kotlin.platform.jvm.isJvm internal class KtFirPackageScope( override val fqName: FqName, @@ -39,6 +36,8 @@ internal class KtFirPackageScope( private val targetPlatform: TargetPlatform, ) : KtPackageScope { private val scopeProvider by weakRef(_scopeProvider) + private val declarationsProvider = project.createDeclarationProvider(searchScope) + private val packageProvider = project.createPackageProvider(searchScope) private val firScope: FirPackageMemberScope by lazyThreadUnsafeWeakRef { val scope = FirPackageMemberScope(fqName, builder.rootSession) @@ -48,20 +47,15 @@ internal class KtFirPackageScope( override fun getPossibleCallableNames() = withValidityAssertion { hashSetOf().apply { - KotlinTopLevelPropertyByPackageIndex.getInstance()[fqName.asString(), project, searchScope] - .mapNotNullTo(this) { it.nameAsName } - KotlinTopLevelFunctionByPackageIndex.getInstance()[fqName.asString(), project, searchScope] - .mapNotNullTo(this) { it.nameAsName } + addAll(declarationsProvider.getFunctionsNamesInPackage(fqName)) + addAll(declarationsProvider.getPropertyNamesInPackage(fqName)) } } override fun getPossibleClassifierNames(): Set = withValidityAssertion { hashSetOf().apply { - KotlinTopLevelClassByPackageIndex.getInstance()[fqName.asString(), project, searchScope] - .mapNotNullTo(this) { it.nameAsName } - - KotlinTopLevelTypeAliasByPackageIndex.getInstance()[fqName.asString(), project, searchScope] - .mapNotNullTo(this) { it.nameAsName } + addAll(declarationsProvider.getClassNamesInPackage(fqName)) + addAll(declarationsProvider.getTypeAliasNamesInPackage(fqName)) JavaPsiFacade.getInstance(project) .findPackage(fqName.asString()) @@ -79,7 +73,9 @@ internal class KtFirPackageScope( } override fun getPackageSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { - PackageIndexUtil.getJavaAndKotlinSubPackageFqNames(fqName, searchScope, project, targetPlatform, nameFilter) - .map { builder.createPackageSymbol(it) } + packageProvider.getJavaAndKotlinSubPackageFqNames(fqName, targetPlatform) + .filter(nameFilter) + .map { builder.createPackageSymbol(fqName.child(it)) } + .asSequence() } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt index 64b26debae9..5b8925ebaff 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt @@ -11,23 +11,21 @@ import org.jetbrains.kotlin.fir.scopes.getContainingCallableNamesIfPresent import org.jetbrains.kotlin.fir.scopes.getContainingClassifierNamesIfPresent import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractStarImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirDefaultStarImportingScope +import org.jetbrains.kotlin.idea.fir.low.level.api.createDeclarationProvider import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner -import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef -import org.jetbrains.kotlin.idea.frontend.api.scopes.* +import org.jetbrains.kotlin.idea.frontend.api.scopes.Import +import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeNameFilter +import org.jetbrains.kotlin.idea.frontend.api.scopes.KtStarImportingScope +import org.jetbrains.kotlin.idea.frontend.api.scopes.StarImport import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol +import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion -import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelClassByPackageIndex -import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionByPackageIndex -import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelPropertyByPackageIndex -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtCallableDeclaration -import org.jetbrains.kotlin.psi.KtClassOrObject internal class KtFirStarImportingScope( firScope: FirAbstractStarImportingScope, @@ -37,7 +35,9 @@ internal class KtFirStarImportingScope( ) : KtStarImportingScope, ValidityTokenOwner { private val firScope: FirAbstractStarImportingScope by weakRef(firScope) override val isDefaultImportingScope: Boolean = withValidityAssertion { firScope is FirDefaultStarImportingScope } - private val packageHelper = PackageIndexHelper(project) + + //todo use more concrete scope + private val declarationProvider = project.createDeclarationProvider(GlobalSearchScope.allScope(project)) override val imports: List by cached { firScope.starImports.map { import -> @@ -64,7 +64,8 @@ internal class KtFirStarImportingScope( override fun getPossibleCallableNames(): Set = withValidityAssertion { imports.flatMapTo(hashSetOf()) { import: Import -> if (import.relativeClassName == null) { // top level callable - packageHelper.getPackageTopLevelCallables(import.packageFqName) + declarationProvider.getFunctionsNamesInPackage(import.packageFqName) + + declarationProvider.getPropertyNamesInPackage(import.packageFqName) } else { //member val classId = import.resolvedClassId ?: error("Class id should not be null as relativeClassName is not null") firScope.getStaticsScope(classId)?.getContainingCallableNamesIfPresent().orEmpty() @@ -75,7 +76,8 @@ internal class KtFirStarImportingScope( override fun getPossibleClassifierNames(): Set = withValidityAssertion { imports.flatMapTo(hashSetOf()) { import -> if (import.relativeClassName == null) { - packageHelper.getPackageTopLevelClassifiers(import.packageFqName) + declarationProvider.getClassNamesInPackage(import.packageFqName) + + declarationProvider.getTypeAliasNamesInPackage(import.packageFqName) } else { val classId = import.resolvedClassId ?: error("Class id should not be null as relativeClassName is not null") firScope.getStaticsScope(classId)?.getContainingClassifierNamesIfPresent().orEmpty() @@ -83,30 +85,4 @@ internal class KtFirStarImportingScope( } } -} - -private class PackageIndexHelper(private val project: Project) { - //todo use more concrete scope - private val searchScope = GlobalSearchScope.allScope(project) - - private val functionByPackageIndex = KotlinTopLevelFunctionByPackageIndex.getInstance() - private val propertyByPackageIndex = KotlinTopLevelPropertyByPackageIndex.getInstance() - - private val classByPackageIndex = KotlinTopLevelClassByPackageIndex.getInstance() - - fun getPackageTopLevelCallables(packageFqName: FqName): Set { - return getTopLevelCallables(packageFqName).mapTo(hashSetOf()) { it.nameAsSafeName } - } - - fun getPackageTopLevelClassifiers(packageFqName: FqName): Set { - return getTopLevelClassifiers(packageFqName).mapTo(hashSetOf()) { it.nameAsSafeName } - } - - private fun getTopLevelClassifiers(packageFqName: FqName): MutableCollection = - classByPackageIndex.get(packageFqName.asString(), project, searchScope) - - private fun getTopLevelCallables(packageFqName: FqName): Sequence = sequence { - yieldAll(functionByPackageIndex.get(packageFqName.asString(), project, searchScope)) - yieldAll(propertyByPackageIndex.get(packageFqName.asString(), project, searchScope)) - } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPackageSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPackageSymbol.kt index a87863d86a3..82c550791b4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPackageSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPackageSymbol.kt @@ -11,6 +11,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiManager import com.intellij.psi.impl.file.PsiPackageImpl import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.idea.fir.low.level.api.createPackageProvider import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession @@ -18,7 +19,6 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.symbolPointer -import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil import org.jetbrains.kotlin.name.FqName class KtFirPackageSymbol( @@ -47,5 +47,5 @@ class KtPackage( ) : PsiPackageImpl(manager, fqName.asString().replace('/', '.')) { override fun copy() = KtPackage(manager, fqName, scope) - override fun isValid(): Boolean = PackageIndexUtil.packageExists(fqName, scope, project) + override fun isValid(): Boolean = project.createPackageProvider(scope).isPackageExists(fqName) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt index 43031de61bd..8ac89461096 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol -import org.jetbrains.kotlin.idea.util.getElementTextInContext +import org.jetbrains.kotlin.idea.fir.low.level.api.util.getElementTextInContext import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.psi.KtDeclaration diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt index e9134a46501..06dc4ac4a07 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt @@ -10,10 +10,10 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementResolveResult import com.intellij.psi.ResolveResult import com.intellij.psi.impl.source.resolve.ResolveCache +import org.jetbrains.kotlin.idea.fir.low.level.api.util.getElementTextInContext import org.jetbrains.kotlin.idea.frontend.api.tokens.HackToForceAllowRunningAnalyzeOnEDT import org.jetbrains.kotlin.idea.frontend.api.analyse import org.jetbrains.kotlin.idea.frontend.api.fir.utils.runInPossiblyEdtThread -import org.jetbrains.kotlin.idea.util.getElementTextInContext object KtFirReferenceResolver : ResolveCache.PolyVariantResolver { class KotlinResolveResult(element: PsiElement) : PsiElementResolveResult(element) diff --git a/idea/resources-fir/META-INF/plugin.xml b/idea/resources-fir/META-INF/plugin.xml index d208b95b05f..c914b1fb2f5 100644 --- a/idea/resources-fir/META-INF/plugin.xml +++ b/idea/resources-fir/META-INF/plugin.xml @@ -119,6 +119,13 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu + + + + +