FIR IDE: extract function-like symbol building from KtSymbolByFirBuilder

This commit is contained in:
Ilya Kirillov
2021-03-12 18:18:02 +01:00
parent db64884bd0
commit bafc61b56f
6 changed files with 38 additions and 36 deletions
@@ -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)
}
}
}
}
@@ -64,7 +64,7 @@ internal fun FirScope.getCallableSymbols(callableNames: Collection<Name>, builde
callableNames.forEach { name ->
val callables = mutableListOf<KtCallableSymbol>()
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<K
sequence {
val constructorSymbols = mutableListOf<KtConstructorSymbol>()
processDeclaredConstructors { firSymbol ->
constructorSymbols.add(builder.buildConstructorSymbol(firSymbol.fir))
constructorSymbols.add(builder.functionLikeBuilder.buildConstructorSymbol(firSymbol.fir))
}
yieldAll(constructorSymbols)
}
@@ -45,13 +45,13 @@ internal class KtFirSymbolProvider(
override fun getFunctionSymbol(psi: KtNamedFunction): KtFunctionSymbol = withValidityAssertion {
psi.withFirDeclarationOfType<FirSimpleFunction, KtFunctionSymbol>(resolveState) {
firSymbolBuilder.buildFunctionSymbol(it)
firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(it)
}
}
override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion {
psi.withFirDeclarationOfType<FirConstructor, KtConstructorSymbol>(resolveState) {
firSymbolBuilder.buildConstructorSymbol(it)
firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(it)
}
}
@@ -75,14 +75,14 @@ internal class KtFirSymbolProvider(
override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion {
psi.withFirDeclarationOfType<FirSimpleFunction, KtFunctionSymbol>(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<FirAnonymousFunction, KtAnonymousFunctionSymbol>(resolveState) {
firSymbolBuilder.buildAnonymousFunctionSymbol(it)
firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(it)
}
}
@@ -24,7 +24,7 @@ internal class KtFirConstructorSymbolPointer(
): KtConstructorSymbol? {
val firConstructor = candidates.findDeclarationWithSignature<FirConstructor>(signature, firSession) ?: return null
if (firConstructor.isPrimary != isPrimary) return null
return firSymbolBuilder.buildConstructorSymbol(firConstructor)
return firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(firConstructor)
}
}
@@ -22,7 +22,7 @@ internal class KtFirMemberFunctionSymbolPointer(
firSession: FirSession
): KtFunctionSymbol? {
val firFunction = candidates.findDeclarationWithSignature<FirSimpleFunction>(signature, firSession) ?: return null
return firSymbolBuilder.buildFunctionSymbol(firFunction)
return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction)
}
}
@@ -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 {