From 2536eb4d4521e9ee6a6b52119ec4a851df470665 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Sun, 4 Feb 2018 23:44:16 +0300 Subject: [PATCH] Generate argument expression instead of constructor for inline classes --- .../kotlin/codegen/ExpressionCodegen.java | 7 +++++++ .../emptyConstructorForInlineClass.kt | 10 ++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 15 +++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 15 +++++++++++++++ .../codegen/LightAnalysisModeTestGenerated.java | 15 +++++++++++++++ .../test/semantics/JsCodegenBoxTestGenerated.java | 15 +++++++++++++++ 6 files changed, 77 insertions(+) create mode 100644 compiler/testData/codegen/box/inlineClasses/emptyConstructorForInlineClass.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 7c1d37ee4b8..772c19d2e43 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2072,6 +2072,13 @@ public class ExpressionCodegen extends KtVisitor impleme FunctionDescriptor descriptor = accessibleFunctionDescriptor(resolvedCall); if (descriptor instanceof ConstructorDescriptor) { + if (InlineClassesUtilsKt.isInlineClass(descriptor.getContainingDeclaration())) { + KtValueArgument valueArgument = CollectionsKt.firstOrNull(expression.getValueArguments()); + if (valueArgument == null) return null; + + return gen(valueArgument.getArgumentExpression()); + } + return generateNewCall(expression, resolvedCall); } diff --git a/compiler/testData/codegen/box/inlineClasses/emptyConstructorForInlineClass.kt b/compiler/testData/codegen/box/inlineClasses/emptyConstructorForInlineClass.kt new file mode 100644 index 00000000000..1907b764c34 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/emptyConstructorForInlineClass.kt @@ -0,0 +1,10 @@ +// !LANGUAGE: +InlineClasses + +inline class Foo(val s: String) { + fun asResult(): String = s +} + +fun box(): String { + val a = Foo("OK") + return a.asResult() +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 9cdcc3e4345..617edaced0a 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -10303,6 +10303,21 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes } } + @TestMetadata("compiler/testData/codegen/box/inlineClasses") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class InlineClasses extends AbstractIrBlackBoxCodegenTest { + public void testAllFilesPresentInInlineClasses() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); + } + + @TestMetadata("emptyConstructorForInlineClass.kt") + public void testEmptyConstructorForInlineClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/emptyConstructorForInlineClass.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/box/innerNested") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 965b1ab88cd..5767ce81ca4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -10303,6 +10303,21 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { } } + @TestMetadata("compiler/testData/codegen/box/inlineClasses") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class InlineClasses extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInInlineClasses() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); + } + + @TestMetadata("emptyConstructorForInlineClass.kt") + public void testEmptyConstructorForInlineClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/emptyConstructorForInlineClass.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/box/innerNested") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f42f817da2b..e40cb055f2a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -10303,6 +10303,21 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes } } + @TestMetadata("compiler/testData/codegen/box/inlineClasses") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class InlineClasses extends AbstractLightAnalysisModeTest { + public void testAllFilesPresentInInlineClasses() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); + } + + @TestMetadata("emptyConstructorForInlineClass.kt") + public void testEmptyConstructorForInlineClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/emptyConstructorForInlineClass.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/box/innerNested") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 6e9fda32bfe..2eb9d9fe5c1 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -11263,6 +11263,21 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { } } + @TestMetadata("compiler/testData/codegen/box/inlineClasses") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class InlineClasses extends AbstractJsCodegenBoxTest { + public void testAllFilesPresentInInlineClasses() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true); + } + + @TestMetadata("emptyConstructorForInlineClass.kt") + public void testEmptyConstructorForInlineClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/inlineClasses/emptyConstructorForInlineClass.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/box/innerNested") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)