From 4b8577640580ee035cedf87cb3ec4dc6496bad4d Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 12 Jun 2023 12:01:15 +0200 Subject: [PATCH] [FIR] Fix completion of FirDelegatedConstructorCall Before this fix, changes that were made to the arguments list by calling argumentList.transformArguments() were overriden by replaceArgumentList. This fixes reverses the order in which these calls are made. This also aligns the logic between the completion of qualified accesses and delegated constructor calls. #KT-59102 Fixed --- .../FirLightTreeJvmIrTextTestGenerated.java | 6 +++ .../ir/FirPsiJvmIrTextTestGenerated.java | 6 +++ ...rCallCompletionResultsWriterTransformer.kt | 6 ++- .../ir/irText/firProblems/kt59102.fir.ir.txt | 36 +++++++++++++++++ .../ir/irText/firProblems/kt59102.fir.kt.txt | 16 ++++++++ .../ir/irText/firProblems/kt59102.ir.txt | 39 +++++++++++++++++++ .../testData/ir/irText/firProblems/kt59102.kt | 3 ++ .../ir/irText/firProblems/kt59102.kt.txt | 16 ++++++++ .../ir/irText/firProblems/kt59102.sig.kt.txt | 26 +++++++++++++ .../ir/ClassicJvmIrTextTestGenerated.java | 6 +++ .../klib/KlibIrTextTestCaseGenerated.java | 5 +++ .../FirLightTreeJsIrTextTestGenerated.java | 6 +++ .../test/fir/FirPsiJsIrTextTestGenerated.java | 6 +++ .../test/ir/ClassicJsIrTextTestGenerated.java | 6 +++ 14 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/ir/irText/firProblems/kt59102.fir.ir.txt create mode 100644 compiler/testData/ir/irText/firProblems/kt59102.fir.kt.txt create mode 100644 compiler/testData/ir/irText/firProblems/kt59102.ir.txt create mode 100644 compiler/testData/ir/irText/firProblems/kt59102.kt create mode 100644 compiler/testData/ir/irText/firProblems/kt59102.kt.txt create mode 100644 compiler/testData/ir/irText/firProblems/kt59102.sig.kt.txt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java index ae534f405af..b7e0db4cb83 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java @@ -2738,6 +2738,12 @@ public class FirLightTreeJvmIrTextTestGenerated extends AbstractFirLightTreeJvmI runTest("compiler/testData/ir/irText/firProblems/kt55458.kt"); } + @Test + @TestMetadata("kt59102.kt") + public void testKt59102() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/kt59102.kt"); + } + @Test @TestMetadata("lambdaInEnumEntryConstructorCall.kt") public void testLambdaInEnumEntryConstructorCall() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java index 55aac8d9a32..60ab570e4f2 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java @@ -2738,6 +2738,12 @@ public class FirPsiJvmIrTextTestGenerated extends AbstractFirPsiJvmIrTextTest { runTest("compiler/testData/ir/irText/firProblems/kt55458.kt"); } + @Test + @TestMetadata("kt59102.kt") + public void testKt59102() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/kt59102.kt"); + } + @Test @TestMetadata("lambdaInEnumEntryConstructorCall.kt") public void testLambdaInEnumEntryConstructorCall() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index 64e07afd2c0..cac4ea11117 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -466,8 +466,6 @@ class FirCallCompletionResultsWriterTransformer( delegatedConstructorCall.calleeReference as? FirNamedReferenceWithCandidate ?: return delegatedConstructorCall val subCandidate = calleeReference.candidate - val argumentsMapping = runIf(!calleeReference.isError) { calleeReference.candidate.createArgumentsMapping() } - delegatedConstructorCall.argumentList.transformArguments(this, argumentsMapping) if (calleeReference.isError) { subCandidate.argumentMapping?.let { delegatedConstructorCall.replaceArgumentList(buildArgumentListForErrorCall(delegatedConstructorCall.argumentList, it)) @@ -478,6 +476,10 @@ class FirCallCompletionResultsWriterTransformer( delegatedConstructorCall.replaceArgumentList(buildResolvedArgumentList(it, delegatedConstructorCall.argumentList.source)) } } + + val argumentsMapping = runIf(!calleeReference.isError) { subCandidate.createArgumentsMapping() } + delegatedConstructorCall.argumentList.transformArguments(this, argumentsMapping) + return delegatedConstructorCall.apply { replaceCalleeReference(calleeReference.toResolvedReference()) } diff --git a/compiler/testData/ir/irText/firProblems/kt59102.fir.ir.txt b/compiler/testData/ir/irText/firProblems/kt59102.fir.ir.txt new file mode 100644 index 00000000000..a238586864a --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/kt59102.fir.ir.txt @@ -0,0 +1,36 @@ +FILE fqName: fileName:/kt59102.kt + CLASS CLASS name:XAlign modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.XAlign + CONSTRUCTOR visibility:public <> (bits:kotlin.Long) returnType:.XAlign [primary] + VALUE_PARAMETER name:bits index:0 type:kotlin.Long + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:XAlign modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:bits visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:bits type:kotlin.Long visibility:private [final] + EXPRESSION_BODY + GET_VAR 'bits: kotlin.Long declared in .XAlign.' type=kotlin.Long origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.XAlign) returnType:kotlin.Long + correspondingProperty: PROPERTY name:bits visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.XAlign + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Long declared in .XAlign' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:bits type:kotlin.Long visibility:private [final]' type=kotlin.Long origin=null + receiver: GET_VAR ': .XAlign declared in .XAlign.' type=.XAlign origin=null + CONSTRUCTOR visibility:public <> () returnType:.XAlign + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor (bits: kotlin.Long) declared in .XAlign' + bits: CONST Long type=kotlin.Long value=2 + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/firProblems/kt59102.fir.kt.txt b/compiler/testData/ir/irText/firProblems/kt59102.fir.kt.txt new file mode 100644 index 00000000000..c4ec8757274 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/kt59102.fir.kt.txt @@ -0,0 +1,16 @@ +class XAlign { + constructor(bits: Long) /* primary */ { + super/*Any*/() + /* () */ + + } + + val bits: Long + field = bits + get + + constructor() { + this/*XAlign*/(bits = 2L) + } + +} diff --git a/compiler/testData/ir/irText/firProblems/kt59102.ir.txt b/compiler/testData/ir/irText/firProblems/kt59102.ir.txt new file mode 100644 index 00000000000..ceb588e9344 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/kt59102.ir.txt @@ -0,0 +1,39 @@ +FILE fqName: fileName:/kt59102.kt + CLASS CLASS name:XAlign modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.XAlign + CONSTRUCTOR visibility:public <> (bits:kotlin.Long) returnType:.XAlign [primary] + VALUE_PARAMETER name:bits index:0 type:kotlin.Long + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:XAlign modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:bits visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:bits type:kotlin.Long visibility:private [final] + EXPRESSION_BODY + GET_VAR 'bits: kotlin.Long declared in .XAlign.' type=kotlin.Long origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.XAlign) returnType:kotlin.Long + correspondingProperty: PROPERTY name:bits visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.XAlign + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Long declared in .XAlign' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:bits type:kotlin.Long visibility:private [final]' type=kotlin.Long origin=null + receiver: GET_VAR ': .XAlign declared in .XAlign.' type=.XAlign origin=null + CONSTRUCTOR visibility:public <> () returnType:.XAlign + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor (bits: kotlin.Long) declared in .XAlign' + bits: CALL 'public open fun toLong (): kotlin.Long declared in kotlin.Int' type=kotlin.Long origin=null + $this: CALL 'public final fun shl (bitCount: kotlin.Int): kotlin.Int declared in kotlin.Int' type=kotlin.Int origin=null + $this: CONST Int type=kotlin.Int value=1 + bitCount: CONST Int type=kotlin.Int value=1 + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/firProblems/kt59102.kt b/compiler/testData/ir/irText/firProblems/kt59102.kt new file mode 100644 index 00000000000..f759e3e2fbc --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/kt59102.kt @@ -0,0 +1,3 @@ +class XAlign(val bits: Long) { + constructor() : this(1 shl 1) +} diff --git a/compiler/testData/ir/irText/firProblems/kt59102.kt.txt b/compiler/testData/ir/irText/firProblems/kt59102.kt.txt new file mode 100644 index 00000000000..c7b6025330f --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/kt59102.kt.txt @@ -0,0 +1,16 @@ +class XAlign { + constructor(bits: Long) /* primary */ { + super/*Any*/() + /* () */ + + } + + val bits: Long + field = bits + get + + constructor() { + this/*XAlign*/(bits = 1.shl(bitCount = 1).toLong()) + } + +} diff --git a/compiler/testData/ir/irText/firProblems/kt59102.sig.kt.txt b/compiler/testData/ir/irText/firProblems/kt59102.sig.kt.txt new file mode 100644 index 00000000000..e2459ce46be --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/kt59102.sig.kt.txt @@ -0,0 +1,26 @@ +// CHECK: +// Mangled name: XAlign +// Public signature: /XAlign|null[0] +class XAlign { + // CHECK: + // Mangled name: XAlign{}bits + // Public signature: /XAlign.bits|-2314303284935245061[0] + val bits: Long + // CHECK JVM_IR: + // Mangled name: XAlign#(){}kotlin.Long + // Public signature: /XAlign.bits.|-8015099027032327963[0] + // CHECK JS_IR: + // Mangled name: XAlign#(){} + // Public signature: /XAlign.bits.|-3920031234897259044[0] + get + + // CHECK: + // Mangled name: XAlign#(){} + // Public signature: /XAlign.|-5645683436151566731[0] + constructor() + // CHECK: + // Mangled name: XAlign#(kotlin.Long){} + // Public signature: /XAlign.|5217973964116651322[0] + constructor(bits: Long) /* primary */ + +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java index a2b3d1ed606..dadafe2b3cf 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java @@ -2738,6 +2738,12 @@ public class ClassicJvmIrTextTestGenerated extends AbstractClassicJvmIrTextTest runTest("compiler/testData/ir/irText/firProblems/kt55458.kt"); } + @Test + @TestMetadata("kt59102.kt") + public void testKt59102() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/kt59102.kt"); + } + @Test @TestMetadata("lambdaInEnumEntryConstructorCall.kt") public void testLambdaInEnumEntryConstructorCall() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java index 02303ab26ff..e92af8e0a2e 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java @@ -2045,6 +2045,11 @@ public class KlibIrTextTestCaseGenerated extends AbstractKlibIrTextTestCase { runTest("compiler/testData/ir/irText/firProblems/kt55458.kt"); } + @TestMetadata("kt59102.kt") + public void testKt59102() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/kt59102.kt"); + } + @TestMetadata("lambdaInEnumEntryConstructorCall.kt") public void testLambdaInEnumEntryConstructorCall() throws Exception { runTest("compiler/testData/ir/irText/firProblems/lambdaInEnumEntryConstructorCall.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java index c78df1e2e43..e225da9247e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java @@ -2348,6 +2348,12 @@ public class FirLightTreeJsIrTextTestGenerated extends AbstractFirLightTreeJsIrT runTest("compiler/testData/ir/irText/firProblems/kt55458.kt"); } + @Test + @TestMetadata("kt59102.kt") + public void testKt59102() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/kt59102.kt"); + } + @Test @TestMetadata("lambdaInEnumEntryConstructorCall.kt") public void testLambdaInEnumEntryConstructorCall() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java index 50014e956a7..d9a799bb977 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java @@ -2348,6 +2348,12 @@ public class FirPsiJsIrTextTestGenerated extends AbstractFirPsiJsIrTextTest { runTest("compiler/testData/ir/irText/firProblems/kt55458.kt"); } + @Test + @TestMetadata("kt59102.kt") + public void testKt59102() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/kt59102.kt"); + } + @Test @TestMetadata("lambdaInEnumEntryConstructorCall.kt") public void testLambdaInEnumEntryConstructorCall() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java index a2dcd85e920..b9a60c0b1db 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java @@ -2348,6 +2348,12 @@ public class ClassicJsIrTextTestGenerated extends AbstractClassicJsIrTextTest { runTest("compiler/testData/ir/irText/firProblems/kt55458.kt"); } + @Test + @TestMetadata("kt59102.kt") + public void testKt59102() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/kt59102.kt"); + } + @Test @TestMetadata("lambdaInEnumEntryConstructorCall.kt") public void testLambdaInEnumEntryConstructorCall() throws Exception {