From ca3d758fbac3483d15efc2552fd63de4c19d3cf8 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 11 Dec 2018 20:29:01 +0300 Subject: [PATCH] Create expect/actual class: fix inline class generation #KT-28744 Fixed #KT-28745 Fixed --- .../jetbrains/kotlin/renderer/DescriptorRenderer.kt | 2 +- .../kotlin/renderer/DescriptorRendererImpl.kt | 5 +++-- .../renderer/DescriptorRendererOptionsImpl.kt | 2 +- .../OverrideMemberChooserObject.kt | 13 +++++++++---- .../expectInlineClass/common/InlineMe.kt.after | 1 + .../expectInlineClass/jvm/InlineMe.kt | 4 ++++ .../expectInlineClass/jvm/InlineMe.kt.after | 4 ++++ .../inlineClass/common/InlineMe.kt | 3 +++ .../inlineClass/common/InlineMe.kt.after | 3 +++ .../inlineClass/jvm/InlineMe.kt.after | 1 + .../quickfix/QuickFixMultiModuleTestGenerated.java | 10 ++++++++++ 11 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 idea/testData/multiModuleQuickFix/expectInlineClass/common/InlineMe.kt.after create mode 100644 idea/testData/multiModuleQuickFix/expectInlineClass/jvm/InlineMe.kt create mode 100644 idea/testData/multiModuleQuickFix/expectInlineClass/jvm/InlineMe.kt.after create mode 100644 idea/testData/multiModuleQuickFix/inlineClass/common/InlineMe.kt create mode 100644 idea/testData/multiModuleQuickFix/inlineClass/common/InlineMe.kt.after create mode 100644 idea/testData/multiModuleQuickFix/inlineClass/jvm/InlineMe.kt.after diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt index d666122fa81..47d2aeb2ffe 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt @@ -187,7 +187,7 @@ interface DescriptorRendererOptions { var renderDefaultVisibility: Boolean var renderDefaultModality: Boolean var renderConstructorDelegation: Boolean - var renderAnnotationPropertiesInPrimaryConstructor: Boolean + var renderPrimaryConstructorParametersAsProperties: Boolean var actualPropertiesInPrimaryConstructor: Boolean var uninferredTypeParameterAsName: Boolean var overrideRenderingPolicy: OverrideRenderingPolicy diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index 68fdc00522f..a769cf64694 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.resolve.constants.ConstantValue import org.jetbrains.kotlin.resolve.constants.KClassValue import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValue -import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotationConstructor import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.ErrorUtils.UninferredParameterTypeConstructor import org.jetbrains.kotlin.types.TypeUtils.CANT_INFER_FUNCTION_PARAM_TYPE @@ -815,7 +814,9 @@ internal class DescriptorRendererImpl( renderModifier(builder, valueParameter.isCrossinline, "crossinline") renderModifier(builder, valueParameter.isNoinline, "noinline") - if (renderAnnotationPropertiesInPrimaryConstructor && valueParameter.containingDeclaration.isAnnotationConstructor()) { + if (renderPrimaryConstructorParametersAsProperties && + (valueParameter.containingDeclaration as? ClassConstructorDescriptor)?.isPrimary == true + ) { renderModifier(builder, actualPropertiesInPrimaryConstructor, "actual") renderModifier(builder, true, "val") } diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt index 65e9a6c8466..8268e8f4056 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt @@ -82,7 +82,7 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions { override var renderDefaultVisibility by property(true) override var renderDefaultModality by property(true) override var renderConstructorDelegation by property(false) - override var renderAnnotationPropertiesInPrimaryConstructor by property(false) + override var renderPrimaryConstructorParametersAsProperties by property(false) override var actualPropertiesInPrimaryConstructor: Boolean by property(false) override var uninferredTypeParameterAsName by property(false) override var includePropertyConstant by property(false) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index a76c1bd46e1..09d9f96f4cc 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -139,10 +139,16 @@ fun OverrideMemberChooserObject.generateMember( else -> bodyType } - val renderer = when { + val renderer = if (!forceActual && !forceExpect) OVERRIDE_RENDERER else when { forceActual -> ACTUAL_RENDERER - forceExpect -> EXPECT_RENDERER - else -> OVERRIDE_RENDERER + else -> EXPECT_RENDERER + }.withOptions { + if (descriptor is ClassConstructorDescriptor && descriptor.isPrimary) { + val containingClass = descriptor.containingDeclaration + if (containingClass.kind == ClassKind.ANNOTATION_CLASS || containingClass.isInline) { + renderPrimaryConstructorParametersAsProperties = true + } + } } if (preferConstructorParameter && descriptor is PropertyDescriptor) { @@ -214,7 +220,6 @@ private val EXPECT_RENDERER = OVERRIDE_RENDERER.withOptions { secondaryConstructorsAsPrimary = false renderDefaultVisibility = false renderDefaultModality = false - renderAnnotationPropertiesInPrimaryConstructor = true renderTypeExpansions = true } diff --git a/idea/testData/multiModuleQuickFix/expectInlineClass/common/InlineMe.kt.after b/idea/testData/multiModuleQuickFix/expectInlineClass/common/InlineMe.kt.after new file mode 100644 index 00000000000..d0250ef4645 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/expectInlineClass/common/InlineMe.kt.after @@ -0,0 +1 @@ +expect inline class InlineMe(val x: Int) \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/expectInlineClass/jvm/InlineMe.kt b/idea/testData/multiModuleQuickFix/expectInlineClass/jvm/InlineMe.kt new file mode 100644 index 00000000000..51a9b096256 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/expectInlineClass/jvm/InlineMe.kt @@ -0,0 +1,4 @@ +// "Create expected class in common module testModule_Common" "true" +// DISABLE-ERRORS + +actual inline class InlineMe actual constructor(val x: Int) \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/expectInlineClass/jvm/InlineMe.kt.after b/idea/testData/multiModuleQuickFix/expectInlineClass/jvm/InlineMe.kt.after new file mode 100644 index 00000000000..02e5b51b36b --- /dev/null +++ b/idea/testData/multiModuleQuickFix/expectInlineClass/jvm/InlineMe.kt.after @@ -0,0 +1,4 @@ +// "Create expected class in common module testModule_Common" "true" +// DISABLE-ERRORS + +actual inline class InlineMe actual constructor(val x: Int) \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/inlineClass/common/InlineMe.kt b/idea/testData/multiModuleQuickFix/inlineClass/common/InlineMe.kt new file mode 100644 index 00000000000..ce3a1edf2c7 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/inlineClass/common/InlineMe.kt @@ -0,0 +1,3 @@ +// "Create actual class for module testModule_JVM (JVM)" "true" + +expect inline class InlineMe(val x: Int) \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/inlineClass/common/InlineMe.kt.after b/idea/testData/multiModuleQuickFix/inlineClass/common/InlineMe.kt.after new file mode 100644 index 00000000000..8857e4cd5a3 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/inlineClass/common/InlineMe.kt.after @@ -0,0 +1,3 @@ +// "Create actual class for module testModule_JVM (JVM)" "true" + +expect inline class InlineMe(val x: Int) \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/inlineClass/jvm/InlineMe.kt.after b/idea/testData/multiModuleQuickFix/inlineClass/jvm/InlineMe.kt.after new file mode 100644 index 00000000000..3df2f3899c4 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/inlineClass/jvm/InlineMe.kt.after @@ -0,0 +1 @@ +actual inline class InlineMe actual constructor(actual val x: Int) \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index 6233d5e9438..4c95a4723bd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -379,6 +379,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/expectFunction/"); } + @TestMetadata("expectInlineClass") + public void testExpectInlineClass() throws Exception { + runTest("idea/testData/multiModuleQuickFix/expectInlineClass/"); + } + @TestMetadata("expectNestedClass") public void testExpectNestedClass() throws Exception { runTest("idea/testData/multiModuleQuickFix/expectNestedClass/"); @@ -499,6 +504,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/importFunInCommon/"); } + @TestMetadata("inlineClass") + public void testInlineClass() throws Exception { + runTest("idea/testData/multiModuleQuickFix/inlineClass/"); + } + @TestMetadata("interface") public void testInterface() throws Exception { runTest("idea/testData/multiModuleQuickFix/interface/");