diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt index 1c0f3bb262d..efdc70ba13c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt @@ -53,6 +53,7 @@ internal class KtSymbolByFirBuilder private constructor( val rootSession: FirSession = resolveState.rootModuleSession val classifierBuilder = ClassifierSymbolBuilder() + val functionLikeBuilder = FunctionLikeSymbolBuilder() constructor( resolveState: FirModuleResolveState, @@ -100,7 +101,7 @@ internal class KtSymbolByFirBuilder private constructor( return when (fir) { is FirValueParameter -> buildParameterSymbol(fir) is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir) - is FirFunction<*> -> buildFunctionLikeSymbol(fir) + is FirFunction<*> -> functionLikeSymbolBuilder.buildFunctionLikeSymbol(fir) is FirVariable<*> -> buildVariableLikeSymbol(fir) else -> error("Unexpected ${fir::class.simpleName}") } @@ -116,28 +117,6 @@ internal class KtSymbolByFirBuilder private constructor( fun buildFirConstructorParameter(fir: FirValueParameter) = symbolsCache.cache(fir) { KtFirConstructorValueParameterSymbol(fir, resolveState, token, this) } - fun buildFunctionLikeSymbol(fir: FirFunction<*>): KtFunctionLikeSymbol { - return when (fir) { - is FirSimpleFunction -> buildFunctionSymbol(fir) - is FirConstructor -> buildConstructorSymbol(fir) - is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir) - else -> error("Unexpected ${fir::class.simpleName}") - } - } - - fun buildFunctionSymbol(fir: FirSimpleFunction): KtFirFunctionSymbol { - return symbolsCache.cache(fir) { KtFirFunctionSymbol(fir, resolveState, token, this) } - } - - fun buildAnonymousFunctionSymbol(fir: FirAnonymousFunction): KtFirAnonymousFunctionSymbol { - return symbolsCache.cache(fir) { KtFirAnonymousFunctionSymbol(fir, resolveState, token, this) } - } - - fun buildConstructorSymbol(fir: FirConstructor): KtFirConstructorSymbol { - val originalFir = fir.originalConstructorIfTypeAlias ?: fir - return symbolsCache.cache(originalFir) { KtFirConstructorSymbol(originalFir, resolveState, token, this) } - } - // todo handle cases fun buildFieldSymbol(fir: FirField): KtFirJavaFieldSymbol { @@ -285,6 +264,32 @@ internal class KtSymbolByFirBuilder private constructor( return buildClassLikeSymbol(firClassLikeSymbol.fir) } } + + inner class FunctionLikeSymbolBuilder { + fun buildFunctionLikeSymbol(fir: FirFunction<*>): KtFunctionLikeSymbol { + return when (fir) { + is FirSimpleFunction -> buildFunctionSymbol(fir) + is FirConstructor -> buildConstructorSymbol(fir) + is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir) + else -> error("Unexpected ${fir::class.simpleName}") + } + } + + fun buildFunctionSymbol(fir: FirSimpleFunction): KtFirFunctionSymbol { + return symbolsCache.cache(fir) { KtFirFunctionSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + + fun buildAnonymousFunctionSymbol(fir: FirAnonymousFunction): KtFirAnonymousFunctionSymbol { + return symbolsCache.cache(fir) { KtFirAnonymousFunctionSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + + fun buildConstructorSymbol(fir: FirConstructor): KtFirConstructorSymbol { + val originalFir = fir.originalConstructorIfTypeAlias ?: fir + return symbolsCache.cache(originalFir) { + KtFirConstructorSymbol(originalFir, resolveState, token, this@KtSymbolByFirBuilder) + } + } + } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt index c87b9e12a3d..b4999130a03 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt @@ -64,7 +64,7 @@ internal fun FirScope.getCallableSymbols(callableNames: Collection, builde callableNames.forEach { name -> val callables = mutableListOf() processFunctionsByName(name) { firSymbol -> - callables.add(builder.buildFunctionSymbol(firSymbol.fir)) + callables.add(builder.functionLikeBuilder.buildFunctionSymbol(firSymbol.fir)) } processPropertiesByName(name) { firSymbol -> val symbol = when { @@ -94,7 +94,7 @@ internal fun FirScope.getConstructors(builder: KtSymbolByFirBuilder): Sequence() processDeclaredConstructors { firSymbol -> - constructorSymbols.add(builder.buildConstructorSymbol(firSymbol.fir)) + constructorSymbols.add(builder.functionLikeBuilder.buildConstructorSymbol(firSymbol.fir)) } yieldAll(constructorSymbols) } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt index c668bd8024e..826de4ac1cc 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt @@ -45,13 +45,13 @@ internal class KtFirSymbolProvider( override fun getFunctionSymbol(psi: KtNamedFunction): KtFunctionSymbol = withValidityAssertion { psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildFunctionSymbol(it) + firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(it) } } override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion { psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildConstructorSymbol(it) + firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(it) } } @@ -75,14 +75,14 @@ internal class KtFirSymbolProvider( override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion { psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildFunctionSymbol(it) + firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(it) } - firSymbolBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType(resolveState)) + firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getAnonymousFunctionSymbol(psi: KtLambdaExpression): KtAnonymousFunctionSymbol = withValidityAssertion { psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildAnonymousFunctionSymbol(it) + firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(it) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt index 2d3a26a91be..a02fa8a5878 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt @@ -24,7 +24,7 @@ internal class KtFirConstructorSymbolPointer( ): KtConstructorSymbol? { val firConstructor = candidates.findDeclarationWithSignature(signature, firSession) ?: return null if (firConstructor.isPrimary != isPrimary) return null - return firSymbolBuilder.buildConstructorSymbol(firConstructor) + return firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(firConstructor) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt index 105c64babef..c4ec6824e5f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt @@ -22,7 +22,7 @@ internal class KtFirMemberFunctionSymbolPointer( firSession: FirSession ): KtFunctionSymbol? { val firFunction = candidates.findDeclarationWithSignature(signature, firSession) ?: return null - return firSymbolBuilder.buildFunctionSymbol(firFunction) + return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirCollectionLiteralReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirCollectionLiteralReference.kt index d45f6482c6b..d223b2e530f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirCollectionLiteralReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirCollectionLiteralReference.kt @@ -5,15 +5,12 @@ package org.jetbrains.kotlin.idea.references -import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.expressions.FirArrayOfCall import org.jetbrains.kotlin.fir.resolve.symbolProvider -import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType -import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.coneTypeSafe import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirSafe import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession @@ -42,7 +39,7 @@ class KtFirCollectionLiteralReference( */ (it as? FirFunctionSymbol<*>)?.fir?.valueParameters?.singleOrNull()?.isVararg == true }?.fir as? FirSimpleFunction ?: return null - return firSymbolBuilder.buildFunctionSymbol(fir) + return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(fir) } companion object {