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 8f01f3816e0..8afd37a2dd7 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 @@ -4544,6 +4544,18 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.DECLARATION_CANT_BE_INLINED_DEPRECATION.errorFactory) { firDiagnostic -> + DeclarationCantBeInlinedDeprecationErrorImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirErrors.DECLARATION_CANT_BE_INLINED_DEPRECATION.warningFactory) { firDiagnostic -> + DeclarationCantBeInlinedDeprecationWarningImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.OVERRIDE_BY_INLINE) { firDiagnostic -> OverrideByInlineImpl( firDiagnostic as KtPsiDiagnostic, @@ -4582,6 +4594,18 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.INLINE_PROPERTY_WITH_BACKING_FIELD_DEPRECATION.errorFactory) { firDiagnostic -> + InlinePropertyWithBackingFieldDeprecationErrorImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirErrors.INLINE_PROPERTY_WITH_BACKING_FIELD_DEPRECATION.warningFactory) { firDiagnostic -> + InlinePropertyWithBackingFieldDeprecationWarningImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.ILLEGAL_INLINE_PARAMETER_MODIFIER) { firDiagnostic -> IllegalInlineParameterModifierImpl( 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 d181ebe6ff6..a269b0a0cee 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 @@ -3173,6 +3173,14 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = DeclarationCantBeInlined::class } + interface DeclarationCantBeInlinedDeprecationError : KtFirDiagnostic { + override val diagnosticClass get() = DeclarationCantBeInlinedDeprecationError::class + } + + interface DeclarationCantBeInlinedDeprecationWarning : KtFirDiagnostic { + override val diagnosticClass get() = DeclarationCantBeInlinedDeprecationWarning::class + } + interface OverrideByInline : KtFirDiagnostic { override val diagnosticClass get() = OverrideByInline::class } @@ -3199,6 +3207,14 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = InlinePropertyWithBackingField::class } + interface InlinePropertyWithBackingFieldDeprecationError : KtFirDiagnostic { + override val diagnosticClass get() = InlinePropertyWithBackingFieldDeprecationError::class + } + + interface InlinePropertyWithBackingFieldDeprecationWarning : KtFirDiagnostic { + override val diagnosticClass get() = InlinePropertyWithBackingFieldDeprecationWarning::class + } + interface IllegalInlineParameterModifier : KtFirDiagnostic { override val diagnosticClass get() = IllegalInlineParameterModifier::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 d64e1e16ca9..d869c7fd5cf 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 @@ -3826,6 +3826,16 @@ internal class DeclarationCantBeInlinedImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DeclarationCantBeInlined +internal class DeclarationCantBeInlinedDeprecationErrorImpl( + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DeclarationCantBeInlinedDeprecationError + +internal class DeclarationCantBeInlinedDeprecationWarningImpl( + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DeclarationCantBeInlinedDeprecationWarning + internal class OverrideByInlineImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, @@ -3858,6 +3868,16 @@ internal class InlinePropertyWithBackingFieldImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InlinePropertyWithBackingField +internal class InlinePropertyWithBackingFieldDeprecationErrorImpl( + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InlinePropertyWithBackingFieldDeprecationError + +internal class InlinePropertyWithBackingFieldDeprecationWarningImpl( + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InlinePropertyWithBackingFieldDeprecationWarning + internal class IllegalInlineParameterModifierImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index f0d9ad8881a..2641ad56753 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -507,6 +507,18 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/initializedAfterRethrow.kt"); } + @Test + @TestMetadata("inlineConstructorParameter.kt") + public void testInlineConstructorParameter() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter.kt"); + } + + @Test + @TestMetadata("inlineConstructorParameter_on.kt") + public void testInlineConstructorParameter_on() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter_on.kt"); + } + @Test @TestMetadata("inlineDeprecationsOnImplicitCalls.kt") public void testInlineDeprecationsOnImplicitCalls() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index a443cabddc2..ae8f656b57e 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -507,6 +507,18 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/initializedAfterRethrow.kt"); } + @Test + @TestMetadata("inlineConstructorParameter.kt") + public void testInlineConstructorParameter() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter.kt"); + } + + @Test + @TestMetadata("inlineConstructorParameter_on.kt") + public void testInlineConstructorParameter_on() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter_on.kt"); + } + @Test @TestMetadata("inlineDeprecationsOnImplicitCalls.kt") public void testInlineDeprecationsOnImplicitCalls() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 427a1ac0d48..785ef0e59c9 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -507,6 +507,18 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/initializedAfterRethrow.kt"); } + @Test + @TestMetadata("inlineConstructorParameter.kt") + public void testInlineConstructorParameter() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter.kt"); + } + + @Test + @TestMetadata("inlineConstructorParameter_on.kt") + public void testInlineConstructorParameter_on() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter_on.kt"); + } + @Test @TestMetadata("inlineDeprecationsOnImplicitCalls.kt") public void testInlineDeprecationsOnImplicitCalls() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 6b274a35640..6700cd4b434 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -507,6 +507,18 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/initializedAfterRethrow.kt"); } + @Test + @TestMetadata("inlineConstructorParameter.kt") + public void testInlineConstructorParameter() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter.kt"); + } + + @Test + @TestMetadata("inlineConstructorParameter_on.kt") + public void testInlineConstructorParameter_on() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter_on.kt"); + } + @Test @TestMetadata("inlineDeprecationsOnImplicitCalls.kt") public void testInlineDeprecationsOnImplicitCalls() throws Exception { 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 a6678df5213..b0f00ad85a9 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 @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.diagnostics.WhenMissingCase import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.* import org.jetbrains.kotlin.fir.declarations.FirFunction -import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol @@ -1600,6 +1599,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { } val DECLARATION_CANT_BE_INLINED by error(PositioningStrategy.INLINE_FUN_MODIFIER) + val DECLARATION_CANT_BE_INLINED_DEPRECATION by deprecationError( + LanguageFeature.ProhibitInlineModifierOnPrimaryConstructorParameters, + PositioningStrategy.INLINE_FUN_MODIFIER, + ) val OVERRIDE_BY_INLINE by warning(PositioningStrategy.DECLARATION_SIGNATURE) @@ -1616,6 +1619,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val REIFIED_TYPE_PARAMETER_IN_OVERRIDE by error(PositioningStrategy.REIFIED_MODIFIER) val INLINE_PROPERTY_WITH_BACKING_FIELD by error(PositioningStrategy.DECLARATION_SIGNATURE) + val INLINE_PROPERTY_WITH_BACKING_FIELD_DEPRECATION by deprecationError( + LanguageFeature.ProhibitInlineModifierOnPrimaryConstructorParameters, + PositioningStrategy.DECLARATION_SIGNATURE, + ) val ILLEGAL_INLINE_PARAMETER_MODIFIER by error(PositioningStrategy.INLINE_PARAMETER_MODIFIER) 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 9f7dd31e099..3a03db23455 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 @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.config.LanguageFeature.ProhibitAssigningSingleElemen import org.jetbrains.kotlin.config.LanguageFeature.ProhibitConfusingSyntaxInWhenBranches import org.jetbrains.kotlin.config.LanguageFeature.ProhibitCyclesInAnnotations import org.jetbrains.kotlin.config.LanguageFeature.ProhibitImplementingVarByInheritedVal +import org.jetbrains.kotlin.config.LanguageFeature.ProhibitInlineModifierOnPrimaryConstructorParameters import org.jetbrains.kotlin.config.LanguageFeature.ProhibitInvisibleAbstractMethodsInSuperclasses import org.jetbrains.kotlin.config.LanguageFeature.ProhibitNonReifiedArraysAsReifiedTypeArguments import org.jetbrains.kotlin.config.LanguageFeature.ProhibitScriptTopLevelInnerClasses @@ -804,12 +805,14 @@ object FirErrors { val PRIVATE_CLASS_MEMBER_FROM_INLINE by error2, FirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val SUPER_CALL_FROM_PUBLIC_INLINE by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val DECLARATION_CANT_BE_INLINED by error0(SourceElementPositioningStrategies.INLINE_FUN_MODIFIER) + val DECLARATION_CANT_BE_INLINED_DEPRECATION by deprecationError0(ProhibitInlineModifierOnPrimaryConstructorParameters, SourceElementPositioningStrategies.INLINE_FUN_MODIFIER) 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 INLINE_PROPERTY_WITH_BACKING_FIELD_DEPRECATION by deprecationError0(ProhibitInlineModifierOnPrimaryConstructorParameters, SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val ILLEGAL_INLINE_PARAMETER_MODIFIER by error0(SourceElementPositioningStrategies.INLINE_PARAMETER_MODIFIER) val INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED by error0() val INEFFICIENT_EQUALS_OVERRIDING_IN_VALUE_CLASS by warning1(SourceElementPositioningStrategies.DECLARATION_NAME) 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 b7721de011b..c6975367d0f 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.builtins.StandardNames.BACKING_FIELD import org.jetbrains.kotlin.builtins.functions.isSuspendOrKSuspendFunction @@ -443,7 +444,10 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { if (effectiveVisibility == EffectiveVisibility.PrivateInClass) return true if (!declaration.isEffectivelyFinal(context)) { - reporter.reportOn(declaration.source, FirErrors.DECLARATION_CANT_BE_INLINED, context) + // For primary constructor parameters there's INLINE_PROPERTY_WITH_BACKING_FIELD already + if (declaration.source?.kind != KtFakeSourceElementKind.PropertyFromParameter) { + reporter.reportOn(declaration.source, FirErrors.DECLARATION_CANT_BE_INLINED, context) + } return false } return true diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlinePropertyChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlinePropertyChecker.kt index 9912f8185fc..49a08989e79 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlinePropertyChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlinePropertyChecker.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors @@ -20,7 +21,14 @@ object FirInlinePropertyChecker : FirPropertyChecker() { FirInlineDeclarationChecker.checkCallableDeclaration(declaration, context, reporter) if (declaration.hasBackingField || declaration.delegate != null) { - reporter.reportOn(declaration.source, FirErrors.INLINE_PROPERTY_WITH_BACKING_FIELD, context) + when (declaration.source?.kind) { + KtFakeSourceElementKind.PropertyFromParameter -> reporter.reportOn( + declaration.source, FirErrors.INLINE_PROPERTY_WITH_BACKING_FIELD_DEPRECATION, context + ) + else -> reporter.reportOn( + declaration.source, FirErrors.INLINE_PROPERTY_WITH_BACKING_FIELD, context + ) + } } } } \ No newline at end of file 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 70a2fdd5a47..700d6510be0 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 @@ -158,6 +158,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DATA_CLASS_VARARG import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DATA_CLASS_WITHOUT_PARAMETERS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DATA_OBJECT_CUSTOM_EQUALS_OR_HASH_CODE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DECLARATION_CANT_BE_INLINED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DECLARATION_CANT_BE_INLINED_DEPRECATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEFAULT_ARGUMENTS_IN_EXPECT_WITH_ACTUAL_TYPEALIAS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEFINITELY_NON_NULLABLE_AS_REIFIED @@ -314,6 +315,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INITIALIZER_REQUI import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INITIALIZER_TYPE_MISMATCH import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_PROPERTY_WITH_BACKING_FIELD +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_PROPERTY_WITH_BACKING_FIELD_DEPRECATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INNER_CLASS_CONSTRUCTOR_NO_RECEIVER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INNER_CLASS_INSIDE_VALUE_CLASS @@ -1470,9 +1472,14 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { DECLARATION_CANT_BE_INLINED, "'inline' modifier on virtual members is prohibited. Only private or final members can be inlined." ) + map.put( + DECLARATION_CANT_BE_INLINED_DEPRECATION, + "'inline' modifier on virtual members is prohibited. Only private or final members can be inlined." + ) map.put(OVERRIDE_BY_INLINE, "Override by an inline function.") map.put(REIFIED_TYPE_PARAMETER_IN_OVERRIDE, "Override by a function with reified type parameter.") map.put(INLINE_PROPERTY_WITH_BACKING_FIELD, "Inline property cannot have a backing field.") + map.put(INLINE_PROPERTY_WITH_BACKING_FIELD_DEPRECATION, "Inline property cannot have a backing field.") // Overrides map.put(NOTHING_TO_OVERRIDE, "''{0}'' overrides nothing.", DECLARATION_NAME) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index c4d76c0df07..4aae191ffa6 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -157,6 +157,7 @@ class ValueParameter( type.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor), modifiers.getVisibility(), symbol, + isInline = modifiers.hasInline(), ).also { it.initContainingClassAttr(context) it.replaceAnnotations(modifiers.annotations.filterUseSiteTarget(PROPERTY_GETTER)) @@ -168,7 +169,8 @@ class ValueParameter( type.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor), modifiers.getVisibility(), symbol, - parameterAnnotations = modifiers.annotations.filterUseSiteTarget(SETTER_PARAMETER) + parameterAnnotations = modifiers.annotations.filterUseSiteTarget(SETTER_PARAMETER), + isInline = modifiers.hasInline(), ).also { it.initContainingClassAttr(context) it.replaceAnnotations(modifiers.annotations.filterUseSiteTarget(PROPERTY_SETTER)) diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt index 4848c7a7fda..949308f1466 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt @@ -722,6 +722,7 @@ open class PsiRawFirBuilder( type.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor), visibility, symbol, + isInline = hasModifier(INLINE_KEYWORD), ).also { getter -> getter.initContainingClassAttr() getter.replaceAnnotations(parameterAnnotations.filterUseSiteTarget(PROPERTY_GETTER)) @@ -733,7 +734,8 @@ open class PsiRawFirBuilder( type.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor), visibility, symbol, - parameterAnnotations = parameterAnnotations.filterUseSiteTarget(SETTER_PARAMETER) + parameterAnnotations = parameterAnnotations.filterUseSiteTarget(SETTER_PARAMETER), + isInline = hasModifier(INLINE_KEYWORD), ).also { setter -> setter.initContainingClassAttr() setter.replaceAnnotations(parameterAnnotations.filterUseSiteTarget(PROPERTY_SETTER)) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt index 48bc731720c..0d3ba737ab6 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt @@ -39,6 +39,7 @@ abstract class FirDefaultPropertyAccessor( visibility: Visibility, modality: Modality = Modality.FINAL, effectiveVisibility: EffectiveVisibility? = null, + isInline: Boolean = false, symbol: FirPropertyAccessorSymbol, resolvePhase: FirResolvePhase, ) : FirPropertyAccessorImpl( @@ -47,10 +48,12 @@ abstract class FirDefaultPropertyAccessor( moduleData, origin, FirDeclarationAttributes(), - status = if (effectiveVisibility == null) - FirDeclarationStatusImpl(visibility, modality) - else - FirResolvedDeclarationStatusImpl(visibility, modality, effectiveVisibility), + status = when (effectiveVisibility) { + null -> FirDeclarationStatusImpl(visibility, modality) + else -> FirResolvedDeclarationStatusImpl(visibility, modality, effectiveVisibility) + }.apply { + this.isInline = isInline + }, propertyTypeRef, deprecationsProvider = UnresolvedDeprecationProvider, containerSource = null, @@ -104,6 +107,7 @@ class FirDefaultPropertyGetter( propertySymbol: FirPropertySymbol, modality: Modality = Modality.FINAL, effectiveVisibility: EffectiveVisibility? = null, + isInline: Boolean = false, symbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol(), resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR, ) : FirDefaultPropertyAccessor( @@ -117,6 +121,7 @@ class FirDefaultPropertyGetter( visibility = visibility, modality = modality, effectiveVisibility = effectiveVisibility, + isInline = isInline, symbol = symbol, resolvePhase = resolvePhase, ) @@ -130,6 +135,7 @@ class FirDefaultPropertySetter( propertySymbol: FirPropertySymbol, modality: Modality = Modality.FINAL, effectiveVisibility: EffectiveVisibility? = null, + isInline: Boolean = false, propertyAccessorSymbol: FirPropertyAccessorSymbol = FirPropertyAccessorSymbol(), parameterAnnotations: List = emptyList(), resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR, @@ -155,6 +161,7 @@ class FirDefaultPropertySetter( visibility = visibility, modality = modality, effectiveVisibility = effectiveVisibility, + isInline = isInline, symbol = propertyAccessorSymbol, resolvePhase = resolvePhase, ) diff --git a/compiler/testData/diagnostics/tests/inlineConstructorParameter.fir.kt b/compiler/testData/diagnostics/tests/inlineConstructorParameter.fir.kt new file mode 100644 index 00000000000..342d21882c2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineConstructorParameter.fir.kt @@ -0,0 +1,23 @@ +// ISSUE: KT-59664 +// LANGUAGE: -ProhibitInlineModifierOnPrimaryConstructorParameters +// WITH_STDLIB + +enum class Foo(open inline /* no effect */ val bar: String) { + A("super") { + override val bar: String + get() = super.bar + " overridden" + }; +} + +enum class Bar() { + A { + override val bar: String + get() = super.bar + " overridden" + }; + + open inline val bar: String get() = "puper" +} + +fun main() { + println(Foo.A.bar) +} diff --git a/compiler/testData/diagnostics/tests/inlineConstructorParameter.kt b/compiler/testData/diagnostics/tests/inlineConstructorParameter.kt new file mode 100644 index 00000000000..116214a689a --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineConstructorParameter.kt @@ -0,0 +1,23 @@ +// ISSUE: KT-59664 +// LANGUAGE: -ProhibitInlineModifierOnPrimaryConstructorParameters +// WITH_STDLIB + +enum class Foo(open inline /* no effect */ val bar: String) { + A("super") { + override val bar: String + get() = super.bar + " overridden" + }; +} + +enum class Bar() { + A { + override val bar: String + get() = super.bar + " overridden" + }; + + open inline val bar: String get() = "puper" +} + +fun main() { + println(Foo.A.bar) +} diff --git a/compiler/testData/diagnostics/tests/inlineConstructorParameter_on.fir.kt b/compiler/testData/diagnostics/tests/inlineConstructorParameter_on.fir.kt new file mode 100644 index 00000000000..14487bfe965 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineConstructorParameter_on.fir.kt @@ -0,0 +1,23 @@ +// ISSUE: KT-59664 +// LANGUAGE: +ProhibitInlineModifierOnPrimaryConstructorParameters +// WITH_STDLIB + +enum class Foo(open inline /* no effect */ val bar: String) { + A("super") { + override val bar: String + get() = super.bar + " overridden" + }; +} + +enum class Bar() { + A { + override val bar: String + get() = super.bar + " overridden" + }; + + open inline val bar: String get() = "puper" +} + +fun main() { + println(Foo.A.bar) +} diff --git a/compiler/testData/diagnostics/tests/inlineConstructorParameter_on.kt b/compiler/testData/diagnostics/tests/inlineConstructorParameter_on.kt new file mode 100644 index 00000000000..fbe9949e42b --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineConstructorParameter_on.kt @@ -0,0 +1,23 @@ +// ISSUE: KT-59664 +// LANGUAGE: +ProhibitInlineModifierOnPrimaryConstructorParameters +// WITH_STDLIB + +enum class Foo(open inline /* no effect */ val bar: String) { + A("super") { + override val bar: String + get() = super.bar + " overridden" + }; +} + +enum class Bar() { + A { + override val bar: String + get() = super.bar + " overridden" + }; + + open inline val bar: String get() = "puper" +} + +fun main() { + println(Foo.A.bar) +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index e73a3673dad..c7da9248641 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -507,6 +507,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/initializedAfterRethrow.kt"); } + @Test + @TestMetadata("inlineConstructorParameter.kt") + public void testInlineConstructorParameter() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter.kt"); + } + + @Test + @TestMetadata("inlineConstructorParameter_on.kt") + public void testInlineConstructorParameter_on() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineConstructorParameter_on.kt"); + } + @Test @TestMetadata("inlineDeprecationsOnImplicitCalls.kt") public void testInlineDeprecationsOnImplicitCalls() throws Exception { diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index f3388f57ba9..6b431e57c2c 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -308,6 +308,7 @@ enum class LanguageFeature( ReferencesToSyntheticJavaProperties(KOTLIN_2_1), // KT-8575 ProhibitImplementingVarByInheritedVal(KOTLIN_2_1, kind = BUG_FIX), // KT-56779 PrioritizedEnumEntries(KOTLIN_2_1, kind = UNSTABLE_FEATURE), // KT-58920 + ProhibitInlineModifierOnPrimaryConstructorParameters(KOTLIN_2_1, kind = BUG_FIX), // KT-59664 // End of 2.* language features --------------------------------------------------