From 7a4bd420740f0afc2f4222fa2a33547abb93b781 Mon Sep 17 00:00:00 2001 From: Frederik Haselmeier Date: Mon, 23 Jun 2025 09:58:05 +0200 Subject: [PATCH] [kotlin] KTIJ-34551 - Fixed property references not suggesting nested class properties ^KTIJ-34551 fixed GitOrigin-RevId: f0da2a5e590fc640965aca80345b7285b78665c0 --- .../base/analysis/api/utils/resolveUtils.kt | 7 ++++++- .../common/callableReference/NestedClass.kt | 19 +++++++++++++++++++ .../K1JSBasicCompletionTestGenerated.java | 5 +++++ .../K1JvmBasicCompletionTestGenerated.java | 5 +++++ ...1MLPerformanceCompletionTestGenerated.java | 5 +++++ ...icCompletionLegacyStdlibTestGenerated.java | 5 +++++ .../K2JvmBasicCompletionTestGenerated.java | 5 +++++ ...veJvmKotlinKmpCompletionTestGenerated.java | 5 +++++ .../JsKotlinKmpCompletionTestGenerated.java | 5 +++++ ...LinuxKotlinKmpCompletionTestGenerated.java | 5 +++++ 10 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 plugins/kotlin/completion/testData/basic/common/callableReference/NestedClass.kt diff --git a/plugins/kotlin/base/analysis-api/analysis-api-utils/src/org/jetbrains/kotlin/idea/base/analysis/api/utils/resolveUtils.kt b/plugins/kotlin/base/analysis-api/analysis-api-utils/src/org/jetbrains/kotlin/idea/base/analysis/api/utils/resolveUtils.kt index 020bafc31035..fa07a8d375fa 100644 --- a/plugins/kotlin/base/analysis-api/analysis-api-utils/src/org/jetbrains/kotlin/idea/base/analysis/api/utils/resolveUtils.kt +++ b/plugins/kotlin/base/analysis-api/analysis-api-utils/src/org/jetbrains/kotlin/idea/base/analysis/api/utils/resolveUtils.kt @@ -122,7 +122,12 @@ fun collectReceiverTypesForElement(callElement: KtElement, explicitReceiver: KtE context(KaSession) fun collectReceiverTypesForExplicitReceiverExpression(explicitReceiver: KtExpression): List { - explicitReceiver.referenceExpression()?.mainReference?.let { receiverReference -> + val referenceExpression = when (explicitReceiver) { + is KtDotQualifiedExpression -> explicitReceiver.selectorExpression ?: explicitReceiver + else -> explicitReceiver + } + + referenceExpression.referenceExpression()?.mainReference?.let { receiverReference -> val receiverSymbol = receiverReference.resolveToExpandedSymbol() if (receiverSymbol == null || receiverSymbol is KaPackageSymbol) return emptyList() diff --git a/plugins/kotlin/completion/testData/basic/common/callableReference/NestedClass.kt b/plugins/kotlin/completion/testData/basic/common/callableReference/NestedClass.kt new file mode 100644 index 000000000000..ccd5fe27e21e --- /dev/null +++ b/plugins/kotlin/completion/testData/basic/common/callableReference/NestedClass.kt @@ -0,0 +1,19 @@ + +class Test { + val outerVal: Int = 5 + data class Data ( + val innerVal: String + ) { + fun innerFun() { + + } + } +} + +fun main() { + Test.Data:: +} + +// EXIST: innerVal +// EXIST: { "itemText": "innerFun", "tailText": "()" } +// ABSENT: outerVal \ No newline at end of file diff --git a/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1JSBasicCompletionTestGenerated.java b/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1JSBasicCompletionTestGenerated.java index 58316a2f4839..2c697645a620 100644 --- a/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1JSBasicCompletionTestGenerated.java +++ b/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1JSBasicCompletionTestGenerated.java @@ -655,6 +655,11 @@ public abstract class K1JSBasicCompletionTestGenerated extends AbstractK1JSBasic runTest("../testData/basic/common/callableReference/JavaSyntheticPropertyReferenceTrueNegative3.kt"); } + @TestMetadata("NestedClass.kt") + public void testNestedClass() throws Exception { + runTest("../testData/basic/common/callableReference/NestedClass.kt"); + } + @TestMetadata("NonEmptyQualifier.kt") public void testNonEmptyQualifier() throws Exception { runTest("../testData/basic/common/callableReference/NonEmptyQualifier.kt"); diff --git a/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1JvmBasicCompletionTestGenerated.java b/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1JvmBasicCompletionTestGenerated.java index bd12728295ca..01f43175e49a 100644 --- a/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1JvmBasicCompletionTestGenerated.java +++ b/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1JvmBasicCompletionTestGenerated.java @@ -655,6 +655,11 @@ public abstract class K1JvmBasicCompletionTestGenerated extends AbstractK1JvmBas runTest("../testData/basic/common/callableReference/JavaSyntheticPropertyReferenceTrueNegative3.kt"); } + @TestMetadata("NestedClass.kt") + public void testNestedClass() throws Exception { + runTest("../testData/basic/common/callableReference/NestedClass.kt"); + } + @TestMetadata("NonEmptyQualifier.kt") public void testNonEmptyQualifier() throws Exception { runTest("../testData/basic/common/callableReference/NonEmptyQualifier.kt"); diff --git a/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1MLPerformanceCompletionTestGenerated.java b/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1MLPerformanceCompletionTestGenerated.java index bd8ec3f3d9a2..632cffc25c60 100644 --- a/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1MLPerformanceCompletionTestGenerated.java +++ b/plugins/kotlin/completion/tests-k1/test/org/jetbrains/kotlin/idea/completion/test/K1MLPerformanceCompletionTestGenerated.java @@ -655,6 +655,11 @@ public abstract class K1MLPerformanceCompletionTestGenerated extends AbstractK1M runTest("../testData/basic/common/callableReference/JavaSyntheticPropertyReferenceTrueNegative3.kt"); } + @TestMetadata("NestedClass.kt") + public void testNestedClass() throws Exception { + runTest("../testData/basic/common/callableReference/NestedClass.kt"); + } + @TestMetadata("NonEmptyQualifier.kt") public void testNonEmptyQualifier() throws Exception { runTest("../testData/basic/common/callableReference/NonEmptyQualifier.kt"); diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/K2JsBasicCompletionLegacyStdlibTestGenerated.java b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/K2JsBasicCompletionLegacyStdlibTestGenerated.java index 12786a3740ef..6505672b0d07 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/K2JsBasicCompletionLegacyStdlibTestGenerated.java +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/K2JsBasicCompletionLegacyStdlibTestGenerated.java @@ -655,6 +655,11 @@ public abstract class K2JsBasicCompletionLegacyStdlibTestGenerated extends Abstr runTest("../../completion/testData/basic/common/callableReference/JavaSyntheticPropertyReferenceTrueNegative3.kt"); } + @TestMetadata("NestedClass.kt") + public void testNestedClass() throws Exception { + runTest("../../completion/testData/basic/common/callableReference/NestedClass.kt"); + } + @TestMetadata("NonEmptyQualifier.kt") public void testNonEmptyQualifier() throws Exception { runTest("../../completion/testData/basic/common/callableReference/NonEmptyQualifier.kt"); diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/K2JvmBasicCompletionTestGenerated.java b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/K2JvmBasicCompletionTestGenerated.java index 8bd5bf572c62..b50984258e2b 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/K2JvmBasicCompletionTestGenerated.java +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/K2JvmBasicCompletionTestGenerated.java @@ -655,6 +655,11 @@ public abstract class K2JvmBasicCompletionTestGenerated extends AbstractK2JvmBas runTest("../../completion/testData/basic/common/callableReference/JavaSyntheticPropertyReferenceTrueNegative3.kt"); } + @TestMetadata("NestedClass.kt") + public void testNestedClass() throws Exception { + runTest("../../completion/testData/basic/common/callableReference/NestedClass.kt"); + } + @TestMetadata("NonEmptyQualifier.kt") public void testNonEmptyQualifier() throws Exception { runTest("../../completion/testData/basic/common/callableReference/NonEmptyQualifier.kt"); diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/CommonNativeJvmKotlinKmpCompletionTestGenerated.java b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/CommonNativeJvmKotlinKmpCompletionTestGenerated.java index 58688293a5a4..4bec3dcbdb94 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/CommonNativeJvmKotlinKmpCompletionTestGenerated.java +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/CommonNativeJvmKotlinKmpCompletionTestGenerated.java @@ -684,6 +684,11 @@ public abstract class CommonNativeJvmKotlinKmpCompletionTestGenerated extends Ab runTest("../../completion/testData/basic/common/callableReference/JavaSyntheticPropertyReferenceTrueNegative3.kt"); } + @TestMetadata("NestedClass.kt") + public void testNestedClass() throws Exception { + runTest("../../completion/testData/basic/common/callableReference/NestedClass.kt"); + } + @TestMetadata("NonEmptyQualifier.kt") public void testNonEmptyQualifier() throws Exception { runTest("../../completion/testData/basic/common/callableReference/NonEmptyQualifier.kt"); diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/JsKotlinKmpCompletionTestGenerated.java b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/JsKotlinKmpCompletionTestGenerated.java index 1d1e82bfc560..255c8676ad20 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/JsKotlinKmpCompletionTestGenerated.java +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/JsKotlinKmpCompletionTestGenerated.java @@ -684,6 +684,11 @@ public abstract class JsKotlinKmpCompletionTestGenerated extends AbstractKotlinK runTest("../../completion/testData/basic/common/callableReference/JavaSyntheticPropertyReferenceTrueNegative3.kt"); } + @TestMetadata("NestedClass.kt") + public void testNestedClass() throws Exception { + runTest("../../completion/testData/basic/common/callableReference/NestedClass.kt"); + } + @TestMetadata("NonEmptyQualifier.kt") public void testNonEmptyQualifier() throws Exception { runTest("../../completion/testData/basic/common/callableReference/NonEmptyQualifier.kt"); diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/NativeLinuxKotlinKmpCompletionTestGenerated.java b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/NativeLinuxKotlinKmpCompletionTestGenerated.java index d7e1700148f6..156df290b90b 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/NativeLinuxKotlinKmpCompletionTestGenerated.java +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/completion/kmpBasic/NativeLinuxKotlinKmpCompletionTestGenerated.java @@ -684,6 +684,11 @@ public abstract class NativeLinuxKotlinKmpCompletionTestGenerated extends Abstra runTest("../../completion/testData/basic/common/callableReference/JavaSyntheticPropertyReferenceTrueNegative3.kt"); } + @TestMetadata("NestedClass.kt") + public void testNestedClass() throws Exception { + runTest("../../completion/testData/basic/common/callableReference/NestedClass.kt"); + } + @TestMetadata("NonEmptyQualifier.kt") public void testNonEmptyQualifier() throws Exception { runTest("../../completion/testData/basic/common/callableReference/NonEmptyQualifier.kt");