From eef850617b5ee91c3203643510e49c43951c2311 Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Tue, 18 Feb 2025 16:59:57 +0100 Subject: [PATCH] [kotlin] Fix navigation to library ctor value parameters #KTIJ-33060 GitOrigin-RevId: bdcf3704bddc7dde65eb29aa2cc2c6499b75107e --- ...alysisApiBasedDeclarationNavigationPolicyImpl.kt | 13 ++++++++++--- ...otlinNavigationToLibrarySourceTestGenerated.java | 5 +++++ .../resolveToStdlib/properties/ctorParameter.kt | 8 ++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 plugins/kotlin/navigation/tests/testData/navigationToLibrarySourcePolicy/resolveToStdlib/properties/ctorParameter.kt diff --git a/plugins/kotlin/navigation/src/org/jetbrains/kotlin/idea/navigation/KotlinAnalysisApiBasedDeclarationNavigationPolicyImpl.kt b/plugins/kotlin/navigation/src/org/jetbrains/kotlin/idea/navigation/KotlinAnalysisApiBasedDeclarationNavigationPolicyImpl.kt index 2df1485e51f5..93393ba69b1c 100644 --- a/plugins/kotlin/navigation/src/org/jetbrains/kotlin/idea/navigation/KotlinAnalysisApiBasedDeclarationNavigationPolicyImpl.kt +++ b/plugins/kotlin/navigation/src/org/jetbrains/kotlin/idea/navigation/KotlinAnalysisApiBasedDeclarationNavigationPolicyImpl.kt @@ -159,10 +159,17 @@ internal class KotlinAnalysisApiBasedDeclarationNavigationPolicyImpl : KotlinDec else -> { val correspondingOwner = getCorrespondingClassLikeDeclaration(containingClass, scope, module) as? KtClassOrObject ?: return null - if (declaration is KtProperty && correspondingOwner.isData() && !declaration.isExtensionDeclaration() && declaration.typeParameters.isEmpty()) { - correspondingOwner.primaryConstructor?.valueParameters?.firstOrNull { it.name == declarationName }?.let { return it } + val declarations = correspondingOwner.declarations + if (declaration is KtProperty) { + declarations.firstOrNull { it is KtProperty && it.name == declaration.name } + ?.let { return it } + + if (!declaration.isExtensionDeclaration() && declaration.typeParameters.isEmpty()) { + correspondingOwner.primaryConstructor?.valueParameters?.firstOrNull { it.name == declarationName } + ?.let { return it } + } } - correspondingOwner.declarations + declarations } } return chooseCallableCandidate(declaration, candidates) diff --git a/plugins/kotlin/navigation/tests/test/org/jetbrains/kotlin/idea/k2/navigation/KotlinNavigationToLibrarySourceTestGenerated.java b/plugins/kotlin/navigation/tests/test/org/jetbrains/kotlin/idea/k2/navigation/KotlinNavigationToLibrarySourceTestGenerated.java index 2fa0bdc8d931..3758ac9fc8fd 100644 --- a/plugins/kotlin/navigation/tests/test/org/jetbrains/kotlin/idea/k2/navigation/KotlinNavigationToLibrarySourceTestGenerated.java +++ b/plugins/kotlin/navigation/tests/test/org/jetbrains/kotlin/idea/k2/navigation/KotlinNavigationToLibrarySourceTestGenerated.java @@ -158,6 +158,11 @@ public abstract class KotlinNavigationToLibrarySourceTestGenerated extends Abstr KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); } + @TestMetadata("ctorParameter.kt") + public void testCtorParameter() throws Exception { + runTest("testData/navigationToLibrarySourcePolicy/resolveToStdlib/properties/ctorParameter.kt"); + } + @TestMetadata("dataClass.kt") public void testDataClass() throws Exception { runTest("testData/navigationToLibrarySourcePolicy/resolveToStdlib/properties/dataClass.kt"); diff --git a/plugins/kotlin/navigation/tests/testData/navigationToLibrarySourcePolicy/resolveToStdlib/properties/ctorParameter.kt b/plugins/kotlin/navigation/tests/testData/navigationToLibrarySourcePolicy/resolveToStdlib/properties/ctorParameter.kt new file mode 100644 index 000000000000..feecc2bb88b2 --- /dev/null +++ b/plugins/kotlin/navigation/tests/testData/navigationToLibrarySourcePolicy/resolveToStdlib/properties/ctorParameter.kt @@ -0,0 +1,8 @@ + +@OptIn(ExperimentalStdlibApi::class) +fun f() { + val b: HexFormat.BytesHexFormat? = null + b?.bytesPerLine +} + +// REF: (kotlin.text.HexFormat.BytesHexFormat @ jar://kotlin-stdlib-sources.jar!/commonMain/kotlin/text/HexFormat.kt) public val bytesPerLine: Int \ No newline at end of file