From d0e26c6527fbd5cc34737c330b101b4d3d7f937a Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Thu, 25 May 2017 12:16:04 +0300 Subject: [PATCH] Support underscores in non local destructuring declarations --- .../org/jetbrains/kotlin/codegen/ExpressionCodegen.java | 3 ++- .../org/jetbrains/kotlin/codegen/PropertyCodegen.java | 5 ++++- .../script/destructuringDeclarationUnderscore.kts | 9 +++++++++ .../kotlin/codegen/ScriptCodegenTestGenerated.java | 6 ++++++ 4 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/script/destructuringDeclarationUnderscore.kts diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 7a6b13cb8b2..1727d783106 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -73,6 +73,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt; import org.jetbrains.kotlin.resolve.calls.model.*; import org.jetbrains.kotlin.resolve.calls.util.CallMaker; import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject; +import org.jetbrains.kotlin.resolve.calls.util.UnderscoreUtilKt; import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant; import org.jetbrains.kotlin.resolve.constants.ConstantValue; import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator; @@ -3495,7 +3496,7 @@ public class ExpressionCodegen extends KtVisitor impleme VariableDescriptor variableDescriptor = getVariableDescriptorNotNull(variableDeclaration); // Do not call `componentX` for destructuring entry called _ - if (variableDescriptor.getName().isSpecial()) continue; + if (UnderscoreUtilKt.isSingleUnderscore(variableDeclaration)) continue; if (asProperty && variableDescriptor instanceof PropertyDescriptor) { StackValue.Property propertyValue = intermediateValueForProperty( diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java index fd86281e06f..7362932c291 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.resolve.DescriptorFactory; import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; +import org.jetbrains.kotlin.resolve.calls.util.UnderscoreUtilKt; import org.jetbrains.kotlin.resolve.constants.ConstantValue; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature; @@ -142,12 +143,14 @@ public class PropertyCodegen { } private void genDestructuringDeclaration( - @Nullable KtDestructuringDeclarationEntry entry, + @NotNull KtDestructuringDeclarationEntry entry, @NotNull PropertyDescriptor descriptor ) { assert kind == OwnerKind.PACKAGE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.DEFAULT_IMPLS : "Generating property with a wrong kind (" + kind + "): " + descriptor; + if (UnderscoreUtilKt.isSingleUnderscore(entry)) return; + genBackingFieldAndAnnotations(entry, descriptor, false); generateGetter(entry, descriptor, null); diff --git a/compiler/testData/codegen/script/destructuringDeclarationUnderscore.kts b/compiler/testData/codegen/script/destructuringDeclarationUnderscore.kts new file mode 100644 index 00000000000..2fc183d4a7f --- /dev/null +++ b/compiler/testData/codegen/script/destructuringDeclarationUnderscore.kts @@ -0,0 +1,9 @@ +val (_, b, _) = A() + +class A { + operator fun component1(): Int = throw RuntimeException() + operator fun component2() = 2 + operator fun component3(): Int = throw RuntimeException() +} + +// expected: b: 2 \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java index 8f6f23d6e1f..4e534d2ab6c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java @@ -54,6 +54,12 @@ public class ScriptCodegenTestGenerated extends AbstractScriptCodegenTest { doTest(fileName); } + @TestMetadata("destructuringDeclarationUnderscore.kts") + public void testDestructuringDeclarationUnderscore() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/script/destructuringDeclarationUnderscore.kts"); + doTest(fileName); + } + @TestMetadata("empty.kts") public void testEmpty() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/script/empty.kts");