FIR IDE: extract function-like symbol building from KtSymbolByFirBuilder
This commit is contained in:
+28
-23
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+2
-2
@@ -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)
|
||||
}
|
||||
+5
-5
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-4
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user