FIR IDE: remove dependency to IDEA from low-level-api fir impl module

This commit is contained in:
Ilya Kirillov
2021-06-19 22:01:29 +02:00
parent 0c5883cbe0
commit 606c3c136c
39 changed files with 246 additions and 210 deletions
@@ -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"))
+3 -7
View File
@@ -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())
// <temp>
compile(project(":idea:idea-core"))
// </temp>
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 {
@@ -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 <INDEX_KEY : Any, reified PSI : PsiElement> 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<KtClassOrObject> {
return listOfNotNull(getClassByClassId(classId))//todo
}
override fun getTypeAliasesByClassId(classId: ClassId): Collection<KtTypeAlias> {
return listOfNotNull(getTypeAliasByClassId(classId))//todo
}
override fun getTypeAliasNamesInPackage(packageFqName: FqName): Set<Name> {
return KotlinTopLevelTypeAliasByPackageIndex
.getInstance()[packageFqName.asStringForIndexes(), project, searchScope]
.mapNotNullTo(mutableSetOf()) { it.nameAsName }
}
override fun getPropertyNamesInPackage(packageFqName: FqName): Set<Name> {
return KotlinTopLevelPropertyByPackageIndex
.getInstance()[packageFqName.asStringForIndexes(), project, searchScope]
.mapNotNullTo(mutableSetOf()) { it.nameAsName }
}
override fun getFunctionsNamesInPackage(packageFqName: FqName): Set<Name> {
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<String, KtTypeAlias>(
private fun getTypeAliasByClassId(classId: ClassId): KtTypeAlias? = firstMatchingOrNull<String, KtTypeAlias>(
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<KtProperty> =
KotlinTopLevelPropertyFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, scope]
KotlinTopLevelPropertyFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, searchScope]
override fun getTopLevelFunctions(callableId: CallableId): Collection<KtNamedFunction> =
KotlinTopLevelFunctionFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, scope]
KotlinTopLevelFunctionFqnNameIndex.getInstance()[callableId.asStringForIndexes(), project, searchScope]
override fun getClassNamesInPackage(packageFqName: FqName): Set<Name> =
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)
}
}
@@ -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)
@@ -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<Name> {
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)
}
}
@@ -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<IdePackageOracleFactory>().createOracle(module)
override fun isPackageExists(packageFqName: FqName): Boolean = oracle.packageExists(packageFqName)
}
@@ -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<KtProperty>
abstract fun getTopLevelFunctions(callableId: CallableId): Collection<KtNamedFunction>
abstract fun getClassesByClassId(classId: ClassId): Collection<KtClassOrObject>
abstract fun getTypeAliasesByClassId(classId: ClassId): Collection<KtTypeAlias>
abstract fun getClassNamesInPackage(packageFqName: FqName): Set<Name>
}
abstract fun getTypeAliasNamesInPackage(packageFqName: FqName): Set<Name>
abstract fun getTopLevelProperties(callableId: CallableId): Collection<KtProperty>
abstract fun getTopLevelFunctions(callableId: CallableId): Collection<KtNamedFunction>
abstract fun getPropertyNamesInPackage(packageFqName: FqName): Set<Name>
abstract fun getFunctionsNamesInPackage(packageFqName: FqName): Set<Name>
}
abstract class KtDeclarationProviderFactory {
abstract fun createDeclarationProvider(searchScope: GlobalSearchScope): DeclarationProvider
}
fun Project.createDeclarationProvider(searchScope: GlobalSearchScope): DeclarationProvider =
ServiceManager.getService(this, KtDeclarationProviderFactory::class.java)
.createDeclarationProvider(searchScope)
@@ -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<Name>
}
abstract class KtPackageProviderFactory {
abstract fun createPackageProvider(searchScope: GlobalSearchScope): KtPackageProvider
}
fun Project.createPackageProvider(searchScope: GlobalSearchScope): KtPackageProvider =
ServiceManager.getService(this, KtPackageProviderFactory::class.java)
.createPackageProvider(searchScope)
@@ -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
}
@@ -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
@@ -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,
@@ -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)
}
@@ -97,7 +97,8 @@ internal object FirIdeSessionFactory {
scopeProvider,
firFileBuilder,
cache,
configurator.createDeclarationProvider(searchScope),
project.createDeclarationProvider(searchScope),
project.createPackageProvider(searchScope),
)
register(FirProvider::class, provider)
@@ -126,7 +126,7 @@ internal inline fun <T> cachedValue(project: Project, vararg dependencies: Any,
internal fun <T> psiModificationTrackerBasedCachedValue(project: Project, createValue: () -> T) =
cachedValue(project, PsiModificationTracker.MODIFICATION_COUNT, createValue = createValue)
internal fun KtElement.getElementTextInContext(): String {
fun KtElement.getElementTextInContext(): String {
val context = parentOfType<KtImportDirective>()
?: parentOfType<KtPackageDirective>()
?: containingDeclarationForPseudocode
@@ -148,13 +148,13 @@ internal fun KtElement.getElementTextInContext(): String {
private const val ELEMENT_TAG = "ELEMENT"
internal inline fun <reified T : PsiElement> PsiElement.parentOfType(withSelf: Boolean = false): T? {
inline fun <reified T : PsiElement> PsiElement.parentOfType(withSelf: Boolean = false): T? {
return PsiTreeUtil.getParentOfType(this, T::class.java, !withSelf)
}
internal fun <T : PsiElement> PsiElement.parentsOfType(clazz: Class<out T>, withSelf: Boolean = true): Sequence<T> {
fun <T : PsiElement> PsiElement.parentsOfType(clazz: Class<out T>, withSelf: Boolean = true): Sequence<T> {
return (if (withSelf) parentsWithSelf else parents).filterIsInstance(clazz)
}
internal inline fun <reified T : PsiElement> PsiElement.parentsOfType(withSelf: Boolean = true): Sequence<T> =
inline fun <reified T : PsiElement> PsiElement.parentsOfType(withSelf: Boolean = true): Sequence<T> =
parentsOfType(T::class.java, withSelf)
@@ -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)
}
})
}
@@ -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<KtFile>
) : DeclarationProvider() {
@@ -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<KtFile>
) : 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<Name> {
TODO("Not yet implemented")
}
}
@@ -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
@@ -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(
@@ -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 <E> allowLightClassesOnEdt(action: () -> E): E = hackyAllowRunningOnEdt(action)
internal inline fun <E> allowLightClassesOnEdt(action: () -> E): E = hackyAllowRunningOnEdt(action)
internal inline fun <T> Boolean.ifTrue(body: () -> T?): T? = if (this) body() else null
internal inline fun <T> Boolean.ifFalse(body: () -> T?): T? = if (!this) body() else null
@@ -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
@@ -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)
}
}
@@ -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.*
@@ -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,
@@ -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"))
}
}
@@ -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
@@ -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
@@ -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
@@ -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()
}
}
// }
}
}
@@ -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.*
@@ -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
@@ -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
@@ -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
@@ -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<Name>().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<Name> = withValidityAssertion {
hashSetOf<Name>().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<KtPackageSymbol> = 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()
}
}
@@ -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<StarImport> by cached {
firScope.starImports.map { import ->
@@ -64,7 +64,8 @@ internal class KtFirStarImportingScope(
override fun getPossibleCallableNames(): Set<Name> = 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<Name> = 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<Name> {
return getTopLevelCallables(packageFqName).mapTo(hashSetOf()) { it.nameAsSafeName }
}
fun getPackageTopLevelClassifiers(packageFqName: FqName): Set<Name> {
return getTopLevelClassifiers(packageFqName).mapTo(hashSetOf()) { it.nameAsSafeName }
}
private fun getTopLevelClassifiers(packageFqName: FqName): MutableCollection<KtClassOrObject> =
classByPackageIndex.get(packageFqName.asString(), project, searchScope)
private fun getTopLevelCallables(packageFqName: FqName): Sequence<KtCallableDeclaration> = sequence<KtCallableDeclaration> {
yieldAll(functionByPackageIndex.get(packageFqName.asString(), project, searchScope))
yieldAll(propertyByPackageIndex.get(packageFqName.asString(), project, searchScope))
}
}
@@ -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)
}
@@ -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
@@ -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<KtReference> {
class KotlinResolveResult(element: PsiElement) : PsiElementResolveResult(element)
+7
View File
@@ -119,6 +119,13 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu
<postStartupActivity implementation="org.jetbrains.kotlin.idea.fir.AndroidPluginIncompatibilityCheckerStartupActivity"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.fir.low.level.api.KtDeclarationProviderFactory"
serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.ide.KtDeclarationProviderFactoryIdeImpl"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.fir.low.level.api.KtPackageProviderFactory"
serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.ide.KtPackageProviderFactoryIdeImpl"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveStateConfigurator"
serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.ide.FirModuleResolveStateConfiguratorIdeImpl"/>