[FIR IDE] Rename and move refactorings, codereview refactorings

This commit is contained in:
Igor Yakovlev
2021-05-10 18:27:52 +02:00
committed by TeamCityServer
parent c5372be267
commit 2bfacaaed2
20 changed files with 137 additions and 110 deletions
@@ -6,11 +6,9 @@
package org.jetbrains.kotlin.idea.fir.low.level.api package org.jetbrains.kotlin.idea.fir.low.level.api
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.idea.fir.low.level.api.api.FirDeclarationUntypedDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile
abstract class ContextByDesignationCollector<C : Any>(private val designation: FirDeclarationDesignation) { abstract class ContextByDesignationCollector<C : Any>(private val designation: FirDeclarationUntypedDesignation) {
private var context: C? = null private var context: C? = null
private val designationState = FirDesignationState(designation) private val designationState = FirDesignationState(designation)
@@ -38,7 +36,7 @@ abstract class ContextByDesignationCollector<C : Any>(private val designation: F
} }
} }
private class FirDesignationState(val designation: FirDeclarationDesignation) { private class FirDesignationState(val designation: FirDeclarationUntypedDesignation) {
/** /**
* Holds current declaration index * Holds current declaration index
* if `currentIndex in [0, designation.path.lastIndex]` then current declaration is in path * if `currentIndex in [0, designation.path.lastIndex]` then current declaration is in path
@@ -166,7 +166,7 @@ internal object DeclarationCopyBuilder {
return RawFirNonLocalDeclarationBuilder.buildWithReplacement( return RawFirNonLocalDeclarationBuilder.buildWithReplacement(
session = originalFirDeclaration.moduleData.session, session = originalFirDeclaration.moduleData.session,
baseScopeProvider = originalFirDeclaration.moduleData.session.firIdeProvider.kotlinScopeProvider, baseScopeProvider = originalFirDeclaration.moduleData.session.firIdeProvider.kotlinScopeProvider,
designation = originalFirDeclaration.collectDesignation().path, designation = originalFirDeclaration.collectDesignation(),
declarationToBuild = rootNonLocalDeclaration, declarationToBuild = rootNonLocalDeclaration,
replacement = replacement, replacement = replacement,
) as D ) as D
@@ -12,12 +12,15 @@ import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.toFirRegularClass import org.jetbrains.kotlin.fir.resolve.toFirRegularClass
class FirDeclarationDesignationWithFile( typealias FirDeclarationUntypedDesignation = FirDeclarationDesignation<FirDeclaration>
typealias FirDeclarationUntypedDesignationWithFile = FirDeclarationDesignationWithFile<FirDeclaration>
class FirDeclarationDesignationWithFile<out T : FirDeclaration>(
path: List<FirDeclaration>, path: List<FirDeclaration>,
declaration: FirDeclaration, declaration: T,
isLocalDesignation: Boolean, isLocalDesignation: Boolean,
val firFile: FirFile val firFile: FirFile
) : FirDeclarationDesignation( ) : FirDeclarationDesignation<T>(
path, path,
declaration, declaration,
isLocalDesignation isLocalDesignation
@@ -29,9 +32,9 @@ class FirDeclarationDesignationWithFile(
} }
} }
open class FirDeclarationDesignation( open class FirDeclarationDesignation<out T : FirDeclaration>(
val path: List<FirDeclaration>, val path: List<FirDeclaration>,
val declaration: FirDeclaration, val declaration: T,
val isLocalDesignation: Boolean val isLocalDesignation: Boolean
) { ) {
fun toSequence(includeTarget: Boolean): Sequence<FirDeclaration> = sequence { fun toSequence(includeTarget: Boolean): Sequence<FirDeclaration> = sequence {
@@ -86,12 +89,12 @@ private fun FirRegularClass.collectForLocal(): List<FirClassLikeDeclaration<*>>
} }
fun FirDeclaration.collectDesignation(firFile: FirFile): FirDeclarationDesignationWithFile = fun FirDeclaration.collectDesignation(firFile: FirFile): FirDeclarationUntypedDesignationWithFile =
collectDesignationAndIsLocal(this).let { collectDesignationAndIsLocal(this).let {
FirDeclarationDesignationWithFile(it.first, this, it.second, firFile) FirDeclarationUntypedDesignationWithFile(it.first, this, it.second, firFile)
} }
fun FirDeclaration.collectDesignation(): FirDeclarationDesignation = fun FirDeclaration.collectDesignation(): FirDeclarationUntypedDesignation =
collectDesignationAndIsLocal(this).let { collectDesignationAndIsLocal(this).let {
FirDeclarationDesignation(it.first, this, it.second) FirDeclarationUntypedDesignation(it.first, this, it.second)
} }
@@ -31,7 +31,7 @@ abstract class FirModuleResolveState {
/** /**
* Build fully resolved FIR node for requested element. * Build fully resolved FIR node for requested element.
* This operation could be performance affective, 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
@@ -113,14 +113,14 @@ fun <D : FirDeclaration, R> D.withFirDeclarationInWriteLock(
/** /**
* Returns a list of Diagnostics compiler finds for given [KtElement] * Returns a list of Diagnostics compiler finds for given [KtElement]
* This operation could be performance affective * This operation could be performance affective because it create FIleStructureElement and resolve non-local declaration into BODY phase
*/ */
fun KtElement.getDiagnostics(resolveState: FirModuleResolveState, filter: DiagnosticCheckerFilter): Collection<FirPsiDiagnostic<*>> = fun KtElement.getDiagnostics(resolveState: FirModuleResolveState, filter: DiagnosticCheckerFilter): Collection<FirPsiDiagnostic<*>> =
resolveState.getDiagnostics(this, filter) resolveState.getDiagnostics(this, filter)
/** /**
* Returns a list of Diagnostics compiler finds for given [KtFile] * Returns a list of Diagnostics compiler finds for given [KtFile]
* This operation could be performance affective * This operation could be performance affective because it create FIleStructureElement and resolve non-local declaration into BODY phase
*/ */
fun KtFile.collectDiagnosticsForFile( fun KtFile.collectDiagnosticsForFile(
resolveState: FirModuleResolveState, resolveState: FirModuleResolveState,
@@ -143,7 +143,7 @@ fun <D : FirDeclaration> D.resolvedFirToPhase(
/** /**
* 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 * This operation could be performance affective because it create FIleStructureElement and resolve non-local declaration into BODY phase
*/ */
fun KtElement.getOrBuildFir( fun KtElement.getOrBuildFir(
resolveState: FirModuleResolveState, resolveState: FirModuleResolveState,
@@ -152,7 +152,7 @@ fun KtElement.getOrBuildFir(
/** /**
* 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
* 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 * This operation could be performance affective because it create FIleStructureElement and resolve non-local declaration into BODY phase
*/ */
inline fun <reified E : FirElement> KtElement.getOrBuildFirSafe( inline fun <reified E : FirElement> KtElement.getOrBuildFirSafe(
resolveState: FirModuleResolveState, resolveState: FirModuleResolveState,
@@ -161,7 +161,7 @@ inline fun <reified E : FirElement> KtElement.getOrBuildFirSafe(
/** /**
* Get a [FirElement] which was created by [KtElement], but only if it is subtype of [E], throws [InvalidFirElementTypeException] otherwise * Get a [FirElement] which was created by [KtElement], but only if it is subtype of [E], throws [InvalidFirElementTypeException] otherwise
* 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 * This operation could be performance affective because it create FIleStructureElement and resolve non-local declaration into BODY phase
*/ */
inline fun <reified E : FirElement> KtElement.getOrBuildFirOfType( inline fun <reified E : FirElement> KtElement.getOrBuildFirOfType(
resolveState: FirModuleResolveState, resolveState: FirModuleResolveState,
@@ -12,13 +12,12 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.SessionHolder import org.jetbrains.kotlin.fir.resolve.SessionHolder
import org.jetbrains.kotlin.idea.fir.low.level.api.ContextByDesignationCollector import org.jetbrains.kotlin.idea.fir.low.level.api.ContextByDesignationCollector
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDesignation import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDesignation
private class ContextCollectingDiagnosticCollectorVisitor private constructor( private class ContextCollectingDiagnosticCollectorVisitor private constructor(
sessionHolder: SessionHolder, sessionHolder: SessionHolder,
designation: FirDeclarationDesignationWithFile, designation: FirDeclarationUntypedDesignationWithFile,
) : AbstractDiagnosticCollectorVisitor( ) : AbstractDiagnosticCollectorVisitor(
PersistentCheckerContextFactory.createEmptyPersistenceCheckerContext(sessionHolder) PersistentCheckerContextFactory.createEmptyPersistenceCheckerContext(sessionHolder)
) { ) {
@@ -41,7 +40,7 @@ private class ContextCollectingDiagnosticCollectorVisitor private constructor(
override fun checkElement(element: FirElement) {} override fun checkElement(element: FirElement) {}
companion object { companion object {
fun collect(sessionHolder: SessionHolder, designation: FirDeclarationDesignationWithFile): PersistentCheckerContext { fun collect(sessionHolder: SessionHolder, designation: FirDeclarationUntypedDesignationWithFile): PersistentCheckerContext {
val visitor = ContextCollectingDiagnosticCollectorVisitor(sessionHolder, designation) val visitor = ContextCollectingDiagnosticCollectorVisitor(sessionHolder, designation)
designation.firFile.accept(visitor, null) designation.firFile.accept(visitor, null)
return visitor.contextCollector.getCollectedContext() return visitor.contextCollector.getCollectedContext()
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.BodyResolveContext import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.BodyResolveContext
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDesignatedBodyResolveTransformerForReturnTypeCalculator import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDesignatedBodyResolveTransformerForReturnTypeCalculator
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyBodiesCalculator import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyBodiesCalculator
fun FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator( fun FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator(
@@ -41,7 +42,7 @@ fun FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator(
} }
class FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculatorImpl( class FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculatorImpl(
private val designation: List<FirElement>, designation: List<FirElement>,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession, implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
@@ -61,17 +62,20 @@ class FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculatorImpl(
simpleFunction: FirSimpleFunction, simpleFunction: FirSimpleFunction,
data: ResolutionMode data: ResolutionMode
): FirSimpleFunction { ): FirSimpleFunction {
FirLazyBodiesCalculator.calculateLazyBodiesForFunction(simpleFunction, declarationDesignation) val firDesignation = FirDeclarationDesignation(declarationDesignation, simpleFunction, false)
FirLazyBodiesCalculator.calculateLazyBodiesForFunction(firDesignation)
return super.transformSimpleFunction(simpleFunction, data) return super.transformSimpleFunction(simpleFunction, data)
} }
override fun transformConstructor(constructor: FirConstructor, data: ResolutionMode): FirDeclaration { override fun transformConstructor(constructor: FirConstructor, data: ResolutionMode): FirDeclaration {
FirLazyBodiesCalculator.calculateLazyBodyForSecondaryConstructor(constructor, declarationDesignation) val firDesignation = FirDeclarationDesignation(declarationDesignation, constructor, false)
FirLazyBodiesCalculator.calculateLazyBodyForSecondaryConstructor(firDesignation)
return super.transformConstructor(constructor, data) return super.transformConstructor(constructor, data)
} }
override fun transformProperty(property: FirProperty, data: ResolutionMode): FirProperty { override fun transformProperty(property: FirProperty, data: ResolutionMode): FirProperty {
FirLazyBodiesCalculator.calculateLazyBodyForProperty(property, declarationDesignation) val firDesignation = FirDeclarationDesignation(declarationDesignation, property, false)
FirLazyBodiesCalculator.calculateLazyBodyForProperty(firDesignation)
return super.transformProperty(property, data) return super.transformProperty(property, data)
} }
} }
@@ -14,13 +14,14 @@ import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtSecondaryConstructor import org.jetbrains.kotlin.psi.KtSecondaryConstructor
internal object FirLazyBodiesCalculator { internal object FirLazyBodiesCalculator {
fun calculateLazyBodiesInside(designation: FirDeclarationDesignation) { fun calculateLazyBodiesInside(designation: FirDeclarationUntypedDesignation) {
designation.declaration.transform<FirElement, MutableList<FirDeclaration>>( designation.declaration.transform<FirElement, MutableList<FirDeclaration>>(
FirLazyBodiesCalculatorTransformer, FirLazyBodiesCalculatorTransformer,
designation.toSequence(includeTarget = true).toMutableList() designation.toSequence(includeTarget = true).toMutableList()
@@ -33,7 +34,9 @@ internal object FirLazyBodiesCalculator {
} }
} }
fun calculateLazyBodiesForFunction(simpleFunction: FirSimpleFunction, designation: List<FirDeclaration>) { fun calculateLazyBodiesForFunction(designation: FirDeclarationDesignation<FirSimpleFunction>) {
require(!designation.isLocalDesignation) { "Not supported for local designations" }
val simpleFunction = designation.declaration
if (simpleFunction.body !is FirLazyBlock) return if (simpleFunction.body !is FirLazyBlock) return
val newFunction = RawFirNonLocalDeclarationBuilder.build( val newFunction = RawFirNonLocalDeclarationBuilder.build(
session = simpleFunction.moduleData.session, session = simpleFunction.moduleData.session,
@@ -47,7 +50,9 @@ internal object FirLazyBodiesCalculator {
} }
} }
fun calculateLazyBodyForSecondaryConstructor(secondaryConstructor: FirConstructor, designation: List<FirDeclaration>) { fun calculateLazyBodyForSecondaryConstructor(designation: FirDeclarationDesignation<FirConstructor>) {
require(!designation.isLocalDesignation) { "Not supported for local designations" }
val secondaryConstructor = designation.declaration
require(!secondaryConstructor.isPrimary) require(!secondaryConstructor.isPrimary)
if (secondaryConstructor.body !is FirLazyBlock) return if (secondaryConstructor.body !is FirLazyBlock) return
@@ -63,7 +68,9 @@ internal object FirLazyBodiesCalculator {
} }
} }
fun calculateLazyBodyForProperty(firProperty: FirProperty, designation: List<FirDeclaration>) { fun calculateLazyBodyForProperty(designation: FirDeclarationDesignation<FirProperty>) {
require(!designation.isLocalDesignation) { "Not supported for local designations" }
val firProperty = designation.declaration
if (!needCalculatingLazyBodyForProperty(firProperty)) return if (!needCalculatingLazyBodyForProperty(firProperty)) return
val newProperty = RawFirNonLocalDeclarationBuilder.build( val newProperty = RawFirNonLocalDeclarationBuilder.build(
@@ -131,7 +138,8 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<MutableList<F
data: MutableList<FirDeclaration> data: MutableList<FirDeclaration>
): FirDeclaration { ): FirDeclaration {
if (simpleFunction.body is FirLazyBlock) { if (simpleFunction.body is FirLazyBlock) {
FirLazyBodiesCalculator.calculateLazyBodiesForFunction(simpleFunction, data) val designation = FirDeclarationDesignation(data, simpleFunction, false)
FirLazyBodiesCalculator.calculateLazyBodiesForFunction(designation)
} }
return simpleFunction return simpleFunction
} }
@@ -141,14 +149,16 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<MutableList<F
data: MutableList<FirDeclaration> data: MutableList<FirDeclaration>
): FirDeclaration { ): FirDeclaration {
if (constructor.body is FirLazyBlock) { if (constructor.body is FirLazyBlock) {
FirLazyBodiesCalculator.calculateLazyBodyForSecondaryConstructor(constructor, data) val designation = FirDeclarationDesignation(data, constructor, false)
FirLazyBodiesCalculator.calculateLazyBodyForSecondaryConstructor(designation)
} }
return constructor return constructor
} }
override fun transformProperty(property: FirProperty, data: MutableList<FirDeclaration>): FirDeclaration { override fun transformProperty(property: FirProperty, data: MutableList<FirDeclaration>): FirDeclaration {
if (FirLazyBodiesCalculator.needCalculatingLazyBodyForProperty(property)) { if (FirLazyBodiesCalculator.needCalculatingLazyBodyForProperty(property)) {
FirLazyBodiesCalculator.calculateLazyBodyForProperty(property, data) val designation = FirDeclarationDesignation(data, property, false)
FirLazyBodiesCalculator.calculateLazyBodyForProperty(designation)
} }
return property return property
} }
@@ -15,8 +15,8 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.symbolProvider
import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptor import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptor
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDesignation import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalContainingOrThisDeclaration import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalContainingOrThisDeclaration
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
@@ -137,7 +137,7 @@ internal class FirLazyDeclarationResolver(
} }
} }
private fun createLazyBodiesCalculator(designation: FirDeclarationDesignation): (FirResolvePhase) -> Unit { private fun createLazyBodiesCalculator(designation: FirDeclarationUntypedDesignation): (FirResolvePhase) -> Unit {
var calculated = false var calculated = false
return { phase: FirResolvePhase -> return { phase: FirResolvePhase ->
if (!calculated && phase >= FirResolvePhase.CONTRACTS) { if (!calculated && phase >= FirResolvePhase.CONTRACTS) {
@@ -308,7 +308,7 @@ internal class FirLazyDeclarationResolver(
private fun runLazyResolvePhase( private fun runLazyResolvePhase(
phase: FirResolvePhase, phase: FirResolvePhase,
scopeSession: ScopeSession, scopeSession: ScopeSession,
designation: FirDeclarationDesignationWithFile, designation: FirDeclarationUntypedDesignationWithFile,
towerDataContextCollector: FirTowerDataContextCollector?, towerDataContextCollector: FirTowerDataContextCollector?,
firProviderInterceptor: FirProviderInterceptor? firProviderInterceptor: FirProviderInterceptor?
) { ) {
@@ -327,7 +327,7 @@ internal class FirLazyDeclarationResolver(
} }
private fun FirResolvePhase.createLazyTransformer( private fun FirResolvePhase.createLazyTransformer(
designation: FirDeclarationDesignationWithFile, designation: FirDeclarationUntypedDesignationWithFile,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector?, towerDataContextCollector: FirTowerDataContextCollector?,
firProviderInterceptor: FirProviderInterceptor?, firProviderInterceptor: FirProviderInterceptor?,
@@ -338,7 +338,7 @@ internal class FirLazyDeclarationResolver(
scopeSession, scopeSession,
firProviderInterceptor, firProviderInterceptor,
) )
FirResolvePhase.SEALED_CLASS_INHERITORS -> FirLazyTransformerForIDE.EMPTY FirResolvePhase.SEALED_CLASS_INHERITORS -> FirLazyTransformerForIDE.DUMMY
FirResolvePhase.TYPES -> FirDesignatedTypeResolverTransformerForIDE( FirResolvePhase.TYPES -> FirDesignatedTypeResolverTransformerForIDE(
designation, designation,
designation.firFile.moduleData.session, designation.firFile.moduleData.session,
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignation
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
internal data class RawFirReplacement<T : KtElement>(val from: T, val to: T) internal data class RawFirReplacement<T : KtElement>(val from: T, val to: T)
@@ -45,10 +46,11 @@ internal class RawFirNonLocalDeclarationBuilder<T : KtElement> private construct
fun <T : KtElement> buildWithReplacement( fun <T : KtElement> buildWithReplacement(
session: FirSession, session: FirSession,
baseScopeProvider: FirScopeProvider, baseScopeProvider: FirScopeProvider,
designation: List<FirDeclaration>, designation: FirDeclarationUntypedDesignation,
declarationToBuild: KtDeclaration, declarationToBuild: KtDeclaration,
replacement: RawFirReplacement<T>? = null replacement: RawFirReplacement<T>? = null
): FirDeclaration { ): FirDeclaration {
if (replacement != null) { if (replacement != null) {
require(elementIsApplicable(replacement.from)) { require(elementIsApplicable(replacement.from)) {
"Build with replacement is possible for applicable type but given ${replacement.from::class.simpleName}" "Build with replacement is possible for applicable type but given ${replacement.from::class.simpleName}"
@@ -61,7 +63,7 @@ internal class RawFirNonLocalDeclarationBuilder<T : KtElement> private construct
val builder = RawFirNonLocalDeclarationBuilder(session, baseScopeProvider, declarationToBuild, replacement) val builder = RawFirNonLocalDeclarationBuilder(session, baseScopeProvider, declarationToBuild, replacement)
builder.context.packageFqName = declarationToBuild.containingKtFile.packageFqName builder.context.packageFqName = declarationToBuild.containingKtFile.packageFqName
val result = builder.moveNext(designation.iterator(), containingClass = null) val result = builder.moveNext(designation.path.iterator(), containingClass = null)
check(replacement == null || builder.replacementApplied) { check(replacement == null || builder.replacementApplied) {
"Replacement requested but was not applied for ${replacement!!.from::class.simpleName}" "Replacement requested but was not applied for ${replacement!!.from::class.simpleName}"
} }
@@ -71,12 +73,12 @@ internal class RawFirNonLocalDeclarationBuilder<T : KtElement> private construct
fun build( fun build(
session: FirSession, session: FirSession,
baseScopeProvider: FirScopeProvider, baseScopeProvider: FirScopeProvider,
designation: List<FirDeclaration>, designation: FirDeclarationUntypedDesignation,
rootNonLocalDeclaration: KtDeclaration rootNonLocalDeclaration: KtDeclaration
): FirDeclaration { ): FirDeclaration {
val builder = RawFirNonLocalDeclarationBuilder<KtElement>(session, baseScopeProvider, rootNonLocalDeclaration) val builder = RawFirNonLocalDeclarationBuilder<KtElement>(session, baseScopeProvider, rootNonLocalDeclaration)
builder.context.packageFqName = rootNonLocalDeclaration.containingKtFile.packageFqName builder.context.packageFqName = rootNonLocalDeclaration.containingKtFile.packageFqName
return builder.moveNext(designation.iterator(), containingClass = null) return builder.moveNext(designation.path.iterator(), containingClass = null)
} }
} }
@@ -14,12 +14,12 @@ import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptor import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptor
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.* import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.*
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensureTargetPhase import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensureTargetPhase
internal class FirDesignatedBodyResolveTransformerForIDE( internal class FirDesignatedBodyResolveTransformerForIDE(
private val designation: FirDeclarationDesignationWithFile, private val designation: FirDeclarationUntypedDesignationWithFile,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector? = null, towerDataContextCollector: FirTowerDataContextCollector? = null,
@@ -11,11 +11,11 @@ import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclarationsResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclarationsResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.contracts.FirContractResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.contracts.FirContractResolveTransformer
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensureTargetPhase import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensureTargetPhase
internal class FirDesignatedContractsResolveTransformerForIDE( internal class FirDesignatedContractsResolveTransformerForIDE(
private val designation: FirDeclarationDesignationWithFile, private val designation: FirDeclarationUntypedDesignationWithFile,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
) : FirLazyTransformerForIDE, FirContractResolveTransformer(session, scopeSession) { ) : FirLazyTransformerForIDE, FirContractResolveTransformer(session, scopeSession) {
@@ -14,12 +14,12 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataCo
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.createReturnTypeCalculatorForIDE import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.createReturnTypeCalculatorForIDE
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensureTargetPhase import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensureTargetPhase
internal class FirDesignatedImplicitTypesTransformerForIDE( internal class FirDesignatedImplicitTypesTransformerForIDE(
private val designation: FirDeclarationDesignationWithFile, private val designation: FirDeclarationUntypedDesignationWithFile,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
towerDataContextCollector: FirTowerDataContextCollector? = null, towerDataContextCollector: FirTowerDataContextCollector? = null,
@@ -13,12 +13,13 @@ import org.jetbrains.kotlin.fir.resolve.transformers.FirDesignatedStatusResolveT
import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.StatusComputationSession import org.jetbrains.kotlin.fir.resolve.transformers.StatusComputationSession
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensurePathPhase import org.jetbrains.kotlin.idea.fir.low.level.api.util.targetContainingDeclaration
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensureTargetPhase import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensurePathPhase
import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensureTargetPhase
internal class FirDesignatedStatusResolveTransformerForIDE( internal class FirDesignatedStatusResolveTransformerForIDE(
private val designation: FirDeclarationDesignationWithFile, private val designation: FirDeclarationUntypedDesignationWithFile,
private val session: FirSession, private val session: FirSession,
private val scopeSession: ScopeSession, private val scopeSession: ScopeSession,
) : FirLazyTransformerForIDE { ) : FirLazyTransformerForIDE {
@@ -62,7 +63,7 @@ internal class FirDesignatedStatusResolveTransformerForIDE(
designation.ensurePathPhase(FirResolvePhase.TYPES) designation.ensurePathPhase(FirResolvePhase.TYPES)
designation.ensureTargetPhase(FirResolvePhase.TYPES) designation.ensureTargetPhase(FirResolvePhase.TYPES)
val containingClass = designation.path.lastOrNull() val containingClass = designation.targetContainingDeclaration()
if (containingClass == null) { if (containingClass == null) {
resolveTopLevelDeclaration(designation.declaration) resolveTopLevelDeclaration(designation.declaration)
} else { } else {
@@ -13,12 +13,12 @@ import org.jetbrains.kotlin.fir.resolve.transformers.FirApplySupertypesTransform
import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptor import org.jetbrains.kotlin.fir.resolve.transformers.FirProviderInterceptor
import org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor import org.jetbrains.kotlin.fir.resolve.transformers.FirSupertypeResolverVisitor
import org.jetbrains.kotlin.fir.resolve.transformers.SupertypeComputationSession import org.jetbrains.kotlin.fir.resolve.transformers.SupertypeComputationSession
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensurePathPhase import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensurePathPhase
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensureTargetPhaseIfClass import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensureTargetPhaseIfClass
internal class FirDesignatedSupertypeResolverTransformerForIDE( internal class FirDesignatedSupertypeResolverTransformerForIDE(
private val designation: FirDeclarationDesignationWithFile, private val designation: FirDeclarationUntypedDesignationWithFile,
private val session: FirSession, private val session: FirSession,
private val scopeSession: ScopeSession, private val scopeSession: ScopeSession,
private val firProviderInterceptor: FirProviderInterceptor? private val firProviderInterceptor: FirProviderInterceptor?
@@ -43,4 +43,4 @@ internal class FirDesignatedSupertypeResolverTransformerForIDE(
designation.declaration.transform<FirElement, Void?>(applySupertypesTransformer, null) designation.declaration.transform<FirElement, Void?>(applySupertypesTransformer, null)
designation.ensureTargetPhaseIfClass(FirResolvePhase.SUPER_TYPES) designation.ensureTargetPhaseIfClass(FirResolvePhase.SUPER_TYPES)
} }
} }
@@ -8,17 +8,15 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignationWithFile import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignationWithFile
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensurePathPhase import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensurePathPhase
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensureTargetPhase import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensureTargetPhase
import org.jetbrains.kotlin.idea.fir.low.level.api.transformers.FirLazyTransformerForIDE.Companion.ensureTargetPhaseIfClass import org.jetbrains.kotlin.idea.fir.low.level.api.util.ensureTargetPhaseIfClass
internal class FirDesignatedTypeResolverTransformerForIDE( internal class FirDesignatedTypeResolverTransformerForIDE(
private val designation: FirDeclarationDesignationWithFile, private val designation: FirDeclarationUntypedDesignationWithFile,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
) : FirLazyTransformerForIDE, FirTypeResolveTransformer(session, scopeSession) { ) : FirLazyTransformerForIDE, FirTypeResolveTransformer(session, scopeSession) {
@@ -5,32 +5,12 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.transformers package org.jetbrains.kotlin.idea.fir.low.level.api.transformers
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
internal interface FirLazyTransformerForIDE { internal interface FirLazyTransformerForIDE {
fun transformDeclaration() fun transformDeclaration()
companion object { companion object {
val EMPTY = object : FirLazyTransformerForIDE { val DUMMY = object : FirLazyTransformerForIDE {
override fun transformDeclaration() = Unit override fun transformDeclaration() = Unit
} }
fun FirDeclarationDesignation.ensurePathPhase(firResolvePhase: FirResolvePhase) {
toSequence(includeTarget = false).forEach { firDeclaration ->
check(firDeclaration.resolvePhase >= firResolvePhase) {
"Designation element phase required to be $firResolvePhase but element resolved to ${firDeclaration.resolvePhase}"
}
}
}
fun FirDeclarationDesignation.ensureTargetPhase(firResolvePhase: FirResolvePhase) =
check(declaration.resolvePhase >= firResolvePhase) { "Expected $firResolvePhase but found ${declaration.resolvePhase}" }
fun FirDeclarationDesignation.ensureTargetPhaseIfClass(firResolvePhase: FirResolvePhase) = when (declaration) {
is FirProperty, is FirSimpleFunction -> Unit
is FirClass<*>, is FirTypeAlias -> ensureTargetPhase(firResolvePhase)
else -> error("Unexpected target")
}
} }
} }
@@ -9,11 +9,12 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.transformers.FirAbstractPhaseTransformer import org.jetbrains.kotlin.fir.resolve.transformers.FirAbstractPhaseTransformer
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignation
internal class IDEDeclarationTransformer(private val designation: FirDeclarationDesignation) { internal class IDEDeclarationTransformer(private val designation: FirDeclarationUntypedDesignation) {
private val designationWithoutTargetIterator = designation.toSequence(includeTarget = false).iterator() private val designationWithoutTargetIterator = designation.toSequence(includeTarget = false).iterator()
private var isInsideTargetDeclaration: Boolean = false private var isInsideTargetDeclaration: Boolean = false
private var designationPassed: Boolean = false
inline fun <K, D> transformDeclarationContent( inline fun <K, D> transformDeclarationContent(
transformer: FirAbstractPhaseTransformer<D>, transformer: FirAbstractPhaseTransformer<D>,
@@ -21,11 +22,12 @@ internal class IDEDeclarationTransformer(private val designation: FirDeclaration
data: D, data: D,
defaultCallTransform: () -> K defaultCallTransform: () -> K
): K { ): K {
//It means that we are inside the target declaration
if (isInsideTargetDeclaration) { if (isInsideTargetDeclaration) {
return defaultCallTransform() return defaultCallTransform()
} }
//It means that we already transform target declaration and now can skip all others
if (designationPassed) { if (designationPassed) {
return declaration return declaration
} }
@@ -46,7 +48,6 @@ internal class IDEDeclarationTransformer(private val designation: FirDeclaration
} }
val needReplacePhase: Boolean get() = isInsideTargetDeclaration val needReplacePhase: Boolean get() = isInsideTargetDeclaration
private var designationPassed: Boolean = false
fun ensureDesignationPassed() { fun ensureDesignationPassed() {
check(designationPassed) { "Designation not passed for declaration ${designation.declaration::class.simpleName}" } check(designationPassed) { "Designation not passed for declaration ${designation.declaration::class.simpleName}" }
@@ -0,0 +1,28 @@
/*
* 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.util
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignation
internal fun FirDeclarationUntypedDesignation.ensurePathPhase(firResolvePhase: FirResolvePhase) {
toSequence(includeTarget = false).forEach { firDeclaration ->
check(firDeclaration.resolvePhase >= firResolvePhase) {
"Designation element phase required to be $firResolvePhase but element resolved to ${firDeclaration.resolvePhase}"
}
}
}
internal fun FirDeclarationUntypedDesignation.ensureTargetPhase(firResolvePhase: FirResolvePhase) =
check(declaration.resolvePhase >= firResolvePhase) { "Expected $firResolvePhase but found ${declaration.resolvePhase}" }
internal fun FirDeclarationUntypedDesignation.ensureTargetPhaseIfClass(firResolvePhase: FirResolvePhase) = when (declaration) {
is FirProperty, is FirSimpleFunction -> Unit
is FirClass<*>, is FirTypeAlias -> ensureTargetPhase(firResolvePhase)
else -> error("Unexpected target")
}
internal fun FirDeclarationUntypedDesignation.targetContainingDeclaration(): FirDeclaration? = path.lastOrNull()
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.session.FirSessionFactory import org.jetbrains.kotlin.fir.session.FirSessionFactory
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirDeclarationUntypedDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.RawFirNonLocalDeclarationBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.RawFirNonLocalDeclarationBuilder
import org.jetbrains.kotlin.parsing.KotlinParserDefinition import org.jetbrains.kotlin.parsing.KotlinParserDefinition
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -58,26 +60,26 @@ abstract class AbstractPartialRawFirBuilderTestCase : KtParsingTestCase(
} }
private class DesignationBuilder(private val elementToBuild: KtDeclaration) : FirVisitorVoid() { private class DesignationBuilder(private val elementToBuild: KtDeclaration) : FirVisitorVoid() {
val designation = mutableListOf<FirDeclaration>() private val path = mutableListOf<FirDeclaration>()
var originalDeclaration: FirDeclaration? = null var resultDesignation: FirDeclarationUntypedDesignation? = null
var built = false private set
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement) {
if (built) return if (resultDesignation != null) return
when (element) { when (element) {
is FirSimpleFunction, is FirProperty -> { is FirSimpleFunction, is FirProperty -> {
if (element.psi == elementToBuild) { if (element.psi == elementToBuild) {
originalDeclaration = element as FirDeclaration val originalDeclaration = element as FirDeclaration
built = true resultDesignation = FirDeclarationDesignation(path, originalDeclaration, false)
} else { } else {
element.acceptChildren(this) element.acceptChildren(this)
} }
} }
is FirRegularClass -> { is FirRegularClass -> {
designation.add(element) path.add(element)
element.acceptChildren(this) element.acceptChildren(this)
if (!built) { if (resultDesignation == null) {
designation.removeLast() path.removeLast()
} }
} }
else -> { else -> {
@@ -114,10 +116,10 @@ abstract class AbstractPartialRawFirBuilderTestCase : KtParsingTestCase(
klass: FirClass<*>, klass: FirClass<*>,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope? = ): FirScope =
error("Should not be called") error("Should not be called")
override fun getNestedClassifierScope(klass: FirClass<*>, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? = override fun getNestedClassifierScope(klass: FirClass<*>, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope =
error("Should not be called") error("Should not be called")
} }
@@ -127,12 +129,13 @@ abstract class AbstractPartialRawFirBuilderTestCase : KtParsingTestCase(
val designationBuilder = DesignationBuilder(elementToBuild) val designationBuilder = DesignationBuilder(elementToBuild)
original.accept(designationBuilder) original.accept(designationBuilder)
TestCase.assertTrue(designationBuilder.built) val designation = designationBuilder.resultDesignation
TestCase.assertTrue(designation != null)
val firElement = RawFirNonLocalDeclarationBuilder.build( val firElement = RawFirNonLocalDeclarationBuilder.build(
session, session,
scopeProvider, scopeProvider,
designationBuilder.designation, designation!!,
elementToBuild elementToBuild
) )