diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt index 7ffc2663f2a..dcd9b19457e 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt @@ -160,7 +160,7 @@ private object FirToKtConversionCreator { KtType::class.createType() ), FirPropertySymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.buildVariableSymbol({0}.fir as FirProperty)", + "firSymbolBuilder.variableLikeBuilder.buildVariableSymbol({0}.fir as FirProperty)", KtVariableSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirProperty") ), 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 efdc70ba13c..cd7130fd0a4 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 @@ -54,6 +54,7 @@ internal class KtSymbolByFirBuilder private constructor( val classifierBuilder = ClassifierSymbolBuilder() val functionLikeBuilder = FunctionLikeSymbolBuilder() + val variableLikeBuilder = VariableLikeSymbolBuilder() constructor( resolveState: FirModuleResolveState, @@ -99,29 +100,13 @@ internal class KtSymbolByFirBuilder private constructor( fun buildCallableSymbol(fir: FirCallableDeclaration<*>): KtCallableSymbol { return when (fir) { - is FirValueParameter -> buildParameterSymbol(fir) is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir) is FirFunction<*> -> functionLikeSymbolBuilder.buildFunctionLikeSymbol(fir) - is FirVariable<*> -> buildVariableLikeSymbol(fir) + is FirVariable<*> -> variableLikeSymbolBuilder.buildVariableLikeSymbol(fir) else -> error("Unexpected ${fir::class.simpleName}") } } - // TODO it can be a constructor parameter, which may be split into parameter & property - // we should handle them both - fun buildParameterSymbol(fir: FirValueParameter) = - symbolsCache.cache(fir) { KtFirFunctionValueParameterSymbol(fir, resolveState, token, this) } - - - - fun buildFirConstructorParameter(fir: FirValueParameter) = - symbolsCache.cache(fir) { KtFirConstructorValueParameterSymbol(fir, resolveState, token, this) } - - - // todo handle cases - fun buildFieldSymbol(fir: FirField): KtFirJavaFieldSymbol { - return symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this) } - } fun buildPropertyAccessorSymbol(fir: FirPropertyAccessor): KtPropertyAccessorSymbol { return when { @@ -142,25 +127,6 @@ internal class KtSymbolByFirBuilder private constructor( fun buildFileSymbol(fir: FirFile) = filesCache.cache(fir) { KtFirFileSymbol(fir, resolveState, token) } - fun buildVariableLikeSymbol(fir: FirVariable<*>): KtVariableLikeSymbol { - return when (fir) { - is FirProperty -> buildVariableSymbol(fir) - is FirValueParameter -> buildParameterSymbol(fir) - is FirField -> buildFieldSymbol(fir) - is FirEnumEntry -> buildEnumEntrySymbol(fir) // TODO enum entry should not be callable - else -> error("Unexpected ${fir::class.simpleName}") - } - } - - fun buildVariableSymbol(fir: FirProperty): KtVariableSymbol { - return symbolsCache.cache(fir) { - when { - fir.isLocal -> KtFirLocalVariableSymbol(fir, resolveState, token, this) - fir is FirSyntheticProperty -> KtFirSyntheticJavaPropertySymbol(fir, resolveState, token, this) - else -> KtFirKotlinPropertySymbol(fir, resolveState, token, this) - } - } - } fun createPackageSymbolIfOneExists(packageFqName: FqName): KtFirPackageSymbol? { val exists = PackageIndexUtil.packageExists(packageFqName, GlobalSearchScope.allScope(project), project) @@ -290,6 +256,53 @@ internal class KtSymbolByFirBuilder private constructor( } } } + + inner class VariableLikeSymbolBuilder { + fun buildVariableLikeSymbol(fir: FirVariable<*>): KtVariableLikeSymbol { + return when (fir) { + is FirProperty -> buildVariableSymbol(fir) + is FirValueParameter -> buildParameterSymbol(fir) + is FirField -> buildFieldSymbol(fir) + is FirEnumEntry -> buildEnumEntrySymbol(fir) // TODO enum entry should not be callable + else -> error("Unexpected ${fir::class.simpleName}") + } + } + + //TODO separate to functions + fun buildVariableSymbol(fir: FirProperty): KtVariableSymbol { + return symbolsCache.cache(fir) { + when { + fir.isLocal -> KtFirLocalVariableSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + fir is FirSyntheticProperty -> KtFirSyntheticJavaPropertySymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + else -> KtFirKotlinPropertySymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + } + } + } + + fun buildParameterSymbol(fir: FirValueParameter): KtParameterSymbol { + @Suppress("IntroduceWhenSubject") + return when { + fir.isConstructorParameter == true -> buildConstructorParameterSymbol(fir) + else -> buildFunctionParameterSymbol(fir) + } + } + + fun buildConstructorParameterSymbol(fir: FirValueParameter): KtFirConstructorValueParameterSymbol { + require(fir.isConstructorParameter == true) + return symbolsCache.cache(fir) { KtFirConstructorValueParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + + fun buildFunctionParameterSymbol(fir: FirValueParameter): KtFirFunctionParameterSymbol { + require(fir.isConstructorParameter != true) + return symbolsCache.cache(fir) { KtFirFunctionParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + + + // todo handle cases + fun buildFieldSymbol(fir: FirField): KtFirJavaFieldSymbol { + return symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 58c8517a3dc..822dd9b5dfb 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -1217,14 +1217,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.UNINITIALIZED_VARIABLE) { firDiagnostic -> UninitializedVariableImpl( - firSymbolBuilder.buildVariableSymbol(firDiagnostic.a.fir as FirProperty), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir as FirProperty), firDiagnostic as FirPsiDiagnostic<*>, token, ) } add(FirErrors.VAL_REASSIGNMENT) { firDiagnostic -> ValReassignmentImpl( - firSymbolBuilder.buildVariableSymbol(firDiagnostic.a.fir as FirProperty), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir as FirProperty), firDiagnostic as FirPsiDiagnostic<*>, token, ) 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 b4999130a03..f5dc89000bc 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 @@ -69,7 +69,7 @@ internal fun FirScope.getCallableSymbols(callableNames: Collection, builde processPropertiesByName(name) { firSymbol -> val symbol = when { firSymbol is FirPropertySymbol && firSymbol.fir.isSubstitutionOverride -> { - builder.buildVariableSymbol(firSymbol.fir) + builder.variableLikeBuilder.buildVariableSymbol(firSymbol.fir) } else -> builder.buildCallableSymbol(firSymbol.fir) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt index 00783235d98..2d92b9d445d 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt @@ -36,7 +36,7 @@ internal class KtFirAnonymousFunctionSymbol( override val valueParameters: List by firRef.withFirAndCache { fir -> fir.valueParameters.map { valueParameter -> - builder.buildParameterSymbol(valueParameter) + builder.variableLikeBuilder.buildParameterSymbol(valueParameter) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt index 80789d8400f..b919b5bc443 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt @@ -50,7 +50,7 @@ internal class KtFirConstructorSymbol( override val valueParameters: List by firRef.withFirAndCache { fir -> fir.valueParameters.map { valueParameter -> - builder.buildFirConstructorParameter(valueParameter) + builder.variableLikeBuilder.buildConstructorParameterSymbol(valueParameter) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt index 50e1f99f3db..08e1564b4fd 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt @@ -45,7 +45,7 @@ internal class KtFirFunctionSymbol( } override val valueParameters: List by firRef.withFirAndCache { fir -> fir.valueParameters.map { valueParameter -> - builder.buildParameterSymbol(valueParameter) + builder.variableLikeBuilder.buildFunctionParameterSymbol(valueParameter) } } override val typeParameters by firRef.withFirAndCache { fir -> diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt index 97cb3f3f20c..7a7ea0060b3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt @@ -53,7 +53,7 @@ internal class KtFirPropertySetterSymbol( override val annotationClassIds: Collection by cached { firRef.getAnnotationClassIds() } override val parameter: KtFunctionParameterSymbol by firRef.withFirAndCache { fir -> - builder.buildFunctionParameterSymbol(fir.valueParameters.single()) + builder.variableLikeBuilder.buildFunctionParameterSymbol(fir.valueParameters.single()) } override val annotatedType: KtTypeAndAnnotations by cached { 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 826de4ac1cc..2d78542e443 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 @@ -35,7 +35,7 @@ internal class KtFirSymbolProvider( override fun getParameterSymbol(psi: KtParameter): KtParameterSymbol = withValidityAssertion { psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildParameterSymbol(it) + firSymbolBuilder.variableLikeBuilder.buildParameterSymbol(it) } } @@ -88,7 +88,7 @@ internal class KtFirSymbolProvider( override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol = withValidityAssertion { psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildVariableSymbol(it) + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(it) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt index a2b7f08c563..a637d0f20ad 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt @@ -22,7 +22,7 @@ internal class KtFirMemberPropertySymbolPointer( firSession: FirSession ): KtPropertySymbol? { val firProperty = candidates.findDeclarationWithSignature(signature, firSession) ?: return null - return firSymbolBuilder.buildVariableSymbol(firProperty) as? KtPropertySymbol + return firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firProperty) as? KtPropertySymbol } }