From 4c2cfd3ea981e911085959cdabc95bd8f3ecfa51 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 12 Sep 2017 15:10:03 +0300 Subject: [PATCH] Synthesized 'copy' in data classes cannot override anything since 1.3 Synthesized 'copy' introduces default values for parameters, which is prohibited for regular overrides. Report warning in language version 1.2-, error in 1.3+. --- .../jetbrains/kotlin/diagnostics/Errors.java | 4 +++ .../rendering/DefaultErrorMessages.java | 2 ++ .../kotlin/resolve/OverrideResolver.kt | 22 +++++++++++++- .../codegen/box/dataClasses/copy/kt12708.kt | 2 ++ ...ClassExplicitlyOverridingCopyNoDefaults.kt | 9 ++++++ ...lassExplicitlyOverridingCopyNoDefaults.txt | 19 ++++++++++++ ...assExplicitlyOverridingCopyWithDefaults.kt | 9 ++++++ ...ssExplicitlyOverridingCopyWithDefaults.txt | 19 ++++++++++++ .../dataClasses/dataClassNotOverridingCopy.kt | 9 ++++++ .../dataClassNotOverridingCopy.txt | 21 +++++++++++++ .../dataClassOverridingCopy_lv12.kt | 7 +++++ .../dataClassOverridingCopy_lv12.txt | 18 +++++++++++ .../dataClassOverridingCopy_lv13.kt | 7 +++++ .../dataClassOverridingCopy_lv13.txt | 18 +++++++++++ .../checkers/DiagnosticsTestGenerated.java | 30 +++++++++++++++++++ .../DiagnosticsUsingJavacTestGenerated.java | 30 +++++++++++++++++++ .../kotlin/config/LanguageVersionSettings.kt | 1 + 17 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.kt create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.txt create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.kt create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.txt create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.kt create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.txt create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.kt create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.txt create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.kt create mode 100644 compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index bb871cc3ca4..1155effef6a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -394,6 +394,10 @@ public interface Errors { DiagnosticFactory2 DATA_CLASS_OVERRIDE_CONFLICT = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 DATA_CLASS_OVERRIDE_DEFAULT_VALUES_WARNING = + DiagnosticFactory2.create(WARNING); + DiagnosticFactory2 DATA_CLASS_OVERRIDE_DEFAULT_VALUES_ERROR = + DiagnosticFactory2.create(ERROR); DiagnosticFactory1 CANNOT_INFER_VISIBILITY = DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 9fe678bcdbc..4a75e0e2642 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -290,6 +290,8 @@ public class DefaultErrorMessages { MAP.put(VIRTUAL_MEMBER_HIDDEN, "''{0}'' hides member of supertype ''{2}'' and needs ''override'' modifier", NAME, NAME, NAME); MAP.put(DATA_CLASS_OVERRIDE_CONFLICT, "Function ''{0}'' generated for the data class conflicts with member of supertype ''{1}''", NAME, NAME); + MAP.put(DATA_CLASS_OVERRIDE_DEFAULT_VALUES_WARNING, "Function ''{0}'' generated for the data class has default values for parameters, and conflicts with member of supertype ''{1}''", NAME, NAME); + MAP.put(DATA_CLASS_OVERRIDE_DEFAULT_VALUES_ERROR, "Function ''{0}'' generated for the data class has default values for parameters, and conflicts with member of supertype ''{1}''", NAME, NAME); MAP.put(CANNOT_OVERRIDE_INVISIBLE_MEMBER, "''{0}'' has no access to ''{1}'', so it cannot override it", FQ_NAMES_IN_TYPES, FQ_NAMES_IN_TYPES); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.kt index 8aa0f68e5e3..6bb3c11548f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.kt @@ -22,6 +22,8 @@ import com.intellij.psi.PsiElement import com.intellij.util.SmartList import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.SmartHashSet +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE @@ -41,7 +43,8 @@ import java.util.* class OverrideResolver( private val trace: BindingTrace, - private val overridesBackwardCompatibilityHelper: OverridesBackwardCompatibilityHelper + private val overridesBackwardCompatibilityHelper: OverridesBackwardCompatibilityHelper, + private val languageVersionSettings: LanguageVersionSettings ) { fun check(c: TopDownAnalysisContext) { @@ -244,6 +247,9 @@ class OverrideResolver( if (DataClassDescriptorResolver.isComponentLike(declared.name)) { checkOverrideForComponentFunction(declared) } + else if (declared.name == DataClassDescriptorResolver.COPY_METHOD_NAME) { + checkOverrideForCopyFunction(declared) + } return } @@ -341,6 +347,20 @@ class OverrideResolver( }) } + private fun checkOverrideForCopyFunction(copyFunction: CallableMemberDescriptor) { + val overridden = copyFunction.overriddenDescriptors.firstOrNull() + if (overridden != null) { + val baseClassifier = overridden.containingDeclaration + val dataModifier = findDataModifierForDataClass(copyFunction.containingDeclaration) + if (languageVersionSettings.supportsFeature(LanguageFeature.ProhibitDataClassesOverridingCopy)) { + trace.report(DATA_CLASS_OVERRIDE_DEFAULT_VALUES_ERROR.on(dataModifier, copyFunction, baseClassifier)) + } + else { + trace.report(DATA_CLASS_OVERRIDE_DEFAULT_VALUES_WARNING.on(dataModifier, copyFunction, baseClassifier)) + } + } + } + private fun checkParameterOverridesForAllClasses(c: TopDownAnalysisContext) { for (classDescriptor in c.declaredClasses.values) { for (member in DescriptorUtils.getAllDescriptors(classDescriptor.defaultType.memberScope)) { diff --git a/compiler/testData/codegen/box/dataClasses/copy/kt12708.kt b/compiler/testData/codegen/box/dataClasses/copy/kt12708.kt index f2ac4b4e0af..e3c5e6485b9 100644 --- a/compiler/testData/codegen/box/dataClasses/copy/kt12708.kt +++ b/compiler/testData/codegen/box/dataClasses/copy/kt12708.kt @@ -1,3 +1,5 @@ +// LANGUAGE_VERSION: 1.1 + fun box(): String { val a: A = B(1) a.copy(1) diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.kt b/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.kt new file mode 100644 index 00000000000..79225b459bf --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.kt @@ -0,0 +1,9 @@ +// !LANGUAGE: +ProhibitDataClassesOverridingCopy + +interface WithCopy { + fun copy(str: T): WithCopy +} + +data class Test(val str: String) : WithCopy { + override fun copy(str: String) = Test(str) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.txt b/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.txt new file mode 100644 index 00000000000..f00772c326c --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.txt @@ -0,0 +1,19 @@ +package + +public final data class Test : WithCopy { + public constructor Test(/*0*/ str: kotlin.String) + public final val str: kotlin.String + public final operator /*synthesized*/ fun component1(): kotlin.String + public open override /*1*/ fun copy(/*0*/ str: kotlin.String): Test + public final override /*1*/ /*synthesized*/ fun copy(/*0*/ str: kotlin.String = ...): Test + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} + +public interface WithCopy { + public abstract fun copy(/*0*/ str: T): WithCopy + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.kt b/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.kt new file mode 100644 index 00000000000..1935d97c2bc --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.kt @@ -0,0 +1,9 @@ +// !LANGUAGE: +ProhibitDataClassesOverridingCopy + +interface WithCopy { + fun copy(str: T): WithCopy +} + +data class Test(val str: String) : WithCopy { + override fun copy(str: String = this.str) = Test(str) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.txt b/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.txt new file mode 100644 index 00000000000..1d6615addf7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.txt @@ -0,0 +1,19 @@ +package + +public final data class Test : WithCopy { + public constructor Test(/*0*/ str: kotlin.String) + public final val str: kotlin.String + public final operator /*synthesized*/ fun component1(): kotlin.String + public open override /*1*/ fun copy(/*0*/ str: kotlin.String = ...): Test + public final override /*1*/ /*synthesized*/ fun copy(/*0*/ str: kotlin.String = ...): Test + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} + +public interface WithCopy { + public abstract fun copy(/*0*/ str: T): WithCopy + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.kt b/compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.kt new file mode 100644 index 00000000000..aa5c85f6323 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.kt @@ -0,0 +1,9 @@ +// !LANGUAGE: +ProhibitDataClassesOverridingCopy + +interface WithCopy { + fun copy(str: T): WithCopy +} + +data class Test(val str: String, val int: Int) : WithCopy { + override fun copy(str: String) = copy(str, int) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.txt b/compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.txt new file mode 100644 index 00000000000..0ba8b03bd60 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.txt @@ -0,0 +1,21 @@ +package + +public final data class Test : WithCopy { + public constructor Test(/*0*/ str: kotlin.String, /*1*/ int: kotlin.Int) + public final val int: kotlin.Int + public final val str: kotlin.String + public final operator /*synthesized*/ fun component1(): kotlin.String + public final operator /*synthesized*/ fun component2(): kotlin.Int + public open override /*1*/ fun copy(/*0*/ str: kotlin.String): Test + public final /*synthesized*/ fun copy(/*0*/ str: kotlin.String = ..., /*1*/ int: kotlin.Int = ...): Test + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} + +public interface WithCopy { + public abstract fun copy(/*0*/ str: T): WithCopy + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.kt b/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.kt new file mode 100644 index 00000000000..5fdd26cd936 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.kt @@ -0,0 +1,7 @@ +// !LANGUAGE: -ProhibitDataClassesOverridingCopy + +interface WithCopy { + fun copy(str: T): WithCopy +} + +data class Test(val str: String): WithCopy \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.txt b/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.txt new file mode 100644 index 00000000000..f0715277dd0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.txt @@ -0,0 +1,18 @@ +package + +public final data class Test : WithCopy { + public constructor Test(/*0*/ str: kotlin.String) + public final val str: kotlin.String + public final operator /*synthesized*/ fun component1(): kotlin.String + public final override /*1*/ /*synthesized*/ fun copy(/*0*/ str: kotlin.String = ...): Test + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} + +public interface WithCopy { + public abstract fun copy(/*0*/ str: T): WithCopy + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.kt b/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.kt new file mode 100644 index 00000000000..f36af1d1c0a --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.kt @@ -0,0 +1,7 @@ +// !LANGUAGE: +ProhibitDataClassesOverridingCopy + +interface WithCopy { + fun copy(str: T): WithCopy +} + +data class Test(val str: String): WithCopy \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.txt b/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.txt new file mode 100644 index 00000000000..f0715277dd0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.txt @@ -0,0 +1,18 @@ +package + +public final data class Test : WithCopy { + public constructor Test(/*0*/ str: kotlin.String) + public final val str: kotlin.String + public final operator /*synthesized*/ fun component1(): kotlin.String + public final override /*1*/ /*synthesized*/ fun copy(/*0*/ str: kotlin.String = ...): Test + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} + +public interface WithCopy { + public abstract fun copy(/*0*/ str: T): WithCopy + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 0b56da52ba0..09244818143 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -4828,12 +4828,42 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("dataClassExplicitlyOverridingCopyNoDefaults.kt") + public void testDataClassExplicitlyOverridingCopyNoDefaults() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.kt"); + doTest(fileName); + } + + @TestMetadata("dataClassExplicitlyOverridingCopyWithDefaults.kt") + public void testDataClassExplicitlyOverridingCopyWithDefaults() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.kt"); + doTest(fileName); + } + @TestMetadata("dataClassNoName.kt") public void testDataClassNoName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassNoName.kt"); doTest(fileName); } + @TestMetadata("dataClassNotOverridingCopy.kt") + public void testDataClassNotOverridingCopy() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.kt"); + doTest(fileName); + } + + @TestMetadata("dataClassOverridingCopy_lv12.kt") + public void testDataClassOverridingCopy_lv12() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.kt"); + doTest(fileName); + } + + @TestMetadata("dataClassOverridingCopy_lv13.kt") + public void testDataClassOverridingCopy_lv13() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.kt"); + doTest(fileName); + } + @TestMetadata("dataClassVarargParam.kt") public void testDataClassVarargParam() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassVarargParam.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index cdb2b2dcfde..95ec9329390 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -4828,12 +4828,42 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing doTest(fileName); } + @TestMetadata("dataClassExplicitlyOverridingCopyNoDefaults.kt") + public void testDataClassExplicitlyOverridingCopyNoDefaults() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyNoDefaults.kt"); + doTest(fileName); + } + + @TestMetadata("dataClassExplicitlyOverridingCopyWithDefaults.kt") + public void testDataClassExplicitlyOverridingCopyWithDefaults() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassExplicitlyOverridingCopyWithDefaults.kt"); + doTest(fileName); + } + @TestMetadata("dataClassNoName.kt") public void testDataClassNoName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassNoName.kt"); doTest(fileName); } + @TestMetadata("dataClassNotOverridingCopy.kt") + public void testDataClassNotOverridingCopy() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassNotOverridingCopy.kt"); + doTest(fileName); + } + + @TestMetadata("dataClassOverridingCopy_lv12.kt") + public void testDataClassOverridingCopy_lv12() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv12.kt"); + doTest(fileName); + } + + @TestMetadata("dataClassOverridingCopy_lv13.kt") + public void testDataClassOverridingCopy_lv13() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassOverridingCopy_lv13.kt"); + doTest(fileName); + } + @TestMetadata("dataClassVarargParam.kt") public void testDataClassVarargParam() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/dataClassVarargParam.kt"); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index e697cc2d81c..419b0e18b5c 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -65,6 +65,7 @@ enum class LanguageFeature( RestrictionOfValReassignmentViaBackingField(KOTLIN_1_3), NestedClassesInEnumEntryShouldBeInner(KOTLIN_1_3), + ProhibitDataClassesOverridingCopy(KOTLIN_1_3), RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes(KOTLIN_1_3), // Experimental features