FIR IDE: use non-fake override fir elements when finding psi for fir
This commit is contained in:
+3
-2
@@ -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(
|
||||
|
||||
@@ -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
|
||||
(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
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
// IGNORE_FIR
|
||||
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user