From 3673dff9596c536d7a7dc5e2441bae2650feecda Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 1 Nov 2023 13:58:44 +0000 Subject: [PATCH] [FIR] Only one specific diagnostic for data class without parameters left ^KT-60042 fixed --- .../api/fir/diagnostics/KtFirDataClassConverters.kt | 7 ------- .../analysis/api/fir/diagnostics/KtFirDiagnostics.kt | 7 +------ .../analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 8 +------- .../diagnostics/primaryConstructorRequiredForDataClass.kt | 6 +++--- .../resolve/smartcasts/lambdas/lambdaInWhenBranch.kt | 2 +- .../checkers/generator/diagnostics/FirDiagnosticsList.kt | 3 +-- .../kotlin/fir/analysis/diagnostics/FirErrors.kt | 4 +--- .../analysis/diagnostics/FirNonSuppressibleErrorNames.kt | 1 - .../declaration/FirDataClassPrimaryConstructorChecker.kt | 5 ++--- .../fir/analysis/diagnostics/FirErrorsDefaultMessages.kt | 2 -- .../kotlin/diagnostics/LightTreePositioningStrategies.kt | 1 + .../diagnostics/tests/dataClasses/noConstructor.fir.kt | 2 +- .../tests/secondaryConstructors/dataClasses.fir.kt | 2 +- 13 files changed, 13 insertions(+), 37 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 f8fcd913929..55852250390 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 @@ -46,7 +46,6 @@ import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.KtPrimaryConstructor import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtReturnExpression @@ -824,12 +823,6 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } - add(FirErrors.PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS) { firDiagnostic -> - PrimaryConstructorRequiredForDataClassImpl( - firDiagnostic as KtPsiDiagnostic, - token, - ) - } add(FirErrors.EXPLICIT_DELEGATION_CALL_REQUIRED) { firDiagnostic -> ExplicitDelegationCallRequiredImpl( 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 00e755a81cf..51d5948a2ea 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 @@ -65,7 +65,6 @@ import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.KtPrimaryConstructor import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtReturnExpression @@ -616,10 +615,6 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = DelegationSuperCallInEnumConstructor::class } - interface PrimaryConstructorRequiredForDataClass : KtFirDiagnostic { - override val diagnosticClass get() = PrimaryConstructorRequiredForDataClass::class - } - interface ExplicitDelegationCallRequired : KtFirDiagnostic { override val diagnosticClass get() = ExplicitDelegationCallRequired::class } @@ -628,7 +623,7 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = SealedClassConstructorCall::class } - interface DataClassWithoutParameters : KtFirDiagnostic { + interface DataClassWithoutParameters : KtFirDiagnostic { override val diagnosticClass get() = DataClassWithoutParameters::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 01023c8613d..3f48e824345 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 @@ -66,7 +66,6 @@ import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.KtPrimaryConstructor import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtReturnExpression @@ -728,11 +727,6 @@ internal class DelegationSuperCallInEnumConstructorImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DelegationSuperCallInEnumConstructor -internal class PrimaryConstructorRequiredForDataClassImpl( - firDiagnostic: KtPsiDiagnostic, - token: KtLifetimeToken, -) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.PrimaryConstructorRequiredForDataClass - internal class ExplicitDelegationCallRequiredImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, @@ -746,7 +740,7 @@ internal class SealedClassConstructorCallImpl( internal class DataClassWithoutParametersImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, -) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DataClassWithoutParameters +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DataClassWithoutParameters internal class DataClassVarargParameterImpl( firDiagnostic: KtPsiDiagnostic, diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/primaryConstructorRequiredForDataClass.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/primaryConstructorRequiredForDataClass.kt index eb6b88d9f6a..98572275a21 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/primaryConstructorRequiredForDataClass.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/primaryConstructorRequiredForDataClass.kt @@ -1,9 +1,9 @@ -data class A {} +data class A {} -data class B { +data class B { constructor() } -data class C { +data class C { constructor(x: Int) } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.kt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.kt index 8f1be2f0d9d..672b432b320 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.kt +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.kt @@ -4,7 +4,7 @@ private sealed class Sealed private data class SubClass1(val t: String) : Sealed() -private data class SubClass2 : Sealed() +private data class SubClass2 : Sealed() private fun foo(p: Sealed) { when (p) { 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 9c37d4aada0..dc34509dd97 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 @@ -307,12 +307,11 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val SUPERTYPE_NOT_INITIALIZED by error() val SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR by error() val DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR by error() - val PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS by error(PositioningStrategy.DECLARATION_NAME) val EXPLICIT_DELEGATION_CALL_REQUIRED by error(PositioningStrategy.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) val SEALED_CLASS_CONSTRUCTOR_CALL by error() // TODO: Consider creating a parameter list position strategy and report on the parameter list instead - val DATA_CLASS_WITHOUT_PARAMETERS by error() + val DATA_CLASS_WITHOUT_PARAMETERS by error(PositioningStrategy.DECLARATION_NAME) val DATA_CLASS_VARARG_PARAMETER by error() val DATA_CLASS_NOT_PROPERTY_PARAMETER by error() } 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 43f88bbf72c..25269b86c24 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 @@ -91,7 +91,6 @@ import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.KtPrimaryConstructor import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtReturnExpression @@ -245,10 +244,9 @@ object FirErrors { val SUPERTYPE_NOT_INITIALIZED by error0() val SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR by error0() val DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR by error0() - val PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS by error0(SourceElementPositioningStrategies.DECLARATION_NAME) val EXPLICIT_DELEGATION_CALL_REQUIRED by error0(SourceElementPositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) val SEALED_CLASS_CONSTRUCTOR_CALL by error0() - val DATA_CLASS_WITHOUT_PARAMETERS by error0() + val DATA_CLASS_WITHOUT_PARAMETERS by error0(SourceElementPositioningStrategies.DECLARATION_NAME) val DATA_CLASS_VARARG_PARAMETER by error0() val DATA_CLASS_NOT_PROPERTY_PARAMETER by error0() diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt index 927bbb02e49..21a7ea7135e 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt @@ -112,7 +112,6 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "SUPERTYPE_NOT_INITIALIZED", "SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR", "DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR", - "PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS", "EXPLICIT_DELEGATION_CALL_REQUIRED", "SEALED_CLASS_CONSTRUCTOR_CALL", "DATA_CLASS_WITHOUT_PARAMETERS", diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDataClassPrimaryConstructorChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDataClassPrimaryConstructorChecker.kt index e1c8dbf1430..82e9169a7e7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDataClassPrimaryConstructorChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDataClassPrimaryConstructorChecker.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration -import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.hasValOrVar @@ -24,8 +23,8 @@ object FirDataClassPrimaryConstructorChecker : FirRegularClassChecker() { val primaryConstructor = declaration.primaryConstructorIfAny(context.session) - if (primaryConstructor == null || primaryConstructor.source.let { it == null || it.kind is KtFakeSourceElementKind }) { - reporter.reportOn(declaration.source, FirErrors.PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS, context) + if (primaryConstructor?.source == null) { + reporter.reportOn(declaration.source, FirErrors.DATA_CLASS_WITHOUT_PARAMETERS, context) return } 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 b77b3c12e7d..54029a481f4 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 @@ -496,7 +496,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PLUGIN_ANNOTATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.POTENTIALLY_NON_REPORTED_ANNOTATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRE_RELEASE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_CLASS_MEMBER_FROM_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_FUNCTION_WITH_NO_BODY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_PROPERTY_IN_INTERFACE @@ -943,7 +942,6 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { map.put(PROTECTED_CONSTRUCTOR_NOT_IN_SUPER_CALL, "Protected constructor ''{0}'' from other classes can only be used in super-call.", SYMBOL) map.put(SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR, "Supertype initialization is impossible without a primary constructor.") map.put(DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR, "Calls to super in enum constructors are prohibited.") - map.put(PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS, "Primary constructor required for data class.") map.put( EXPLICIT_DELEGATION_CALL_REQUIRED, "Explicit 'this' or 'super' call is required. There is no constructor in the superclass that can be called without arguments." diff --git a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/LightTreePositioningStrategies.kt b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/LightTreePositioningStrategies.kt index adb0332fa00..d866c69c86b 100644 --- a/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/frontend.common-psi/src/org/jetbrains/kotlin/diagnostics/LightTreePositioningStrategies.kt @@ -238,6 +238,7 @@ object LightTreePositioningStrategies { //in FE 1.0 this is part of DeclarationHeader abstract strategy if (node.tokenType != KtNodeTypes.OBJECT_DECLARATION && node.tokenType != KtNodeTypes.FUN + && node.tokenType != KtNodeTypes.PRIMARY_CONSTRUCTOR && node.tokenType != KtNodeTypes.SECONDARY_CONSTRUCTOR && node.tokenType != KtNodeTypes.OBJECT_LITERAL ) { diff --git a/compiler/testData/diagnostics/tests/dataClasses/noConstructor.fir.kt b/compiler/testData/diagnostics/tests/dataClasses/noConstructor.fir.kt index a1310068c66..eccc87c80a3 100644 --- a/compiler/testData/diagnostics/tests/dataClasses/noConstructor.fir.kt +++ b/compiler/testData/diagnostics/tests/dataClasses/noConstructor.fir.kt @@ -1,4 +1,4 @@ -data class A +data class A fun foo(a: A) { a.component1() diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/dataClasses.fir.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/dataClasses.fir.kt index fb0a516d99f..9fe2103e28b 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/dataClasses.fir.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/dataClasses.fir.kt @@ -7,7 +7,7 @@ data class A2(val y: String, val z: Int) { constructor(x: String): this(x, 0) } -data class A3 { +data class A3 { constructor() }