From caee19cdc7c13cf98a302243bb2fd13f04403415 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 8 Sep 2014 14:45:47 +0400 Subject: [PATCH] Generate copy() in data class even if constructor is empty or not present --- .../jet/lang/resolve/DeclarationResolver.java | 20 +++++++++++-------- .../descriptors/LazyClassMemberScope.java | 2 +- .../tests/dataClasses/noConstructor.kt | 6 ++++++ .../compiledKotlin/dataClass/NoComponents.kt | 1 + .../compiledKotlin/dataClass/NoComponents.txt | 6 ++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ 6 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/dataClasses/noConstructor.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 69074168de7..e25ccb16202 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -227,10 +227,14 @@ public class DeclarationResolver { JetClassOrObject klass = entry.getKey(); MutableClassDescriptor classDescriptor = (MutableClassDescriptor) entry.getValue(); - if (klass instanceof JetClass && klass.hasPrimaryConstructor() && KotlinBuiltIns.getInstance().isData(classDescriptor)) { - ConstructorDescriptor constructor = getConstructorOfDataClass(classDescriptor); - createComponentFunctions(classDescriptor, constructor); - createCopyFunction(classDescriptor, constructor); + if (klass instanceof JetClass && KotlinBuiltIns.getInstance().isData(classDescriptor)) { + List parameters = + klass.hasPrimaryConstructor() ? + getConstructorOfDataClass(classDescriptor).getValueParameters() : + Collections.emptyList(); + + createComponentFunctions(classDescriptor, parameters); + createCopyFunction(classDescriptor, parameters); } } } @@ -242,9 +246,9 @@ public class DeclarationResolver { return constructors.iterator().next(); } - private void createComponentFunctions(@NotNull MutableClassDescriptor classDescriptor, @NotNull ConstructorDescriptor constructorDescriptor) { + private void createComponentFunctions(@NotNull MutableClassDescriptor classDescriptor, List parameters) { int parameterIndex = 0; - for (ValueParameterDescriptor parameter : constructorDescriptor.getValueParameters()) { + for (ValueParameterDescriptor parameter : parameters) { if (!parameter.getType().isError()) { PropertyDescriptor property = trace.get(BindingContext.VALUE_PARAMETER_AS_PROPERTY, parameter); if (property != null) { @@ -259,9 +263,9 @@ public class DeclarationResolver { } } - private void createCopyFunction(@NotNull MutableClassDescriptor classDescriptor, @NotNull ConstructorDescriptor constructorDescriptor) { + private void createCopyFunction(@NotNull MutableClassDescriptor classDescriptor, List parameters) { SimpleFunctionDescriptor functionDescriptor = DescriptorResolver.createCopyFunctionDescriptor( - constructorDescriptor.getValueParameters(), classDescriptor, trace); + parameters, classDescriptor, trace); classDescriptor.getBuilder().addFunctionDescriptor(functionDescriptor); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java index 705b328b1b0..4be6e8466c9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java @@ -175,7 +175,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScopecomponent1() + a.component2() +} diff --git a/compiler/testData/loadJava/compiledKotlin/dataClass/NoComponents.kt b/compiler/testData/loadJava/compiledKotlin/dataClass/NoComponents.kt index 59b85ff72fd..304cf456282 100644 --- a/compiler/testData/loadJava/compiledKotlin/dataClass/NoComponents.kt +++ b/compiler/testData/loadJava/compiledKotlin/dataClass/NoComponents.kt @@ -1,3 +1,4 @@ package test data class DataClass +data class OtherDataClass() \ No newline at end of file diff --git a/compiler/testData/loadJava/compiledKotlin/dataClass/NoComponents.txt b/compiler/testData/loadJava/compiledKotlin/dataClass/NoComponents.txt index fb57595944c..c32e3b6f026 100644 --- a/compiler/testData/loadJava/compiledKotlin/dataClass/NoComponents.txt +++ b/compiler/testData/loadJava/compiledKotlin/dataClass/NoComponents.txt @@ -2,4 +2,10 @@ package test kotlin.data() internal final class DataClass { /*primary*/ public constructor DataClass() + internal final /*synthesized*/ fun copy(): test.DataClass +} + +kotlin.data() internal final class OtherDataClass { + /*primary*/ public constructor OtherDataClass() + internal final /*synthesized*/ fun copy(): test.OtherDataClass } diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index e5e54188598..c58717676ea 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2127,6 +2127,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("noConstructor.kt") + public void testNoConstructor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/noConstructor.kt"); + doTest(fileName); + } + @TestMetadata("notADataClass.kt") public void testNotADataClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dataClasses/notADataClass.kt");