LL API: allow getOrBuildFir to return null
This commit is contained in:
committed by
teamcityserver
parent
4bca296dc6
commit
6139d97b2a
+1
-1
@@ -41,7 +41,7 @@ internal class FirModuleResolveStateDepended(
|
|||||||
override fun getSessionFor(moduleInfo: ModuleInfo): FirSession =
|
override fun getSessionFor(moduleInfo: ModuleInfo): FirSession =
|
||||||
originalState.getSessionFor(moduleInfo)
|
originalState.getSessionFor(moduleInfo)
|
||||||
|
|
||||||
override fun getOrBuildFirFor(element: KtElement): FirElement {
|
override fun getOrBuildFirFor(element: KtElement): FirElement? {
|
||||||
val psi = originalState.elementBuilder.getPsiAsFirElementSource(element)
|
val psi = originalState.elementBuilder.getPsiAsFirElementSource(element)
|
||||||
|
|
||||||
ktToFirMapping?.getFirOfClosestParent(psi, this)?.let { return it }
|
ktToFirMapping?.getFirOfClosestParent(psi, this)?.let { return it }
|
||||||
|
|||||||
+1
-1
@@ -61,7 +61,7 @@ internal class FirModuleResolveStateImpl(
|
|||||||
override fun getSessionFor(moduleInfo: ModuleInfo): FirSession =
|
override fun getSessionFor(moduleInfo: ModuleInfo): FirSession =
|
||||||
sessionProvider.getSession(moduleInfo)!!
|
sessionProvider.getSession(moduleInfo)!!
|
||||||
|
|
||||||
override fun getOrBuildFirFor(element: KtElement): FirElement =
|
override fun getOrBuildFirFor(element: KtElement): FirElement? =
|
||||||
elementBuilder.getOrBuildFirFor(
|
elementBuilder.getOrBuildFirFor(
|
||||||
element = element,
|
element = element,
|
||||||
firFileBuilder = firFileBuilder,
|
firFileBuilder = firFileBuilder,
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ abstract class FirModuleResolveState {
|
|||||||
* This operation could be performance affective because it create FIleStructureElement and resolve non-local declaration into BODY phase, use
|
* This operation could be performance affective because it create FIleStructureElement and resolve non-local declaration into BODY phase, use
|
||||||
* @see tryGetCachedFirFile to get [FirFile] in undefined phase
|
* @see tryGetCachedFirFile to get [FirFile] in undefined phase
|
||||||
*/
|
*/
|
||||||
internal abstract fun getOrBuildFirFor(element: KtElement): FirElement
|
internal abstract fun getOrBuildFirFor(element: KtElement): FirElement?
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get or build or get cached [FirFile] for requested file in undefined phase
|
* Get or build or get cached [FirFile] for requested file in undefined phase
|
||||||
|
|||||||
+4
-2
@@ -208,11 +208,13 @@ fun <D : FirDeclaration> D.resolvedFirToType(
|
|||||||
/**
|
/**
|
||||||
* Get a [FirElement] which was created by [KtElement]
|
* Get a [FirElement] which was created by [KtElement]
|
||||||
* Returned [FirElement] is guaranteed to be resolved to [FirResolvePhase.BODY_RESOLVE] phase
|
* Returned [FirElement] is guaranteed to be resolved to [FirResolvePhase.BODY_RESOLVE] phase
|
||||||
* This operation could be performance affective because it create FIleStructureElement and resolve non-local declaration into BODY phase
|
* This operation could be performance affective because it create FIleStructureElement and resolve non-local declaration into BODY phase.
|
||||||
|
*
|
||||||
|
* The `null` value is returned iff FIR tree does not have corresponding element
|
||||||
*/
|
*/
|
||||||
fun KtElement.getOrBuildFir(
|
fun KtElement.getOrBuildFir(
|
||||||
resolveState: FirModuleResolveState,
|
resolveState: FirModuleResolveState,
|
||||||
): FirElement = resolveState.getOrBuildFirFor(this)
|
): FirElement? = resolveState.getOrBuildFirFor(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a [FirElement] which was created by [KtElement], but only if it is subtype of [E], `null` otherwise
|
* Get a [FirElement] which was created by [KtElement], but only if it is subtype of [E], `null` otherwise
|
||||||
|
|||||||
+1
-2
@@ -233,8 +233,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val originalDeclaration = nonLocalDeclaration.getOrBuildFir(state)
|
val originalDeclaration = nonLocalDeclaration.getOrBuildFirOfType<FirDeclaration>(state)
|
||||||
check(originalDeclaration is FirDeclaration) { "Invalid original declaration type ${originalDeclaration::class.simpleName}" }
|
|
||||||
|
|
||||||
val originalDesignation = originalDeclaration.collectDesignation()
|
val originalDesignation = originalDeclaration.collectDesignation()
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -55,7 +55,7 @@ internal class FirElementBuilder {
|
|||||||
fileStructureCache: FileStructureCache,
|
fileStructureCache: FileStructureCache,
|
||||||
firLazyDeclarationResolver: FirLazyDeclarationResolver,
|
firLazyDeclarationResolver: FirLazyDeclarationResolver,
|
||||||
state: FirModuleResolveState,
|
state: FirModuleResolveState,
|
||||||
): FirElement = when (element) {
|
): FirElement? = when (element) {
|
||||||
is KtFile -> getOrBuildFirForKtFile(element, firFileBuilder, moduleFileCache, firLazyDeclarationResolver)
|
is KtFile -> getOrBuildFirForKtFile(element, firFileBuilder, moduleFileCache, firLazyDeclarationResolver)
|
||||||
else -> getOrBuildFirForNonKtFileElement(element, fileStructureCache, moduleFileCache, state)
|
else -> getOrBuildFirForNonKtFileElement(element, fileStructureCache, moduleFileCache, state)
|
||||||
}
|
}
|
||||||
@@ -82,7 +82,7 @@ internal class FirElementBuilder {
|
|||||||
fileStructureCache: FileStructureCache,
|
fileStructureCache: FileStructureCache,
|
||||||
moduleFileCache: ModuleFileCache,
|
moduleFileCache: ModuleFileCache,
|
||||||
state: FirModuleResolveState,
|
state: FirModuleResolveState,
|
||||||
): FirElement {
|
): FirElement? {
|
||||||
require(element !is KtFile)
|
require(element !is KtFile)
|
||||||
val firFile = element.containingKtFile
|
val firFile = element.containingKtFile
|
||||||
val fileStructure = fileStructureCache.getFileStructure(firFile, moduleFileCache)
|
val fileStructure = fileStructureCache.getFileStructure(firFile, moduleFileCache)
|
||||||
|
|||||||
+3
-2
@@ -36,7 +36,7 @@ abstract class AbstractGetOrBuildFirTest : AbstractLowLevelApiSingleFileTest() {
|
|||||||
val actual = resolveWithClearCaches(ktFile) { state ->
|
val actual = resolveWithClearCaches(ktFile) { state ->
|
||||||
val fir = selectedElement.getOrBuildFir(state)
|
val fir = selectedElement.getOrBuildFir(state)
|
||||||
"""|KT element: ${selectedElement::class.simpleName}
|
"""|KT element: ${selectedElement::class.simpleName}
|
||||||
|FIR element: ${fir::class.simpleName}
|
|FIR element: ${fir?.let { it::class.simpleName }}
|
||||||
|
|
|
|
||||||
|FIR element rendered:
|
|FIR element rendered:
|
||||||
|${render(fir)}""".trimMargin()
|
|${render(fir)}""".trimMargin()
|
||||||
@@ -55,7 +55,8 @@ abstract class AbstractGetOrBuildFirTest : AbstractLowLevelApiSingleFileTest() {
|
|||||||
).single { it.textRange == selectedElement.textRange }
|
).single { it.textRange == selectedElement.textRange }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun render(firElement: FirElement): String = when (firElement) {
|
private fun render(firElement: FirElement?): String = when (firElement) {
|
||||||
|
null -> "null"
|
||||||
is FirImport -> "import ${firElement.importedFqName}"
|
is FirImport -> "import ${firElement.importedFqName}"
|
||||||
else -> firElement.render(renderingMode)
|
else -> firElement.render(renderingMode)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirRealSourceElementKind
|
|||||||
import org.jetbrains.kotlin.fir.SessionConfiguration
|
import org.jetbrains.kotlin.fir.SessionConfiguration
|
||||||
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollectorVisitor
|
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollectorVisitor
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
||||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
|||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.DiagnosticCheckerFilter
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.DiagnosticCheckerFilter
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDiagnosticsForFile
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDiagnosticsForFile
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.BeforeElementDiagnosticCollectionHandler
|
import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.BeforeElementDiagnosticCollectionHandler
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.SingleNonLocalDeclarationDiagnosticRetriever
|
import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.SingleNonLocalDeclarationDiagnosticRetriever
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.fir.PersistentCheckerContextFactory
|
import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.fir.PersistentCheckerContextFactory
|
||||||
@@ -44,7 +46,7 @@ abstract class AbstractDiagnosticTraversalCounterTest : AbstractLowLevelApiSing
|
|||||||
// we should get diagnostics before we resolve the whole file by ktFile.getOrBuildFir
|
// we should get diagnostics before we resolve the whole file by ktFile.getOrBuildFir
|
||||||
ktFile.collectDiagnosticsForFile(resolveState, DiagnosticCheckerFilter.ONLY_COMMON_CHECKERS)
|
ktFile.collectDiagnosticsForFile(resolveState, DiagnosticCheckerFilter.ONLY_COMMON_CHECKERS)
|
||||||
|
|
||||||
val firFile = ktFile.getOrBuildFir(resolveState)
|
val firFile = ktFile.getOrBuildFirOfType<FirFile>(resolveState)
|
||||||
|
|
||||||
val errorElements = collectErrorElements(firFile, handler)
|
val errorElements = collectErrorElements(firFile, handler)
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -11,6 +11,7 @@ import com.intellij.psi.SmartPsiElementPointer
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
|
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
||||||
@@ -41,6 +42,7 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
|||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
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.LowLevelFirApiFacadeForResolveOnAir
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerContextProvider
|
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.fir.low.level.api.util.parentsOfType
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.components.KtReferenceShortener
|
import org.jetbrains.kotlin.idea.frontend.api.components.KtReferenceShortener
|
||||||
@@ -74,7 +76,7 @@ internal class KtFirReferenceShortener(
|
|||||||
val declarationToVisit = file.findSmallestDeclarationContainingSelection(selection)
|
val declarationToVisit = file.findSmallestDeclarationContainingSelection(selection)
|
||||||
?: file.withDeclarationsResolvedToBodyResolve()
|
?: file.withDeclarationsResolvedToBodyResolve()
|
||||||
|
|
||||||
val firDeclaration = declarationToVisit.getOrBuildFir(firResolveState)
|
val firDeclaration = declarationToVisit.getOrBuildFirOfType<FirDeclaration>(firResolveState)
|
||||||
|
|
||||||
val towerContext =
|
val towerContext =
|
||||||
LowLevelFirApiFacadeForResolveOnAir.onAirGetTowerContextProvider(firResolveState, declarationToVisit)
|
LowLevelFirApiFacadeForResolveOnAir.onAirGetTowerContextProvider(firResolveState, declarationToVisit)
|
||||||
|
|||||||
Reference in New Issue
Block a user