FIR IDE: move declaration/package providers to separate module

This commit is contained in:
Ilya Kirillov
2021-08-20 16:36:57 +03:00
parent a54b769ec4
commit abe2311372
36 changed files with 211 additions and 173 deletions
@@ -0,0 +1,20 @@
plugins {
kotlin("jvm")
id("jps-compatible")
}
dependencies {
implementation(project(":compiler:psi"))
implementation(project(":compiler:frontend.java"))
implementation(project(":core:compiler.common"))
implementation(intellijCoreDep()) { includeJars("intellij-core", rootProject = rootProject) }
}
sourceSets {
"main" { projectDefault() }
"test" { none() }
}
kotlin {
explicitApi()
}
@@ -0,0 +1,39 @@
/*
* Copyright 2010-2021 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.analysis.providers
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
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
public abstract class KotlinDeclarationProvider {
public abstract fun getClassesByClassId(classId: ClassId): Collection<KtClassOrObject>
public abstract fun getTypeAliasesByClassId(classId: ClassId): Collection<KtTypeAlias>
public abstract fun getClassNamesInPackage(packageFqName: FqName): Set<Name>
public abstract fun getTypeAliasNamesInPackage(packageFqName: FqName): Set<Name>
public abstract fun getTopLevelProperties(callableId: CallableId): Collection<KtProperty>
public abstract fun getTopLevelFunctions(callableId: CallableId): Collection<KtNamedFunction>
public abstract fun getPropertyNamesInPackage(packageFqName: FqName): Set<Name>
public abstract fun getFunctionsNamesInPackage(packageFqName: FqName): Set<Name>
public abstract fun getFacadeFilesInPackage(packageFqName: FqName): Collection<KtFile>
public abstract fun findFilesForFacade(facadeFqName: FqName): Collection<KtFile>
}
public abstract class KotlinDeclarationProviderFactory {
public abstract fun createDeclarationProvider(searchScope: GlobalSearchScope): KotlinDeclarationProvider
}
public fun Project.createDeclarationProvider(searchScope: GlobalSearchScope): KotlinDeclarationProvider =
ServiceManager.getService(this, KotlinDeclarationProviderFactory::class.java)
.createDeclarationProvider(searchScope)
@@ -0,0 +1,34 @@
/*
* Copyright 2010-2021 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.analysis.providers
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.ModificationTracker
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
public abstract class KotlinModificationTrackerFactory {
public abstract fun createProjectWideOutOfBlockModificationTracker(): ModificationTracker
public abstract fun createModuleWithoutDependenciesOutOfBlockModificationTracker(moduleInfo: ModuleSourceInfoBase): ModificationTracker
public abstract fun createLibrariesModificationTracker(): ModificationTracker
@TestOnly
public abstract fun incrementModificationsCount()
}
public fun Project.createProjectWideOutOfBlockModificationTracker(): ModificationTracker =
ServiceManager.getService(this, KotlinModificationTrackerFactory::class.java)
.createProjectWideOutOfBlockModificationTracker()
public fun Project.createLibrariesModificationTracker(): ModificationTracker =
ServiceManager.getService(this, KotlinModificationTrackerFactory::class.java)
.createLibrariesModificationTracker()
public fun ModuleSourceInfoBase.createModuleWithoutDependenciesOutOfBlockModificationTracker(project: Project): ModificationTracker =
ServiceManager.getService(project, KotlinModificationTrackerFactory::class.java)
.createModuleWithoutDependenciesOutOfBlockModificationTracker(this)
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2021 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.analysis.providers
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
public abstract class KotlinPackageProvider {
public abstract fun isPackageExists(packageFqName: FqName): Boolean
public abstract fun getKotlinSubPackageFqNames(packageFqName: FqName): Set<Name>
}
public abstract class KotlinPackageProviderFactory {
public abstract fun createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider
}
public fun Project.createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider =
ServiceManager.getService(this, KotlinPackageProviderFactory::class.java)
.createPackageProvider(searchScope)
@@ -3,15 +3,15 @@
* 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.test.base
package org.jetbrains.kotlin.analysis.providers.impl
import com.intellij.openapi.util.ModificationTracker
import com.intellij.openapi.util.SimpleModificationTracker
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
import org.jetbrains.kotlin.idea.fir.low.level.api.api.KotlinOutOfBlockModificationTrackerFactory
internal class KotlinOutOfBlockModificationTrackerFactoryTestImpl : KotlinOutOfBlockModificationTrackerFactory() {
public class KotlinStaticModificationTrackerFactory : KotlinModificationTrackerFactory() {
private val projectWide = SimpleModificationTracker()
private val library = SimpleModificationTracker()
private val forModule = mutableMapOf<ModuleSourceInfoBase, SimpleModificationTracker>()
@@ -25,7 +25,7 @@ internal class KotlinOutOfBlockModificationTrackerFactoryTestImpl : KotlinOutOfB
return forModule.getOrPut(moduleInfo) { SimpleModificationTracker() }
}
override fun createLibraryOutOfBlockModificationTracker(): ModificationTracker {
override fun createLibrariesModificationTracker(): ModificationTracker {
return library
}
@@ -3,26 +3,24 @@
* 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.test.base
package org.jetbrains.kotlin.analysis.providers.impl
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProviderFactory
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.fir.low.level.api.DeclarationProvider
import org.jetbrains.kotlin.name.CallableId
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.collectDescendantsOfType
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
internal class DeclarationProviderTestImpl(
override val searchScope: GlobalSearchScope,
public class KotlinStaticDeclarationProvider(
scope: GlobalSearchScope,
ktFiles: Collection<KtFile>
) : DeclarationProvider() {
private val filesInScope = ktFiles.filter { searchScope.contains(it.virtualFile) }
) : KotlinDeclarationProvider() {
private val filesInScope = ktFiles.filter { scope.contains(it.virtualFile) }
private fun filesByPackage(packageFqName: FqName) =
filesInScope.asSequence()
@@ -91,4 +89,10 @@ internal class DeclarationProviderTestImpl(
.flatMap { it.declarations }
.filterIsInstance<KtClassOrObject>()
.mapNotNullTo(mutableSetOf()) { it.nameAsName }
}
public class KotlinStaticDeclarationProviderFactory(private val files: Collection<KtFile>) : KotlinDeclarationProviderFactory() {
override fun createDeclarationProvider(searchScope: GlobalSearchScope): KotlinDeclarationProvider {
return KotlinStaticDeclarationProvider(searchScope, files)
}
}
@@ -3,19 +3,19 @@
* 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.test.base
package org.jetbrains.kotlin.analysis.providers.impl
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.idea.fir.low.level.api.KtPackageProvider
import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider
import org.jetbrains.kotlin.analysis.providers.KotlinPackageProviderFactory
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
internal class KtPackageProviderTestImpl(
public class KotlinStaticPackageProvider(
scope: GlobalSearchScope,
files: Collection<KtFile>
) : KtPackageProvider() {
) : KotlinPackageProvider() {
private val packageToSubPackageNames: Map<FqName, Set<Name>> = run {
val filesInScope = files.filter { scope.contains(it.virtualFile) }
val packages = mutableMapOf<FqName, MutableSet<Name>>()
@@ -37,4 +37,10 @@ internal class KtPackageProviderTestImpl(
override fun getKotlinSubPackageFqNames(packageFqName: FqName): Set<Name> {
return packageToSubPackageNames[packageFqName] ?: emptySet()
}
}
public class KotlinStaticPackageProviderFactory(private val files: Collection<KtFile>) : KotlinPackageProviderFactory() {
override fun createPackageProvider(searchScope: GlobalSearchScope): KotlinPackageProvider {
return KotlinStaticPackageProvider(searchScope, files)
}
}
+1
View File
@@ -298,6 +298,7 @@ extra["compilerArtifactsForIde"] = listOf(
":prepare:ide-plugin-dependencies:high-level-api-for-ide",
":prepare:ide-plugin-dependencies:high-level-api-fir-for-ide",
":prepare:ide-plugin-dependencies:high-level-api-fir-tests-for-ide",
":prepare:ide-plugin-dependencies:analysis-api-providers-for-ide",
":kotlin-script-runtime",
":kotlin-script-util",
":kotlin-scripting-common",
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.resolve.AbstractInnerDeclarat
import org.jetbrains.kotlin.spec.utils.GeneralConfiguration
import org.jetbrains.kotlin.spec.utils.tasks.detectDirsWithTestsMapFileOnly
import org.jetbrains.kotlin.test.generators.generateTestGroupSuiteWithJUnit5
import org.jetbrains.kotlin.test.runners.AbstractFirDiagnosticTestSpec
fun main(args: Array<String>) {
System.setProperty("java.awt.headless", "true")
@@ -159,5 +160,14 @@ fun main(args: Array<String>) {
)
}
}
testGroup(testsRoot = "compiler/fir/analysis-tests/tests-gen", testDataRoot = GeneralConfiguration.SPEC_TESTDATA_PATH) {
testClass<AbstractFirDiagnosticTestSpec> {
model(
"diagnostics",
excludeDirs = listOf("helpers") + detectDirsWithTestsMapFileOnly("diagnostics"),
excludedPattern = excludedFirTestdataPattern
)
}
}
}
}
+1
View File
@@ -15,6 +15,7 @@ dependencies {
compileOnly(project(":core:compiler.common"))
compileOnly(project(":core:compiler.common.jvm"))
compileOnly(project(":idea-frontend-fir:idea-fir-low-level-api"))
implementation(project(":analysis:analysis-api-providers"))
compile(intellijCoreDep()) { includeJars("intellij-core", "guava", rootProject = rootProject) }
}
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.idea.frontend.api.tokens
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.idea.fir.low.level.api.api.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import kotlin.reflect.KClass
public class AlwaysAccessibleValidityToken(project: Project) : ValidityToken() {
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.idea.frontend.api.tokens
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.idea.fir.low.level.api.api.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.idea.frontend.api.*
import kotlin.reflect.KClass
+1
View File
@@ -17,6 +17,7 @@ dependencies {
compile(project(":idea-frontend-api"))
compile(project(":compiler:light-classes"))
compile(intellijCoreDep())
implementation(project(":analysis:analysis-api-providers"))
testCompile(projectTests(":idea-frontend-fir:idea-fir-low-level-api"))
testCompile(projectTests(":compiler:tests-common"))
@@ -17,7 +17,7 @@ dependencies {
testCompile(project(":idea-frontend-fir"))
implementation(project(":compiler:ir.psi2ir"))
implementation(project(":compiler:fir:entrypoint"))
implementation(project(":analysis:analysis-api-providers"))
compile(intellijCoreDep()) { includeJars("intellij-core", "guava", rootProject = rootProject) }
@@ -1,43 +0,0 @@
/*
* Copyright 2010-2021 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.analyzer.ModuleInfo
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
abstract class DeclarationProvider {
abstract val searchScope: GlobalSearchScope
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 fun getFacadeFilesInPackage(packageFqName: FqName): Collection<KtFile>
abstract fun findFilesForFacade(facadeFqName: FqName): Collection<KtFile>
}
abstract class KtDeclarationProviderFactory {
abstract fun createDeclarationProvider(searchScope: GlobalSearchScope): DeclarationProvider
}
fun Project.createDeclarationProvider(searchScope: GlobalSearchScope): DeclarationProvider =
ServiceManager.getService(this, KtDeclarationProviderFactory::class.java)
.createDeclarationProvider(searchScope)
@@ -9,10 +9,10 @@ import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootModificationTracker
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.api.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarationResolver
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionProviderStorage
@@ -1,28 +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 com.intellij.openapi.components.ServiceManager
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.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 getKotlinSubPackageFqNames(packageFqName: FqName): 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)
@@ -16,8 +16,6 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider
import org.jetbrains.kotlin.fir.java.FirJavaElementFinder
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.sessions.FirIdeSourcesSession
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.psi.KtElement
@@ -1,35 +0,0 @@
/*
* Copyright 2010-2021 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.api
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.ModificationTracker
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
abstract class KotlinOutOfBlockModificationTrackerFactory {
abstract fun createProjectWideOutOfBlockModificationTracker(): ModificationTracker
abstract fun createModuleWithoutDependenciesOutOfBlockModificationTracker(moduleInfo: ModuleSourceInfoBase): ModificationTracker
abstract fun createLibraryOutOfBlockModificationTracker(): ModificationTracker
@TestOnly
abstract fun incrementModificationsCount()
}
fun Project.createProjectWideOutOfBlockModificationTracker() =
ServiceManager.getService(this, KotlinOutOfBlockModificationTrackerFactory::class.java).createProjectWideOutOfBlockModificationTracker()
fun Project.createLibraryOutOfBlockModificationTracker() =
ServiceManager.getService(this, KotlinOutOfBlockModificationTrackerFactory::class.java).createLibraryOutOfBlockModificationTracker()
fun ModuleSourceInfoBase.createModuleWithoutDependenciesOutOfBlockModificationTracker(project: Project) =
ServiceManager.getService(project, KotlinOutOfBlockModificationTrackerFactory::class.java)
.createModuleWithoutDependenciesOutOfBlockModificationTracker(this)
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.providers
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.NoMutableState
@@ -19,8 +21,6 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
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.file.builder.FirFileBuilder
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
import org.jetbrains.kotlin.name.ClassId
@@ -35,8 +35,8 @@ internal class FirIdeProvider(
val kotlinScopeProvider: FirKotlinScopeProvider,
firFileBuilder: FirFileBuilder,
val cache: ModuleFileCache,
private val declarationProvider: DeclarationProvider,
packageExistenceChecker: KtPackageProvider,
private val declarationProvider: KotlinDeclarationProvider,
packageProvider: KotlinPackageProvider,
) : FirProvider() {
override val symbolProvider: FirSymbolProvider = SymbolProvider()
@@ -44,7 +44,7 @@ internal class FirIdeProvider(
cache,
firFileBuilder,
declarationProvider,
packageExistenceChecker,
packageProvider,
)
override val isPhasedFirAllowed: Boolean get() = true
@@ -6,14 +6,14 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.providers
import com.google.common.collect.Sets
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
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.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
@@ -28,8 +28,8 @@ import java.util.*
internal class FirProviderHelper(
private val cache: ModuleFileCache,
private val firFileBuilder: FirFileBuilder,
private val declarationProvider: DeclarationProvider,
private val packageProvider: KtPackageProvider,
private val declarationProvider: KotlinDeclarationProvider,
private val packageProvider: KotlinPackageProvider,
) {
fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration? {
if (classId.isLocal) return null
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.createPackageProvider
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
@@ -10,6 +10,8 @@ import com.intellij.openapi.project.Project
import kotlinx.collections.immutable.PersistentMap
import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toPersistentMap
import org.jetbrains.kotlin.analysis.providers.createLibrariesModificationTracker
import org.jetbrains.kotlin.analysis.providers.createModuleWithoutDependenciesOutOfBlockModificationTracker
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
import org.jetbrains.kotlin.fir.BuiltinTypes
@@ -18,8 +20,6 @@ import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.session.FirModuleInfoBasedModuleData
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveStateConfigurator
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
import org.jetbrains.kotlin.idea.fir.low.level.api.api.createLibraryOutOfBlockModificationTracker
import org.jetbrains.kotlin.idea.fir.low.level.api.api.createModuleWithoutDependenciesOutOfBlockModificationTracker
import org.jetbrains.kotlin.idea.fir.low.level.api.util.addValueFor
import org.jetbrains.kotlin.idea.fir.low.level.api.util.*
import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE
@@ -29,7 +29,7 @@ class FirIdeSessionProviderStorage(val project: Project) {
private val sessionsCache = ConcurrentHashMap<ModuleSourceInfoBase, FromModuleViewSessionCache>()
private val configurator = ServiceManager.getService(project, FirModuleResolveStateConfigurator::class.java)
private val librariesCache by cachedValue(project, project.createLibraryOutOfBlockModificationTracker()) { LibrariesCache() }
private val librariesCache by cachedValue(project, project.createLibrariesModificationTracker()) { LibrariesCache() }
fun getSessionProvider(
rootModule: ModuleSourceInfoBase,
@@ -12,6 +12,12 @@ import com.intellij.openapi.util.Disposer
import com.intellij.psi.PsiElementFinder
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.ProjectScope
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProviderFactory
import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory
import org.jetbrains.kotlin.analysis.providers.KotlinPackageProviderFactory
import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticDeclarationProviderFactory
import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticModificationTrackerFactory
import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticPackageProviderFactory
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
@@ -29,9 +35,6 @@ import org.jetbrains.kotlin.fir.session.FirModuleInfoBasedModuleData
import org.jetbrains.kotlin.idea.asJava.IDEKotlinAsJavaFirSupport
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.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.KtPackageProviderTestImpl
import org.jetbrains.kotlin.idea.fir.low.level.api.test.base.SealedClassInheritorsProviderTestImpl
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE
import org.jetbrains.kotlin.idea.frontend.api.InvalidWayOfUsingAnalysisSession
@@ -298,19 +301,11 @@ fun MockProject.registerTestServices(
)
registerService(FirIdeResolveStateService::class.java)
registerService(
KotlinOutOfBlockModificationTrackerFactory::class.java,
KotlinOutOfBlockModificationTrackerFactoryTestImpl::class.java
KotlinModificationTrackerFactory::class.java,
KotlinStaticModificationTrackerFactory::class.java
)
registerService(KtDeclarationProviderFactory::class.java, object : KtDeclarationProviderFactory() {
override fun createDeclarationProvider(searchScope: GlobalSearchScope): DeclarationProvider {
return DeclarationProviderTestImpl(searchScope, allKtFiles.filter { searchScope.contains(it.virtualFile) })
}
})
registerService(KtPackageProviderFactory::class.java, object : KtPackageProviderFactory() {
override fun createPackageProvider(searchScope: GlobalSearchScope): KtPackageProvider {
return KtPackageProviderTestImpl(searchScope, allKtFiles.filter { searchScope.contains(it.virtualFile) })
}
})
registerService(KotlinDeclarationProviderFactory::class.java, KotlinStaticDeclarationProviderFactory(allKtFiles))
registerService(KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(allKtFiles))
reRegisterJavaElementFinder(this)
}
@@ -20,8 +20,6 @@ import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.asJava.classes.getOrCreateFirLightClass
import org.jetbrains.kotlin.idea.asJava.classes.getOrCreateFirLightFacade
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getModuleInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.createDeclarationProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.createPackageProvider
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.parentOrNull
@@ -29,6 +27,8 @@ import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtScript
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.createPackageProvider
class IDEKotlinAsJavaFirSupport(private val project: Project) : KotlinAsJavaSupport() {
@@ -32,13 +32,13 @@ import com.intellij.psi.scope.PsiScopeProcessor
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.PsiUtil
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.asJava.classes.KotlinClassInnerStuffCache
import org.jetbrains.kotlin.asJava.classes.KotlinClassInnerStuffCache.Companion.processDeclarationsInEnum
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.fir.low.level.api.api.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.idea.frontend.api.tokens.HackToForceAllowRunningAnalyzeOnEDT
import org.jetbrains.kotlin.idea.frontend.api.tokens.hackyAllowRunningOnEdt
import javax.swing.Icon
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiManager
import com.intellij.psi.PsiReferenceList
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.asJava.classes.*
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
@@ -16,7 +17,6 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.idea.asJava.*
import org.jetbrains.kotlin.idea.fir.low.level.api.api.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.idea.frontend.api.tokens.HackToForceAllowRunningAnalyzeOnEDT
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.tokens.hackyAllowRunningOnEdt
@@ -8,10 +8,10 @@ package org.jetbrains.kotlin.idea.fir
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
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.name.ClassId
import org.jetbrains.kotlin.name.FqName
@@ -11,8 +11,8 @@ import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.psi.util.PsiModificationTracker
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.api.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
import org.jetbrains.kotlin.idea.frontend.api.*
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir
import com.intellij.openapi.project.Project
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.providers.createPackageProvider
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
@@ -25,7 +26,6 @@ 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.KtStarProjectionTypeArgument
import org.jetbrains.kotlin.idea.frontend.api.KtTypeArgument
import org.jetbrains.kotlin.idea.frontend.api.KtTypeArgumentWithVariance
@@ -114,7 +114,7 @@ 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
private val packageProvider = project.createPackageProvider(GlobalSearchScope.allScope(project))//todo scope
fun createPackageSymbolIfOneExists(packageFqName: FqName): KtFirPackageSymbol? {
val exists =
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes
import com.intellij.openapi.project.Project
import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.createPackageProvider
import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope
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
@@ -7,11 +7,11 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
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.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -11,7 +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.analysis.providers.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
@@ -6,9 +6,9 @@
package org.jetbrains.kotlin.idea.fir.frontend.api.symbols
import com.intellij.openapi.components.ServiceManager
import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory
import org.jetbrains.kotlin.idea.fir.analyseOnPooledThreadInReadAction
import org.jetbrains.kotlin.idea.fir.frontend.api.test.framework.AbstractHLApiSingleFileTest
import org.jetbrains.kotlin.idea.fir.low.level.api.api.KotlinOutOfBlockModificationTrackerFactory
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.symbols.DebugSymbolRenderer
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
@@ -77,7 +77,7 @@ abstract class AbstractSymbolTest : AbstractHLApiSingleFileTest() {
}
private fun doOutOfBlockModification(ktFile: KtFile) {
ServiceManager.getService(ktFile.project, KotlinOutOfBlockModificationTrackerFactory::class.java)
ServiceManager.getService(ktFile.project, KotlinModificationTrackerFactory::class.java)
.incrementModificationsCount()
}
}
@@ -0,0 +1,5 @@
plugins {
kotlin("jvm")
}
publishJarsForIde(listOf(":analysis:analysis-api-providers"))
+5 -2
View File
@@ -326,7 +326,8 @@ if (!buildProperties.inJpsBuildIdeaSync) {
":prepare:ide-plugin-dependencies:low-level-api-fir-for-ide",
":prepare:ide-plugin-dependencies:high-level-api-for-ide",
":prepare:ide-plugin-dependencies:high-level-api-fir-for-ide",
":prepare:ide-plugin-dependencies:high-level-api-fir-tests-for-ide"
":prepare:ide-plugin-dependencies:high-level-api-fir-tests-for-ide",
":prepare:ide-plugin-dependencies:analysis-api-providers-for-ide"
}
void intellij(String imlPath) {
@@ -367,6 +368,7 @@ if (attachedIntellijVersion == "212") { // Latest available platform in scope of
intellij "j2k/new/tests/kotlin.j2k.new.tests.iml"
intellij "j2k/new/kotlin.j2k.new.iml"
intellij "fir-low-level-api-ide-impl/kotlin.fir.fir-low-level-api-ide-impl.iml"
intellij "analysis-api-providers-ide-impl/kotlin.fir.analysis-api-providers-ide-impl.iml"
intellij "native/kotlin.native.iml"
intellij "performance-tests/kotlin.performance-tests.iml"
intellij "injection/kotlin.injection.iml"
@@ -439,7 +441,8 @@ include ":generators:frontend-api-generator",
":idea-frontend-fir:idea-fir-low-level-api",
":idea-frontend-fir:idea-frontend-fir-generator",
":idea-frontend-fir",
":idea-frontend-api"
":idea-frontend-api",
":analysis:analysis-api-providers"
if (buildProperties.inJpsBuildIdeaSync) {
include ":kotlin-stdlib:jps-build"