From 22054c8507d32e8763ffb48534e84d06675e4948 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 7 Jul 2020 22:16:42 +0300 Subject: [PATCH] FIR IDE: use non-fake override fir elements when finding psi for fir --- ...irIdeDeserializedDeclarationSourceProvider.kt | 5 +++-- .../org/jetbrains/kotlin/idea/fir/FirUtils.kt | 16 +++++++++++++++- .../inStandardLibrary/notNull.kt | 4 ++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt index 625fe127ad1..b15006d32b2 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.psi +import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelTypeAliasFqNameIndex @@ -51,7 +52,7 @@ object FirIdeDeserializedDeclarationSourceProvider { .orEmpty() } - return function.chooseCorrespondingPsi(candidates) + return function.unrollFakeOverrides().chooseCorrespondingPsi(candidates) } private fun provideSourceForProperty(property: FirProperty, project: Project): PsiElement? { @@ -89,7 +90,7 @@ object FirIdeDeserializedDeclarationSourceProvider { val containingKtClass = constructor.containingKtClass(project) ?: return null if (constructor.isPrimary) return containingKtClass.primaryConstructor - return constructor.chooseCorrespondingPsi(containingKtClass.secondaryConstructors) + return constructor.unrollFakeOverrides().chooseCorrespondingPsi(containingKtClass.secondaryConstructors) } private fun FirFunction<*>.chooseCorrespondingPsi( diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt index 0b4d09e08ad..a83a9a4b10c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt @@ -6,12 +6,15 @@ package org.jetbrains.kotlin.idea.fir import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirSymbolOwner +import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade @@ -58,4 +61,15 @@ fun FirFunctionCall.getCalleeSymbol(): FirBasedSymbol<*>? = calleeReference.getResolvedSymbolOfNameReference() fun FirReference.getResolvedSymbolOfNameReference(): FirBasedSymbol<*>? = - (this as? FirResolvedNamedReference)?.resolvedSymbol \ No newline at end of file + (this as? FirResolvedNamedReference)?.resolvedSymbol + +inline fun D.unrollFakeOverrides(): D where D : FirDeclaration, D : FirSymbolOwner { + val symbol = symbol + if (symbol !is PossiblyFirFakeOverrideSymbol<*, *>) return this + if (!symbol.isFakeOverride) return this + var current: FirBasedSymbol<*>? = symbol.overriddenSymbol + while (current is PossiblyFirFakeOverrideSymbol<*, *> && current.isFakeOverride) { + current = current.overriddenSymbol + } + return current?.fir as D +} diff --git a/idea/testData/resolve/references/delegatedPropertyAccessors/inStandardLibrary/notNull.kt b/idea/testData/resolve/references/delegatedPropertyAccessors/inStandardLibrary/notNull.kt index 324ac6b0e90..263685a487b 100644 --- a/idea/testData/resolve/references/delegatedPropertyAccessors/inStandardLibrary/notNull.kt +++ b/idea/testData/resolve/references/delegatedPropertyAccessors/inStandardLibrary/notNull.kt @@ -1,7 +1,7 @@ -// IGNORE_FIR - import kotlin.properties.Delegates var x: Int by Delegates.notNull() +// MULTIRESOLVE +// REF: (in kotlin.properties.ReadWriteProperty).getValue(T, kotlin.reflect.KProperty<*>) // REF: (in kotlin.properties.ReadWriteProperty).setValue(T, kotlin.reflect.KProperty<*>, V)