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.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
|
||||||
|
}
|
||||||
|
|||||||
+2
-2
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user