FIR IDE: use non-fake override fir elements when finding psi for fir

This commit is contained in:
Ilya Kirillov
2020-07-07 22:16:42 +03:00
parent d10e3f91fa
commit 22054c8507
3 changed files with 20 additions and 5 deletions
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.psi 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.KotlinFullClassNameIndex
import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex
import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelTypeAliasFqNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelTypeAliasFqNameIndex
@@ -51,7 +52,7 @@ object FirIdeDeserializedDeclarationSourceProvider {
.orEmpty() .orEmpty()
} }
return function.chooseCorrespondingPsi(candidates) return function.unrollFakeOverrides().chooseCorrespondingPsi(candidates)
} }
private fun provideSourceForProperty(property: FirProperty, project: Project): PsiElement? { private fun provideSourceForProperty(property: FirProperty, project: Project): PsiElement? {
@@ -89,7 +90,7 @@ object FirIdeDeserializedDeclarationSourceProvider {
val containingKtClass = constructor.containingKtClass(project) ?: return null val containingKtClass = constructor.containingKtClass(project) ?: return null
if (constructor.isPrimary) return containingKtClass.primaryConstructor if (constructor.isPrimary) return containingKtClass.primaryConstructor
return constructor.chooseCorrespondingPsi(containingKtClass.secondaryConstructors) return constructor.unrollFakeOverrides().chooseCorrespondingPsi(containingKtClass.secondaryConstructors)
} }
private fun FirFunction<*>.chooseCorrespondingPsi( private fun FirFunction<*>.chooseCorrespondingPsi(
@@ -6,12 +6,15 @@
package org.jetbrains.kotlin.idea.fir package org.jetbrains.kotlin.idea.fir
import org.jetbrains.kotlin.fir.FirElement 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.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol 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.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade
@@ -58,4 +61,15 @@ fun FirFunctionCall.getCalleeSymbol(): FirBasedSymbol<*>? =
calleeReference.getResolvedSymbolOfNameReference() calleeReference.getResolvedSymbolOfNameReference()
fun FirReference.getResolvedSymbolOfNameReference(): FirBasedSymbol<*>? = fun FirReference.getResolvedSymbolOfNameReference(): FirBasedSymbol<*>? =
(this as? FirResolvedNamedReference)?.resolvedSymbol (this as? FirResolvedNamedReference)?.resolvedSymbol
inline fun <reified D> D.unrollFakeOverrides(): D where D : FirDeclaration, D : FirSymbolOwner<D> {
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
}
@@ -1,7 +1,7 @@
// IGNORE_FIR
import kotlin.properties.Delegates import kotlin.properties.Delegates
var x: Int <caret>by Delegates.notNull() var x: Int <caret>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) // REF: (in kotlin.properties.ReadWriteProperty).setValue(T, kotlin.reflect.KProperty<*>, V)