From 11096325c8000b2840b07a3e881acad2ee6235a9 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 7 Sep 2023 23:53:03 +0900 Subject: [PATCH] [LL API] Fix 'this' capturing inside property accessors ^KTIJ-26726 Fixed --- ...rceModuleCompilerFacilityTestGenerated.java | 18 ++++++++++++++++++ ...rceModuleCompilerFacilityTestGenerated.java | 18 ++++++++++++++++++ .../extensionReceiverProperty.capturing.txt | 4 ++++ .../extensionReceiverProperty.fragment.kt | 1 + .../capturing/extensionReceiverProperty.ir.txt | 13 +++++++++++++ .../capturing/extensionReceiverProperty.kt | 8 ++++++++ .../capturing/extensionReceiverProperty.txt | 5 +++++ ...nsionReceiverPropertyExplicit.capturing.txt | 4 ++++ ...tensionReceiverPropertyExplicit.fragment.kt | 1 + .../extensionReceiverPropertyExplicit.ir.txt | 13 +++++++++++++ .../extensionReceiverPropertyExplicit.kt | 8 ++++++++ .../extensionReceiverPropertyExplicit.txt | 5 +++++ ...ensionReceiverPropertyLabeled.capturing.txt | 4 ++++ ...xtensionReceiverPropertyLabeled.fragment.kt | 1 + .../extensionReceiverPropertyLabeled.ir.txt | 13 +++++++++++++ .../extensionReceiverPropertyLabeled.kt | 8 ++++++++ .../extensionReceiverPropertyLabeled.txt | 5 +++++ .../CodeFragmentCapturedValueAnalyzer.kt | 5 ++++- .../CodeFragmentCapturingTestGenerated.java | 18 ++++++++++++++++++ 19 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.capturing.txt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.fragment.kt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.ir.txt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.kt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.txt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.capturing.txt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.fragment.kt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.ir.txt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.kt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.txt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.capturing.txt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.fragment.kt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.ir.txt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.kt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.txt diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java index 1abf272f959..641b355351d 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java @@ -160,6 +160,24 @@ public class FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerate runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverLabeled.kt"); } + @Test + @TestMetadata("extensionReceiverProperty.kt") + public void testExtensionReceiverProperty() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.kt"); + } + + @Test + @TestMetadata("extensionReceiverPropertyExplicit.kt") + public void testExtensionReceiverPropertyExplicit() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.kt"); + } + + @Test + @TestMetadata("extensionReceiverPropertyLabeled.kt") + public void testExtensionReceiverPropertyLabeled() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.kt"); + } + @Test @TestMetadata("initializer.kt") public void testInitializer() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java index ccc8eda15df..91a06a96f7c 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java @@ -160,6 +160,24 @@ public class FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated exten runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverLabeled.kt"); } + @Test + @TestMetadata("extensionReceiverProperty.kt") + public void testExtensionReceiverProperty() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.kt"); + } + + @Test + @TestMetadata("extensionReceiverPropertyExplicit.kt") + public void testExtensionReceiverPropertyExplicit() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.kt"); + } + + @Test + @TestMetadata("extensionReceiverPropertyLabeled.kt") + public void testExtensionReceiverPropertyLabeled() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.kt"); + } + @Test @TestMetadata("initializer.kt") public void testInitializer() throws Exception { diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.capturing.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.capturing.txt new file mode 100644 index 00000000000..f8590a1701c --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.capturing.txt @@ -0,0 +1,4 @@ +ExtensionReceiver[name: ext; isMutated: false; displayText: this@ext] + val R|kotlin/Int|.ext: R|kotlin/String| + get(): R|kotlin/String| + R|kotlin/Int| diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.fragment.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.fragment.kt new file mode 100644 index 00000000000..1b0b18fc4c9 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.fragment.kt @@ -0,0 +1 @@ +dec() \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.ir.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.ir.txt new file mode 100644 index 00000000000..da45e29d8a7 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.ir.txt @@ -0,0 +1,13 @@ +MODULE_FRAGMENT + FILE fqName: fileName:fragment.kt + CLASS CLASS name:CodeFragment modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.CodeFragment + CONSTRUCTOR visibility:public <> () returnType:.CodeFragment [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + FUN name:run visibility:public modality:FINAL <> (p0:kotlin.Int) returnType:kotlin.Int + VALUE_PARAMETER name:p0 index:0 type:kotlin.Int + EXPRESSION_BODY + BLOCK type=kotlin.Int origin=null + CALL 'public final fun dec (): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=null + $this: GET_VAR 'p0: kotlin.Int declared in .CodeFragment.run' type=kotlin.Int origin=null diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.kt new file mode 100644 index 00000000000..f1bc8328606 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.kt @@ -0,0 +1,8 @@ +fun test() { + 1.ext +} + +val Int.ext: String + get() { + return "foo" + } \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.txt new file mode 100644 index 00000000000..a9d2fdaf041 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.txt @@ -0,0 +1,5 @@ +public final class CodeFragment { + // source: 'fragment.kt' + public method (): void + public final static method run(p0: int): int +} diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.capturing.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.capturing.txt new file mode 100644 index 00000000000..f8590a1701c --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.capturing.txt @@ -0,0 +1,4 @@ +ExtensionReceiver[name: ext; isMutated: false; displayText: this@ext] + val R|kotlin/Int|.ext: R|kotlin/String| + get(): R|kotlin/String| + R|kotlin/Int| diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.fragment.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.fragment.kt new file mode 100644 index 00000000000..d3b9147f7ab --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.fragment.kt @@ -0,0 +1 @@ +this.dec() \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.ir.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.ir.txt new file mode 100644 index 00000000000..da45e29d8a7 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.ir.txt @@ -0,0 +1,13 @@ +MODULE_FRAGMENT + FILE fqName: fileName:fragment.kt + CLASS CLASS name:CodeFragment modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.CodeFragment + CONSTRUCTOR visibility:public <> () returnType:.CodeFragment [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + FUN name:run visibility:public modality:FINAL <> (p0:kotlin.Int) returnType:kotlin.Int + VALUE_PARAMETER name:p0 index:0 type:kotlin.Int + EXPRESSION_BODY + BLOCK type=kotlin.Int origin=null + CALL 'public final fun dec (): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=null + $this: GET_VAR 'p0: kotlin.Int declared in .CodeFragment.run' type=kotlin.Int origin=null diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.kt new file mode 100644 index 00000000000..f1bc8328606 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.kt @@ -0,0 +1,8 @@ +fun test() { + 1.ext +} + +val Int.ext: String + get() { + return "foo" + } \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.txt new file mode 100644 index 00000000000..a9d2fdaf041 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.txt @@ -0,0 +1,5 @@ +public final class CodeFragment { + // source: 'fragment.kt' + public method (): void + public final static method run(p0: int): int +} diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.capturing.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.capturing.txt new file mode 100644 index 00000000000..f8590a1701c --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.capturing.txt @@ -0,0 +1,4 @@ +ExtensionReceiver[name: ext; isMutated: false; displayText: this@ext] + val R|kotlin/Int|.ext: R|kotlin/String| + get(): R|kotlin/String| + R|kotlin/Int| diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.fragment.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.fragment.kt new file mode 100644 index 00000000000..4e92b8aa110 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.fragment.kt @@ -0,0 +1 @@ +this@ext.dec() \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.ir.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.ir.txt new file mode 100644 index 00000000000..da45e29d8a7 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.ir.txt @@ -0,0 +1,13 @@ +MODULE_FRAGMENT + FILE fqName: fileName:fragment.kt + CLASS CLASS name:CodeFragment modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.CodeFragment + CONSTRUCTOR visibility:public <> () returnType:.CodeFragment [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + FUN name:run visibility:public modality:FINAL <> (p0:kotlin.Int) returnType:kotlin.Int + VALUE_PARAMETER name:p0 index:0 type:kotlin.Int + EXPRESSION_BODY + BLOCK type=kotlin.Int origin=null + CALL 'public final fun dec (): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=null + $this: GET_VAR 'p0: kotlin.Int declared in .CodeFragment.run' type=kotlin.Int origin=null diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.kt new file mode 100644 index 00000000000..f1bc8328606 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.kt @@ -0,0 +1,8 @@ +fun test() { + 1.ext +} + +val Int.ext: String + get() { + return "foo" + } \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.txt new file mode 100644 index 00000000000..a9d2fdaf041 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.txt @@ -0,0 +1,5 @@ +public final class CodeFragment { + // source: 'fragment.kt' + public method (): void + public final static method run(p0: int): int +} diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt index e8c425b3c7a..f38da37191d 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt @@ -139,7 +139,10 @@ private class CodeFragmentCapturedValueVisitor( register(CodeFragmentCapturedSymbol(capturedValue, symbol, typeRef, contextReceiverNumber)) } } - is FirFunctionSymbol<*> -> { + is FirFunctionSymbol<*>, is FirPropertySymbol -> { + @Suppress("USELESS_IS_CHECK") // Smart-cast is not applied from a 'when' condition in K1 + require(symbol is FirCallableSymbol<*>) + if (contextReceiverNumber >= 0) { val contextReceiver = symbol.resolvedContextReceivers[contextReceiverNumber] val labelName = contextReceiver.labelName diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/CodeFragmentCapturingTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/CodeFragmentCapturingTestGenerated.java index 2e811bb291b..42571b63d63 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/CodeFragmentCapturingTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/CodeFragmentCapturingTestGenerated.java @@ -54,6 +54,24 @@ public class CodeFragmentCapturingTestGenerated extends AbstractCodeFragmentCapt runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverLabeled.kt"); } + @Test + @TestMetadata("extensionReceiverProperty.kt") + public void testExtensionReceiverProperty() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverProperty.kt"); + } + + @Test + @TestMetadata("extensionReceiverPropertyExplicit.kt") + public void testExtensionReceiverPropertyExplicit() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyExplicit.kt"); + } + + @Test + @TestMetadata("extensionReceiverPropertyLabeled.kt") + public void testExtensionReceiverPropertyLabeled() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverPropertyLabeled.kt"); + } + @Test @TestMetadata("initializer.kt") public void testInitializer() throws Exception {