LL API: simplify FirModuleResolveState interface
This commit is contained in:
+5
-4
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.FirLazyDeclarationResolver
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.FirLazyDeclarationResolver
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.FirIdeSession
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.FirIdeSession
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.FirIdeSessionProviderStorage
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.FirIdeSessionProviderStorage
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.FirSourceModuleResolveState
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
||||||
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
|
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
|
||||||
@@ -26,10 +27,10 @@ internal class FirIdeResolveStateService(project: Project) {
|
|||||||
project.createProjectWideOutOfBlockModificationTracker(),
|
project.createProjectWideOutOfBlockModificationTracker(),
|
||||||
ProjectRootModificationTracker.getInstance(project),
|
ProjectRootModificationTracker.getInstance(project),
|
||||||
) {
|
) {
|
||||||
ConcurrentHashMap<KtModule, FirModuleResolveStateImpl>()
|
ConcurrentHashMap<KtModule, FirSourceModuleResolveState>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getResolveState(module: KtModule): FirModuleResolveStateImpl =
|
fun getResolveState(module: KtModule): FirSourceModuleResolveState =
|
||||||
stateCache.computeIfAbsent(module) { createResolveStateFor(module, sessionProviderStorage) }
|
stateCache.computeIfAbsent(module) { createResolveStateFor(module, sessionProviderStorage) }
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@@ -40,13 +41,13 @@ internal class FirIdeResolveStateService(project: Project) {
|
|||||||
module: KtModule,
|
module: KtModule,
|
||||||
sessionProviderStorage: FirIdeSessionProviderStorage,
|
sessionProviderStorage: FirIdeSessionProviderStorage,
|
||||||
configureSession: (FirIdeSession.() -> Unit)? = null,
|
configureSession: (FirIdeSession.() -> Unit)? = null,
|
||||||
): FirModuleResolveStateImpl {
|
): FirSourceModuleResolveState {
|
||||||
if (module !is KtSourceModule) {
|
if (module !is KtSourceModule) {
|
||||||
error("Creating FirModuleResolveState is not yet supported for $module")
|
error("Creating FirModuleResolveState is not yet supported for $module")
|
||||||
}
|
}
|
||||||
val sessionProvider = sessionProviderStorage.getSessionProvider(module, configureSession)
|
val sessionProvider = sessionProviderStorage.getSessionProvider(module, configureSession)
|
||||||
val firFileBuilder = sessionProvider.rootModuleSession.firFileBuilder
|
val firFileBuilder = sessionProvider.rootModuleSession.firFileBuilder
|
||||||
return FirModuleResolveStateImpl(
|
return FirSourceModuleResolveState(
|
||||||
sessionProviderStorage.project,
|
sessionProviderStorage.project,
|
||||||
module,
|
module,
|
||||||
sessionProvider,
|
sessionProvider,
|
||||||
|
|||||||
+4
-11
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.ModuleFileCache
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.ModuleFileCache
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.KtToFirMapping
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.KtToFirMapping
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.FirSourceModuleResolveState
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.containingKtFileIfAny
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.containingKtFileIfAny
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalKtFile
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalKtFile
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
@@ -27,7 +28,7 @@ import org.jetbrains.kotlin.psi.KtFile
|
|||||||
import org.jetbrains.kotlin.psi.KtLambdaExpression
|
import org.jetbrains.kotlin.psi.KtLambdaExpression
|
||||||
|
|
||||||
internal class FirModuleResolveStateDepended(
|
internal class FirModuleResolveStateDepended(
|
||||||
val originalState: FirModuleResolveStateImpl,
|
val originalState: FirSourceModuleResolveState,
|
||||||
val towerProviderBuiltUponElement: FirTowerContextProvider,
|
val towerProviderBuiltUponElement: FirTowerContextProvider,
|
||||||
private val ktToFirMapping: KtToFirMapping?,
|
private val ktToFirMapping: KtToFirMapping?,
|
||||||
) : FirModuleResolveState() {
|
) : FirModuleResolveState() {
|
||||||
@@ -78,15 +79,7 @@ internal class FirModuleResolveStateDepended(
|
|||||||
override fun collectDiagnosticsForFile(ktFile: KtFile, filter: DiagnosticCheckerFilter): Collection<KtPsiDiagnostic> =
|
override fun collectDiagnosticsForFile(ktFile: KtFile, filter: DiagnosticCheckerFilter): Collection<KtPsiDiagnostic> =
|
||||||
TODO("Diagnostics are not implemented for depended state")
|
TODO("Diagnostics are not implemented for depended state")
|
||||||
|
|
||||||
override fun findSourceFirSymbol(ktDeclaration: KtDeclaration): FirBasedSymbol<*> {
|
override fun resolveToFirSymbol(ktDeclaration: KtDeclaration, phase: FirResolvePhase): FirBasedSymbol<*> {
|
||||||
return originalState.findSourceFirSymbol(ktDeclaration)
|
return originalState.resolveToFirSymbol(ktDeclaration, phase)
|
||||||
}
|
|
||||||
|
|
||||||
override fun findSourceFirSymbol(ktDeclaration: KtLambdaExpression): FirBasedSymbol<*> {
|
|
||||||
return originalState.findSourceFirSymbol(ktDeclaration)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun findSourceFirCompiledSymbol(ktDeclaration: KtDeclaration): FirBasedSymbol<*> {
|
|
||||||
return originalState.findSourceFirCompiledSymbol(ktDeclaration)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-31
@@ -53,37 +53,7 @@ abstract class FirModuleResolveState {
|
|||||||
|
|
||||||
internal abstract fun collectDiagnosticsForFile(ktFile: KtFile, filter: DiagnosticCheckerFilter): Collection<KtPsiDiagnostic>
|
internal abstract fun collectDiagnosticsForFile(ktFile: KtFile, filter: DiagnosticCheckerFilter): Collection<KtPsiDiagnostic>
|
||||||
|
|
||||||
abstract fun findSourceFirSymbol(
|
abstract fun resolveToFirSymbol(ktDeclaration: KtDeclaration, phase: FirResolvePhase): FirBasedSymbol<*>
|
||||||
ktDeclaration: KtDeclaration,
|
|
||||||
): FirBasedSymbol<*>
|
|
||||||
|
|
||||||
abstract fun findSourceFirSymbol(
|
|
||||||
ktDeclaration: KtLambdaExpression,
|
|
||||||
): FirBasedSymbol<*>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Looks for compiled non-local [ktDeclaration] declaration by querying its classId/callableId from the SymbolProvider.
|
|
||||||
*
|
|
||||||
* Works only if [ktDeclaration] is compiled (i.e. comes from .class file).
|
|
||||||
*/
|
|
||||||
abstract fun findSourceFirCompiledSymbol(
|
|
||||||
ktDeclaration: KtDeclaration
|
|
||||||
): FirBasedSymbol<*>
|
|
||||||
|
|
||||||
|
|
||||||
open fun resolveToFirSymbol(
|
|
||||||
ktDeclaration: KtDeclaration,
|
|
||||||
resolveState: FirModuleResolveState,
|
|
||||||
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
|
|
||||||
): FirBasedSymbol<*> {
|
|
||||||
return when (val module = ktDeclaration.getKtModule()) {
|
|
||||||
is KtSourceModule -> resolveState.findSourceFirSymbol(ktDeclaration).also { resolveState.resolveFirToPhase(it.fir, phase) }
|
|
||||||
is KtLibraryModule -> resolveState.findSourceFirCompiledSymbol(ktDeclaration)
|
|
||||||
else -> error("unsupported module $module")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal abstract fun resolveFirToPhase(declaration: FirDeclaration, toPhase: FirResolvePhase)
|
internal abstract fun resolveFirToPhase(declaration: FirDeclaration, toPhase: FirResolvePhase)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ fun KtDeclaration.resolveToFirSymbol(
|
|||||||
resolveState: FirModuleResolveState,
|
resolveState: FirModuleResolveState,
|
||||||
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
|
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
|
||||||
): FirBasedSymbol<*> {
|
): FirBasedSymbol<*> {
|
||||||
return resolveState.resolveToFirSymbol(this, resolveState, phase)
|
return resolveState.resolveToFirSymbol(this, phase)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+7
-7
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.analysis.api.impl.barebone.parentOfType
|
|||||||
import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType
|
import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.DeclarationCopyBuilder.withBodyFrom
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.DeclarationCopyBuilder.withBodyFrom
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.FirModuleResolveStateDepended
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.FirModuleResolveStateDepended
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.FirModuleResolveStateImpl
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.FirSourceModuleResolveState
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FileTowerProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FileTowerProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerDataContextAllElementsCollector
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerDataContextAllElementsCollector
|
||||||
@@ -67,7 +67,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
place: T,
|
place: T,
|
||||||
elementToResolve: T,
|
elementToResolve: T,
|
||||||
): FirElement {
|
): FirElement {
|
||||||
require(state is FirModuleResolveStateImpl)
|
require(state is FirSourceModuleResolveState)
|
||||||
require(place.isPhysical)
|
require(place.isPhysical)
|
||||||
|
|
||||||
val declaration = runBodyResolveOnAir(
|
val declaration = runBodyResolveOnAir(
|
||||||
@@ -95,7 +95,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
state: FirModuleResolveState,
|
state: FirModuleResolveState,
|
||||||
place: KtElement,
|
place: KtElement,
|
||||||
): FirTowerContextProvider {
|
): FirTowerContextProvider {
|
||||||
require(state is FirModuleResolveStateImpl)
|
require(state is FirSourceModuleResolveState)
|
||||||
|
|
||||||
return if (place is KtFile) {
|
return if (place is KtFile) {
|
||||||
FileTowerProvider(place, onAirGetTowerContextForFile(state, place))
|
FileTowerProvider(place, onAirGetTowerContextForFile(state, place))
|
||||||
@@ -116,7 +116,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun onAirGetTowerContextForFile(
|
private fun onAirGetTowerContextForFile(
|
||||||
state: FirModuleResolveStateImpl,
|
state: FirSourceModuleResolveState,
|
||||||
file: KtFile,
|
file: KtFile,
|
||||||
): FirTowerDataContext {
|
): FirTowerDataContext {
|
||||||
require(file.isPhysical)
|
require(file.isPhysical)
|
||||||
@@ -144,7 +144,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
originalKtFile: KtFile,
|
originalKtFile: KtFile,
|
||||||
elementToAnalyze: KtElement
|
elementToAnalyze: KtElement
|
||||||
): FirModuleResolveState {
|
): FirModuleResolveState {
|
||||||
require(originalState is FirModuleResolveStateImpl)
|
require(originalState is FirSourceModuleResolveState)
|
||||||
require(elementToAnalyze !is KtFile) { "KtFile for dependency element not supported" }
|
require(elementToAnalyze !is KtFile) { "KtFile for dependency element not supported" }
|
||||||
require(!elementToAnalyze.isPhysical) { "Depended state should be build only for non-physical elements" }
|
require(!elementToAnalyze.isPhysical) { "Depended state should be build only for non-physical elements" }
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
|
|
||||||
private fun tryResolveAsFileAnnotation(
|
private fun tryResolveAsFileAnnotation(
|
||||||
annotationEntry: KtAnnotationEntry,
|
annotationEntry: KtAnnotationEntry,
|
||||||
state: FirModuleResolveStateImpl,
|
state: FirSourceModuleResolveState,
|
||||||
replacement: RawFirReplacement,
|
replacement: RawFirReplacement,
|
||||||
firFile: FirFile,
|
firFile: FirFile,
|
||||||
collector: FirTowerDataContextCollector? = null,
|
collector: FirTowerDataContextCollector? = null,
|
||||||
@@ -202,7 +202,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun runBodyResolveOnAir(
|
private fun runBodyResolveOnAir(
|
||||||
state: FirModuleResolveStateImpl,
|
state: FirSourceModuleResolveState,
|
||||||
replacement: RawFirReplacement,
|
replacement: RawFirReplacement,
|
||||||
onAirCreatedDeclaration: Boolean,
|
onAirCreatedDeclaration: Boolean,
|
||||||
collector: FirTowerDataContextCollector? = null,
|
collector: FirTowerDataContextCollector? = null,
|
||||||
|
|||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 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.low.level.api.fir.state
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||||
|
|
||||||
|
abstract class FirPhysicalModuleResolveState : FirModuleResolveState()
|
||||||
+20
-22
@@ -1,13 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2022 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.
|
* 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.low.level.api.fir
|
package org.jetbrains.kotlin.analysis.low.level.api.fir.state
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.DiagnosticsCollector
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.DiagnosticsCollector
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirElementBuilder
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirElementBuilder
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration
|
||||||
@@ -22,6 +21,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirDeclarationForCom
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceNonLocalFirDeclaration
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceNonLocalFirDeclaration
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
||||||
@@ -38,13 +38,13 @@ import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
|||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
|
||||||
internal class FirModuleResolveStateImpl(
|
internal class FirSourceModuleResolveState(
|
||||||
override val project: Project,
|
override val project: Project,
|
||||||
override val module: KtModule,
|
override val module: KtSourceModule,
|
||||||
private val sessionProvider: FirIdeSessionProvider,
|
private val sessionProvider: FirIdeSessionProvider,
|
||||||
val firFileBuilder: FirFileBuilder,
|
val firFileBuilder: FirFileBuilder,
|
||||||
val firLazyDeclarationResolver: FirLazyDeclarationResolver,
|
val firLazyDeclarationResolver: FirLazyDeclarationResolver,
|
||||||
) : FirModuleResolveState() {
|
) : FirPhysicalModuleResolveState() {
|
||||||
override val rootModuleSession: FirIdeSourcesSession get() = sessionProvider.rootModuleSession
|
override val rootModuleSession: FirIdeSourcesSession get() = sessionProvider.rootModuleSession
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -82,30 +82,28 @@ internal class FirModuleResolveStateImpl(
|
|||||||
override fun collectDiagnosticsForFile(ktFile: KtFile, filter: DiagnosticCheckerFilter): Collection<KtPsiDiagnostic> =
|
override fun collectDiagnosticsForFile(ktFile: KtFile, filter: DiagnosticCheckerFilter): Collection<KtPsiDiagnostic> =
|
||||||
diagnosticsCollector.collectDiagnosticsForFile(ktFile, filter)
|
diagnosticsCollector.collectDiagnosticsForFile(ktFile, filter)
|
||||||
|
|
||||||
override fun findSourceFirSymbol(ktDeclaration: KtDeclaration): FirBasedSymbol<*> {
|
override fun resolveToFirSymbol(
|
||||||
|
ktDeclaration: KtDeclaration,
|
||||||
|
phase: FirResolvePhase
|
||||||
|
): FirBasedSymbol<*> {
|
||||||
|
return when (val module = ktDeclaration.getKtModule()) {
|
||||||
|
is KtSourceModule -> findSourceFirSymbol(ktDeclaration).also { resolveFirToPhase(it.fir, phase) }
|
||||||
|
is KtLibraryModule -> findFirCompiledSymbol(ktDeclaration)
|
||||||
|
else -> error("unsupported module $module")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun findSourceFirSymbol(ktDeclaration: KtDeclaration): FirBasedSymbol<*> {
|
||||||
return findSourceFirDeclarationByExpression(ktDeclaration.originalDeclaration ?: ktDeclaration).symbol
|
return findSourceFirDeclarationByExpression(ktDeclaration.originalDeclaration ?: ktDeclaration).symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun findSourceFirSymbol(ktDeclaration: KtLambdaExpression): FirBasedSymbol<*> {
|
private fun findFirCompiledSymbol(ktDeclaration: KtDeclaration): FirBasedSymbol<*> {
|
||||||
return findSourceFirDeclarationByExpression(ktDeclaration).symbol
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun findSourceFirCompiledSymbol(ktDeclaration: KtDeclaration): FirBasedSymbol<*> {
|
|
||||||
require(ktDeclaration.containingKtFile.isCompiled) {
|
require(ktDeclaration.containingKtFile.isCompiled) {
|
||||||
"This method will only work on compiled declarations, but this declaration is not compiled: ${ktDeclaration.getElementTextInContext()}"
|
"This method will only work on compiled declarations, but this declaration is not compiled: ${ktDeclaration.getElementTextInContext()}"
|
||||||
}
|
}
|
||||||
|
|
||||||
val searcher = FirDeclarationForCompiledElementSearcher(rootModuleSession.symbolProvider)
|
val searcher = FirDeclarationForCompiledElementSearcher(rootModuleSession.symbolProvider)
|
||||||
|
val firDeclaration = searcher.findNonLocalDeclaration(ktDeclaration)
|
||||||
val firDeclaration = when (ktDeclaration) {
|
|
||||||
is KtEnumEntry -> searcher.findNonLocalEnumEntry(ktDeclaration)
|
|
||||||
is KtClassOrObject -> searcher.findNonLocalClass(ktDeclaration)
|
|
||||||
is KtConstructor<*> -> searcher.findConstructorOfNonLocalClass(ktDeclaration)
|
|
||||||
is KtNamedFunction -> searcher.findNonLocalFunction(ktDeclaration)
|
|
||||||
is KtProperty -> searcher.findNonLocalProperty(ktDeclaration)
|
|
||||||
|
|
||||||
else -> error("Unsupported compiled declaration of type ${ktDeclaration::class}: ${ktDeclaration.getElementTextInContext()}")
|
|
||||||
}
|
|
||||||
return firDeclaration.symbol
|
return firDeclaration.symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
+16
-5
@@ -21,8 +21,19 @@ import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
|||||||
* Allows to search for FIR declarations by compiled [KtDeclaration]s.
|
* Allows to search for FIR declarations by compiled [KtDeclaration]s.
|
||||||
*/
|
*/
|
||||||
internal class FirDeclarationForCompiledElementSearcher(private val symbolProvider: FirSymbolProvider) {
|
internal class FirDeclarationForCompiledElementSearcher(private val symbolProvider: FirSymbolProvider) {
|
||||||
|
fun findNonLocalDeclaration(ktDeclaration: KtDeclaration): FirDeclaration {
|
||||||
|
return when (ktDeclaration) {
|
||||||
|
is KtEnumEntry -> findNonLocalEnumEntry(ktDeclaration)
|
||||||
|
is KtClassOrObject -> findNonLocalClass(ktDeclaration)
|
||||||
|
is KtConstructor<*> -> findConstructorOfNonLocalClass(ktDeclaration)
|
||||||
|
is KtNamedFunction -> findNonLocalFunction(ktDeclaration)
|
||||||
|
is KtProperty -> findNonLocalProperty(ktDeclaration)
|
||||||
|
|
||||||
fun findNonLocalEnumEntry(declaration: KtEnumEntry): FirEnumEntry {
|
else -> error("Unsupported compiled declaration of type ${ktDeclaration::class}: ${ktDeclaration.getElementTextInContext()}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun findNonLocalEnumEntry(declaration: KtEnumEntry): FirEnumEntry {
|
||||||
require(!declaration.isLocal)
|
require(!declaration.isLocal)
|
||||||
val classId = declaration.containingClassOrObject?.getClassId()
|
val classId = declaration.containingClassOrObject?.getClassId()
|
||||||
?: error("Non-local class should have classId. The class is ${declaration.getElementTextInContext()}")
|
?: error("Non-local class should have classId. The class is ${declaration.getElementTextInContext()}")
|
||||||
@@ -35,7 +46,7 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid
|
|||||||
} as FirEnumEntry
|
} as FirEnumEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
fun findNonLocalClass(declaration: KtClassOrObject): FirClassLikeDeclaration {
|
private fun findNonLocalClass(declaration: KtClassOrObject): FirClassLikeDeclaration {
|
||||||
require(!declaration.isLocal)
|
require(!declaration.isLocal)
|
||||||
val classId = declaration.getClassId()
|
val classId = declaration.getClassId()
|
||||||
?: error("Non-local class should have classId. The class is ${declaration.getElementTextInContext()}")
|
?: error("Non-local class should have classId. The class is ${declaration.getElementTextInContext()}")
|
||||||
@@ -46,7 +57,7 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid
|
|||||||
return classCandidate.fir
|
return classCandidate.fir
|
||||||
}
|
}
|
||||||
|
|
||||||
fun findConstructorOfNonLocalClass(declaration: KtConstructor<*>): FirConstructor {
|
private fun findConstructorOfNonLocalClass(declaration: KtConstructor<*>): FirConstructor {
|
||||||
val containingClass = declaration.containingClassOrObject
|
val containingClass = declaration.containingClassOrObject
|
||||||
?: error("Constructor must have outer class: ${declaration.getElementTextInContext()}")
|
?: error("Constructor must have outer class: ${declaration.getElementTextInContext()}")
|
||||||
|
|
||||||
@@ -62,7 +73,7 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid
|
|||||||
return constructorCandidate.fir
|
return constructorCandidate.fir
|
||||||
}
|
}
|
||||||
|
|
||||||
fun findNonLocalFunction(declaration: KtNamedFunction): FirFunction {
|
private fun findNonLocalFunction(declaration: KtNamedFunction): FirFunction {
|
||||||
require(!declaration.isLocal)
|
require(!declaration.isLocal)
|
||||||
|
|
||||||
val functionCandidate =
|
val functionCandidate =
|
||||||
@@ -73,7 +84,7 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid
|
|||||||
return functionCandidate.fir
|
return functionCandidate.fir
|
||||||
}
|
}
|
||||||
|
|
||||||
fun findNonLocalProperty(declaration: KtProperty): FirProperty {
|
private fun findNonLocalProperty(declaration: KtProperty): FirProperty {
|
||||||
require(!declaration.isLocal)
|
require(!declaration.isLocal)
|
||||||
|
|
||||||
val propertyCandidate =
|
val propertyCandidate =
|
||||||
|
|||||||
+3
-2
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.low.level.api.fir
|
package org.jetbrains.kotlin.analysis.low.level.api.fir
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.FirSourceModuleResolveState
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirRenderer
|
import org.jetbrains.kotlin.fir.FirRenderer
|
||||||
@@ -53,7 +54,7 @@ abstract class AbstractFirLazyDeclarationResolveTest : AbstractLowLevelApiSingle
|
|||||||
val rendererOption = FirRenderer.RenderMode.WithDeclarationAttributes.copy(renderDeclarationResolvePhase = true)
|
val rendererOption = FirRenderer.RenderMode.WithDeclarationAttributes.copy(renderDeclarationResolvePhase = true)
|
||||||
val resultBuilder = StringBuilder()
|
val resultBuilder = StringBuilder()
|
||||||
resolveWithClearCaches(ktFile) { firModuleResolveState ->
|
resolveWithClearCaches(ktFile) { firModuleResolveState ->
|
||||||
check(firModuleResolveState is FirModuleResolveStateImpl)
|
check(firModuleResolveState is FirSourceModuleResolveState)
|
||||||
val declarationToResolve = firModuleResolveState
|
val declarationToResolve = firModuleResolveState
|
||||||
.getOrBuildFirFile(ktFile)
|
.getOrBuildFirFile(ktFile)
|
||||||
.findResolveMe()
|
.findResolveMe()
|
||||||
@@ -67,7 +68,7 @@ abstract class AbstractFirLazyDeclarationResolveTest : AbstractLowLevelApiSingle
|
|||||||
}
|
}
|
||||||
|
|
||||||
resolveWithClearCaches(ktFile) { firModuleResolveState ->
|
resolveWithClearCaches(ktFile) { firModuleResolveState ->
|
||||||
check(firModuleResolveState is FirModuleResolveStateImpl)
|
check(firModuleResolveState is FirSourceModuleResolveState)
|
||||||
val firFile = firModuleResolveState.getOrBuildFirFile(ktFile)
|
val firFile = firModuleResolveState.getOrBuildFirFile(ktFile)
|
||||||
firFile.ensureResolved(FirResolvePhase.BODY_RESOLVE)
|
firFile.ensureResolved(FirResolvePhase.BODY_RESOLVE)
|
||||||
resultBuilder.append("\nFILE RAW TO BODY:\n")
|
resultBuilder.append("\nFILE RAW TO BODY:\n")
|
||||||
|
|||||||
+2
-1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.analysis.low.level.api.fir
|
package org.jetbrains.kotlin.analysis.low.level.api.fir
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.FirSourceModuleResolveState
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
|
||||||
import org.jetbrains.kotlin.fir.FirRenderer
|
import org.jetbrains.kotlin.fir.FirRenderer
|
||||||
import org.jetbrains.kotlin.fir.render
|
import org.jetbrains.kotlin.fir.render
|
||||||
@@ -32,7 +33,7 @@ abstract class AbstractFirOnAirResolveTest : AbstractLowLevelApiSingleFileTest()
|
|||||||
check(place::class == onAir::class)
|
check(place::class == onAir::class)
|
||||||
|
|
||||||
resolveWithClearCaches(ktFile) { resolveState ->
|
resolveWithClearCaches(ktFile) { resolveState ->
|
||||||
check(resolveState is FirModuleResolveStateImpl)
|
check(resolveState is FirSourceModuleResolveState)
|
||||||
val firElement = LowLevelFirApiFacadeForResolveOnAir.onAirResolveElement(resolveState, place, onAir)
|
val firElement = LowLevelFirApiFacadeForResolveOnAir.onAirResolveElement(resolveState, place, onAir)
|
||||||
val rendered = firElement.render(FirRenderer.RenderMode.WithResolvePhases)
|
val rendered = firElement.render(FirRenderer.RenderMode.WithResolvePhases)
|
||||||
testServices.assertions.assertEqualsToTestDataFileSibling(rendered)
|
testServices.assertions.assertEqualsToTestDataFileSibling(rendered)
|
||||||
|
|||||||
+2
-2
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.resolve.ImplicitReceiverStack
|
import org.jetbrains.kotlin.fir.resolve.ImplicitReceiverStack
|
||||||
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.FirModuleResolveStateImpl
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.FirSourceModuleResolveState
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getDiagnostics
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getDiagnostics
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
|
||||||
@@ -41,7 +41,7 @@ abstract class AbstractFirContextCollectionTest : AbstractLowLevelApiSingleFileT
|
|||||||
register(BeforeElementDiagnosticCollectionHandler::class, handler)
|
register(BeforeElementDiagnosticCollectionHandler::class, handler)
|
||||||
}
|
}
|
||||||
) { resolveState ->
|
) { resolveState ->
|
||||||
check(resolveState is FirModuleResolveStateImpl)
|
check(resolveState is FirSourceModuleResolveState)
|
||||||
|
|
||||||
val fileStructure = resolveState.fileStructureCache.getFileStructure(ktFile, resolveState.rootModuleSession.cache)
|
val fileStructure = resolveState.fileStructureCache.getFileStructure(ktFile, resolveState.rootModuleSession.cache)
|
||||||
val allStructureElements = fileStructure.getAllStructureElements()
|
val allStructureElements = fileStructure.getAllStructureElements()
|
||||||
|
|||||||
+2
-2
@@ -9,7 +9,7 @@ import com.intellij.psi.PsiComment
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiElementVisitor
|
import com.intellij.psi.PsiElementVisitor
|
||||||
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.FirModuleResolveStateImpl
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.state.FirSourceModuleResolveState
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getResolveState
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getResolveState
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
@@ -85,7 +85,7 @@ abstract class AbstractFileStructureTest : AbstractLowLevelApiSingleFileTest() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun KtFile.getFileStructure(): FileStructure {
|
private fun KtFile.getFileStructure(): FileStructure {
|
||||||
val moduleResolveState = getResolveState() as FirModuleResolveStateImpl
|
val moduleResolveState = getResolveState() as FirSourceModuleResolveState
|
||||||
return moduleResolveState.fileStructureCache.getFileStructure(
|
return moduleResolveState.fileStructureCache.getFileStructure(
|
||||||
ktFile = this,
|
ktFile = this,
|
||||||
moduleFileCache = moduleResolveState.rootModuleSession.cache
|
moduleFileCache = moduleResolveState.rootModuleSession.cache
|
||||||
|
|||||||
Reference in New Issue
Block a user