diff --git a/compiler/psi/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReference.kt b/compiler/psi/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReference.kt index 9139ad53c66..b5429b4c3b4 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReference.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReference.kt @@ -20,6 +20,10 @@ abstract class KtDestructuringDeclarationReference( abstract override fun canRename(): Boolean + override fun resolve() = multiResolve(false).asSequence() + .map { it.element } + .first { it is KtDestructuringDeclarationEntry } + override fun handleElementRename(newElementName: String): PsiElement? { if (canRename()) return expression throw IncorrectOperationException() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index d2b1aebdf97..f2777900333 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -19,10 +19,7 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind -import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtObjectLiteralExpression -import org.jetbrains.kotlin.psi.KtPrimaryConstructor +import org.jetbrains.kotlin.psi.* internal class KtFirSymbolContainingDeclarationProvider( override val analysisSession: KtFirAnalysisSession, @@ -81,13 +78,19 @@ internal class KtFirSymbolContainingDeclarationProvider( } return when (symbol.origin) { - KtSymbolOrigin.SOURCE -> thisSource.parentOfType() + KtSymbolOrigin.SOURCE -> thisSource.getContainingKtDeclaration() ?: error("Containing declaration should present for non-toplevel declaration") KtSymbolOrigin.SOURCE_MEMBER_GENERATED -> thisSource as KtDeclaration else -> error("Unsupported declaration origin ${symbol.origin}") } } + private fun PsiElement.getContainingKtDeclaration(): KtDeclaration? = + when (val container = this.parentOfType()) { + is KtDestructuringDeclaration -> container.parentOfType() + else -> container + } + private fun getContainingDeclarationForLibrarySymbol(symbol: KtSymbolWithKind): KtSymbolWithKind = with(analysisSession) { require(symbol.origin == KtSymbolOrigin.LIBRARY || symbol.origin == KtSymbolOrigin.JAVA) check(symbol.symbolKind == KtSymbolKind.MEMBER) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirDestructuringDeclarationReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirDestructuringDeclarationReference.kt index b535d035db9..f2b373f4148 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirDestructuringDeclarationReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirDestructuringDeclarationReference.kt @@ -23,7 +23,14 @@ class KtFirDestructuringDeclarationReference( override fun KtAnalysisSession.resolveToSymbols(): Collection { check(this is KtFirAnalysisSession) val fir = expression.getOrBuildFirSafe(firResolveState) ?: return emptyList() - val componentFunctionSymbol = (fir.initializer as? FirComponentCall)?.getCalleeSymbol() ?: return emptyList() - return listOfNotNull(componentFunctionSymbol.fir.buildSymbol(firSymbolBuilder)) + return listOfNotNull( + fir.buildSymbol(firSymbolBuilder), + getComponentNSymbol(fir) + ) + } + + private fun KtFirAnalysisSession.getComponentNSymbol(fir: FirProperty): KtSymbol? { + val componentFunctionSymbol = (fir.initializer as? FirComponentCall)?.getCalleeSymbol() ?: return null + return componentFunctionSymbol.fir.buildSymbol(firSymbolBuilder) } } diff --git a/idea/idea-frontend-fir/testData/referenceResolve/MultiDeclarationExtension.txt b/idea/idea-frontend-fir/testData/referenceResolve/MultiDeclarationExtension.txt index f35179ad9c2..9415fdefeef 100644 --- a/idea/idea-frontend-fir/testData/referenceResolve/MultiDeclarationExtension.txt +++ b/idea/idea-frontend-fir/testData/referenceResolve/MultiDeclarationExtension.txt @@ -1,2 +1,3 @@ Resolved to: -0: (in a) operator fun a.A.component2(): kotlin.Int +0: (in : main) val b: kotlin.Int +1: (in a) operator fun a.A.component2(): kotlin.Int \ No newline at end of file diff --git a/idea/idea-frontend-fir/testData/referenceResolve/MultiDeclarationMember.txt b/idea/idea-frontend-fir/testData/referenceResolve/MultiDeclarationMember.txt index 64e8a33fec5..3e9d7e9d404 100644 --- a/idea/idea-frontend-fir/testData/referenceResolve/MultiDeclarationMember.txt +++ b/idea/idea-frontend-fir/testData/referenceResolve/MultiDeclarationMember.txt @@ -1,2 +1,3 @@ Resolved to: -0: (in a.MyPair) operator fun component2(): kotlin.Int +0: (in : main) val b: kotlin.Int +1: (in a.MyPair) operator fun component2(): kotlin.Int \ No newline at end of file