From 66a74ab60e008fb444e434ca1a5c1573b7f299f7 Mon Sep 17 00:00:00 2001 From: Andrei Klunnyi Date: Tue, 28 Feb 2023 15:23:35 +0100 Subject: [PATCH] KT-56941 Gradle KTS navigation: go to declaration (Java) doesn't work Case: ``` options.incrementalAfterFailure = false // assignment operator (a) options.incrementalAfterFailure.set(false) // equivalent (without) (b) // (a) works thanks to AssignResolutionAltererExtension // 'incrementalAfterFailure' is a synthetic Java property // i.e. getIncrementalAfterFailure() // Navigation to 'incrementalAfterFailure' (a) doesn't work. ``` By navigation, we mean opening declaration sources. The reason of the issue lied in sources absence (inability to find them). In general, sources are available via declaration descriptor. To find one for a property, one needs to understand expression kind: read/write/both. Hence, the choice of a getter/setter/both. Since `=` operator is interpreted as a write type expression, a setter was searched. Missing one resulted in corrupted navigation. As a fix we provide getter for the missing setter case. ^KT-56941 fixed --- .../analysis/api/fir/references/FirSimpleNameReference.kt | 8 ++++++-- .../fe10/Fe10SyntheticPropertyAccessorReference.kt | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirSimpleNameReference.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirSimpleNameReference.kt index 2261fcff941..84b056cf42c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirSimpleNameReference.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirSimpleNameReference.kt @@ -51,8 +51,12 @@ internal class KtFirSimpleNameReference( referenceTargetSymbols.flatMap { symbol -> when (symbol) { is KtFirSyntheticJavaPropertySymbol -> - if (isRead) listOfNotNull(symbol.javaGetterSymbol.psi) - else listOfNotNull(symbol.javaSetterSymbol?.psi) + if (isRead) { + listOfNotNull(symbol.javaGetterSymbol.psi) + } else { + if (symbol.javaSetterSymbol == null) listOfNotNull(symbol.javaGetterSymbol.psi) + else listOfNotNull(symbol.javaSetterSymbol?.psi) + } else -> listOfNotNull(symbol.psi) } } diff --git a/analysis/kt-references/kt-references-fe10/src/org/jetbrains/kotlin/references/fe10/Fe10SyntheticPropertyAccessorReference.kt b/analysis/kt-references/kt-references-fe10/src/org/jetbrains/kotlin/references/fe10/Fe10SyntheticPropertyAccessorReference.kt index c9bbe567234..f82f49387f8 100644 --- a/analysis/kt-references/kt-references-fe10/src/org/jetbrains/kotlin/references/fe10/Fe10SyntheticPropertyAccessorReference.kt +++ b/analysis/kt-references/kt-references-fe10/src/org/jetbrains/kotlin/references/fe10/Fe10SyntheticPropertyAccessorReference.kt @@ -32,7 +32,8 @@ class Fe10SyntheticPropertyAccessorReference( if (getter) { result.add(descriptor.getMethod) } else { - result.addIfNotNull(descriptor.setMethod) + if (descriptor.setMethod == null) result.addIfNotNull(descriptor.getMethod) + else result.addIfNotNull(descriptor.setMethod) } } }