From 129b930bd79bb357465cbe4821e792f9c383ddc1 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Fri, 21 Jul 2023 15:57:50 +0200 Subject: [PATCH] [FIR] Implement NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE diagnostic #KT-59398 Fixed --- .../api/fir/diagnostics/KtFirDataClassConverters.kt | 7 +++++++ .../analysis/api/fir/diagnostics/KtFirDiagnostics.kt | 5 +++++ .../api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 6 ++++++ .../generator/diagnostics/FirDiagnosticsList.kt | 4 ++++ .../kotlin/fir/analysis/diagnostics/FirErrors.kt | 1 + .../declaration/FirInlineDeclarationChecker.kt | 11 +++++++---- .../analysis/diagnostics/FirErrorsDefaultMessages.kt | 6 ++++++ .../inlineLambdaInDefaultInlineParameter.fir.kt | 8 ++++---- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index ca1bebd6154..a271f3516ff 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4413,6 +4413,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE) { firDiagnostic -> + NotSupportedInlineParameterInInlineParameterDefaultValueImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.REIFIED_TYPE_PARAMETER_IN_OVERRIDE) { firDiagnostic -> ReifiedTypeParameterInOverrideImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index aa88cef8c1d..88d4e67f1d5 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -3079,6 +3079,11 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val parameter: KtSymbol } + interface NotSupportedInlineParameterInInlineParameterDefaultValue : KtFirDiagnostic { + override val diagnosticClass get() = NotSupportedInlineParameterInInlineParameterDefaultValue::class + val parameter: KtSymbol + } + interface ReifiedTypeParameterInOverride : KtFirDiagnostic { override val diagnosticClass get() = ReifiedTypeParameterInOverride::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 745d8bcf9c3..cb25869ed7b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3713,6 +3713,12 @@ internal class InvalidDefaultFunctionalParameterForInlineImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InvalidDefaultFunctionalParameterForInline +internal class NotSupportedInlineParameterInInlineParameterDefaultValueImpl( + override val parameter: KtSymbol, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.NotSupportedInlineParameterInInlineParameterDefaultValue + internal class ReifiedTypeParameterInOverrideImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 825d6edda5b..eaa92842422 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1544,6 +1544,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("parameter") } + val NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE by error { + parameter("parameter") + } + val REIFIED_TYPE_PARAMETER_IN_OVERRIDE by error(PositioningStrategy.REIFIED_MODIFIER) val INLINE_PROPERTY_WITH_BACKING_FIELD by error(PositioningStrategy.DECLARATION_SIGNATURE) diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 7e149aea159..45536238ce0 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -780,6 +780,7 @@ object FirErrors { val OVERRIDE_BY_INLINE by warning0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val NON_INTERNAL_PUBLISHED_API by error0() val INVALID_DEFAULT_FUNCTIONAL_PARAMETER_FOR_INLINE by error1() + val NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE by error1() val REIFIED_TYPE_PARAMETER_IN_OVERRIDE by error0(SourceElementPositioningStrategies.REIFIED_MODIFIER) val INLINE_PROPERTY_WITH_BACKING_FIELD by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val ILLEGAL_INLINE_PARAMETER_MODIFIER by error0(SourceElementPositioningStrategies.INLINE_PARAMETER_MODIFIER) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt index 2b0c1ec459b..a8bbc451d1c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt @@ -52,7 +52,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { class InlineFunctionBodyContext( val inlineFunction: FirFunction, private val inlineFunEffectiveVisibility: EffectiveVisibility, - private val inalienableParameters: List, + private val inlinableParameters: List, val session: FirSession, ) : FirDefaultVisitor() { private val isEffectivelyPrivateApiFunction: Boolean = inlineFunEffectiveVisibility.privateApi @@ -137,7 +137,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { val argument = wrappedArgument.unwrapArgument() val resolvedArgumentSymbol = argument.toResolvedCallableSymbol() as? FirVariableSymbol<*> ?: continue - val valueParameterOfOriginalInlineFunction = inalienableParameters.firstOrNull { it == resolvedArgumentSymbol } + val valueParameterOfOriginalInlineFunction = inlinableParameters.firstOrNull { it == resolvedArgumentSymbol } if (valueParameterOfOriginalInlineFunction != null) { val factory = when { calledFunctionSymbol.isInline -> when { @@ -163,7 +163,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { reporter: DiagnosticReporter, ) { val receiverSymbol = receiverExpression.toResolvedCallableSymbol() ?: return - if (receiverSymbol in inalienableParameters) { + if (receiverSymbol in inlinableParameters) { if (!isInvokeOrInlineExtension(targetSymbol)) { reporter.reportOn( receiverExpression.source ?: qualifiedAccessExpression.source, @@ -192,10 +192,13 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { val source = qualifiedAccess.source ?: return if (targetSymbol !is FirCallableSymbol<*>) return - if (targetSymbol in inalienableParameters) { + if (targetSymbol in inlinableParameters) { if (!qualifiedAccess.partOfCall(context)) { reporter.reportOn(source, FirErrors.USAGE_IS_NOT_INLINABLE, targetSymbol, context) } + if (context.containingDeclarations.any { it.symbol in inlinableParameters }) { + reporter.reportOn(source, FirErrors.NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE, targetSymbol as FirValueParameterSymbol, context) + } } checkVisibilityAndAccess(qualifiedAccess, targetSymbol, source, context, reporter) checkRecursion(targetSymbol, source, context, reporter) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index dfb39f6ada8..de7ba59041a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -394,6 +394,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_A_MULTIPLATFO import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_A_SUPERTYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_NULL_ASSERTION_ON_CALLABLE_REFERENCE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_NULL_ASSERTION_ON_LAMBDA_EXPRESSION +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_YET_SUPPORTED_IN_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NO_ACTUAL_FOR_EXPECT @@ -1380,6 +1381,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { "Invalid default value for inline function parameter. Only lambdas, anonymous functions, and callable references are supported", DECLARATION_NAME ) + map.put( + NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE, + "Usage of inline parameter ''{0}'' in default value of inline parameter is not supported.", + DECLARATION_NAME + ) map.put( SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_VALUE_CLASS, "Secondary constructors with bodies are reserved for future releases" diff --git a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.fir.kt b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.fir.kt index 8dbb09415e4..4d0fe451b8d 100644 --- a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.fir.kt @@ -6,21 +6,21 @@ inline fun inlineFun(lambda: () -> String) = lambda() fun noInlineFun(lambda: () -> String) = lambda() -inline fun default0_1(lambda: () -> String, dlambda: () -> String = { lambda; "OK" }) { +inline fun default0_1(lambda: () -> String, dlambda: () -> String = { lambda; "OK" }) { lambda() + dlambda() } -inline fun default0_2(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { +inline fun default0_2(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { lambda() + dlambda() } -inline fun default0(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { +inline fun default0(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { lambda() + dlambda() } -inline fun default1_0(lambda: () -> String, dlambda: () -> String = { lambda() }) { +inline fun default1_0(lambda: () -> String, dlambda: () -> String = { lambda() }) { lambda() + dlambda() }