FIR IDE: rename reference classes to KtFir*Reference for consistency

This commit is contained in:
Ilya Kirillov
2020-06-27 00:18:16 +03:00
parent 66933ea2fe
commit 226d514788
21 changed files with 65 additions and 68 deletions
@@ -11,8 +11,8 @@ import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.fir.highlighter.visitors.FirAfterResolveHighlightingVisitor import org.jetbrains.kotlin.idea.fir.highlighter.visitors.FirAfterResolveHighlightingVisitor
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.highlighter.AbstractKotlinPsiChecker import org.jetbrains.kotlin.idea.highlighter.AbstractKotlinPsiChecker
import org.jetbrains.kotlin.idea.highlighter.Diagnostic2Annotation import org.jetbrains.kotlin.idea.highlighter.Diagnostic2Annotation
import org.jetbrains.kotlin.idea.highlighter.IdeErrorMessages import org.jetbrains.kotlin.idea.highlighter.IdeErrorMessages
@@ -29,7 +29,7 @@ class KotlinFirPsiChecker : AbstractKotlinPsiChecker() {
if (ApplicationManager.getApplication().isDispatchThread) { if (ApplicationManager.getApplication().isDispatchThread) {
throw ProcessCanceledException() throw ProcessCanceledException()
} }
val analysisSession = FirAnalysisSession(element) val analysisSession = KtFirAnalysisSession(element)
highlightDiagnostics(element, analysisSession, holder) highlightDiagnostics(element, analysisSession, holder)
@@ -38,7 +38,7 @@ class KotlinFirPsiChecker : AbstractKotlinPsiChecker() {
.forEach(element::accept) .forEach(element::accept)
} }
private fun highlightDiagnostics(element: KtElement, analysisSession: FrontendAnalysisSession, holder: AnnotationHolder) { private fun highlightDiagnostics(element: KtElement, analysisSession: KtAnalysisSession, holder: AnnotationHolder) {
val diagnostics = analysisSession.getDiagnosticsForElement(element) val diagnostics = analysisSession.getDiagnosticsForElement(element)
if (diagnostics.isEmpty()) return if (diagnostics.isEmpty()) return
@@ -8,12 +8,12 @@ package org.jetbrains.kotlin.idea.fir.highlighter.visitors
import com.intellij.lang.annotation.AnnotationHolder import com.intellij.lang.annotation.AnnotationHolder
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.KotlinIdeaAnalysisBundle import org.jetbrains.kotlin.idea.KotlinIdeaAnalysisBundle
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.ImplicitReceiverSmartcastKind import org.jetbrains.kotlin.idea.frontend.api.ImplicitReceiverSmartcastKind
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
internal class ExpressionsSmartcastHighlightingVisitor( internal class ExpressionsSmartcastHighlightingVisitor(
analysisSession: FrontendAnalysisSession, analysisSession: KtAnalysisSession,
holder: AnnotationHolder holder: AnnotationHolder
) : FirAfterResolveHighlightingVisitor(analysisSession, holder) { ) : FirAfterResolveHighlightingVisitor(analysisSession, holder) {
override fun visitExpression(expression: KtExpression) { override fun visitExpression(expression: KtExpression) {
@@ -6,17 +6,17 @@
package org.jetbrains.kotlin.idea.fir.highlighter.visitors package org.jetbrains.kotlin.idea.fir.highlighter.visitors
import com.intellij.lang.annotation.AnnotationHolder import com.intellij.lang.annotation.AnnotationHolder
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.highlighter.HighlightingVisitor import org.jetbrains.kotlin.idea.highlighter.HighlightingVisitor
abstract class FirAfterResolveHighlightingVisitor( abstract class FirAfterResolveHighlightingVisitor(
protected val analysisSession: FrontendAnalysisSession, protected val analysisSession: KtAnalysisSession,
protected val holder: AnnotationHolder protected val holder: AnnotationHolder
) : HighlightingVisitor(holder) { ) : HighlightingVisitor(holder) {
companion object { companion object {
fun createListOfVisitors( fun createListOfVisitors(
analysisSession: FrontendAnalysisSession, analysisSession: KtAnalysisSession,
holder: AnnotationHolder holder: AnnotationHolder
): List<FirAfterResolveHighlightingVisitor> = listOf( ): List<FirAfterResolveHighlightingVisitor> = listOf(
TypeHighlightingVisitor(analysisSession, holder), TypeHighlightingVisitor(analysisSession, holder),
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.serialization.deserialization.KOTLIN_SUSPEND_BUILT_I
import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingColors as Colors import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingColors as Colors
internal class FunctionCallHighlightingVisitor( internal class FunctionCallHighlightingVisitor(
analysisSession: FrontendAnalysisSession, analysisSession: KtAnalysisSession,
holder: AnnotationHolder holder: AnnotationHolder
) : FirAfterResolveHighlightingVisitor(analysisSession, holder) { ) : FirAfterResolveHighlightingVisitor(analysisSession, holder) {
override fun visitBinaryExpression(expression: KtBinaryExpression) { override fun visitBinaryExpression(expression: KtBinaryExpression) {
@@ -11,14 +11,14 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.idea.fir.highlighter.isAnnotationClass import org.jetbrains.kotlin.idea.fir.highlighter.isAnnotationClass
import org.jetbrains.kotlin.idea.fir.highlighter.textAttributesKeyForTypeDeclaration import org.jetbrains.kotlin.idea.fir.highlighter.textAttributesKeyForTypeDeclaration
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.highlighter.NameHighlighter import org.jetbrains.kotlin.idea.highlighter.NameHighlighter
import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingColors as Colors import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingColors as Colors
internal class TypeHighlightingVisitor( internal class TypeHighlightingVisitor(
analysisSession: FrontendAnalysisSession, analysisSession: KtAnalysisSession,
holder: AnnotationHolder holder: AnnotationHolder
) : FirAfterResolveHighlightingVisitor(analysisSession, holder) { ) : FirAfterResolveHighlightingVisitor(analysisSession, holder) {
override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) { override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) {
@@ -14,7 +14,7 @@ import com.intellij.psi.util.PsiUtilCore
import com.intellij.psi.util.parentOfType import com.intellij.psi.util.parentOfType
import org.jetbrains.kotlin.idea.KotlinIdeaAnalysisBundle import org.jetbrains.kotlin.idea.KotlinIdeaAnalysisBundle
import org.jetbrains.kotlin.idea.fir.highlighter.textAttributesKeyForPropertyDeclaration import org.jetbrains.kotlin.idea.fir.highlighter.textAttributesKeyForPropertyDeclaration
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.highlighter.NameHighlighter import org.jetbrains.kotlin.idea.highlighter.NameHighlighter
import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingColors as Colors import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingColors as Colors
internal class VariableReferenceHighlightingVisitor( internal class VariableReferenceHighlightingVisitor(
analysisSession: FrontendAnalysisSession, analysisSession: KtAnalysisSession,
holder: AnnotationHolder holder: AnnotationHolder
) : FirAfterResolveHighlightingVisitor(analysisSession, holder) { ) : FirAfterResolveHighlightingVisitor(analysisSession, holder) {
override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) { override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) {
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
abstract class FrontendAnalysisSession(project: Project) : Invalidatable { abstract class KtAnalysisSession(project: Project) : Invalidatable {
protected open val validityToken = ReadActionConfinementValidityToken(project) protected open val validityToken = ReadActionConfinementValidityToken(project)
override fun isValid(): Boolean = validityToken.isValid() override fun isValid(): Boolean = validityToken.isValid()
override fun invalidationReason(): String = validityToken.invalidationReason() override fun invalidationReason(): String = validityToken.invalidationReason()
@@ -10,15 +10,15 @@ import org.jetbrains.kotlin.idea.references.KtReference
import org.jetbrains.kotlin.idea.references.KtSimpleReference import org.jetbrains.kotlin.idea.references.KtSimpleReference
interface KtSymbolBasedReference : KtReference { interface KtSymbolBasedReference : KtReference {
fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection<KtSymbol> fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection<KtSymbol>
} }
fun KtReference.resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection<KtSymbol> { fun KtReference.resolveToSymbols(analysisSession: KtAnalysisSession): Collection<KtSymbol> {
check(this is KtSymbolBasedReference) { "To get reference symbol the one should be KtSymbolBasedReference" } check(this is KtSymbolBasedReference) { "To get reference symbol the one should be KtSymbolBasedReference" }
return resolveToSymbols(analysisSession) return resolveToSymbols(analysisSession)
} }
fun KtSimpleReference<*>.resolveToSymbol(analysisSession: FrontendAnalysisSession): KtSymbol? { fun KtSimpleReference<*>.resolveToSymbol(analysisSession: KtAnalysisSession): KtSymbol? {
check(this is KtSymbolBasedReference) { "To get reference symbol the one should be KtSymbolBasedReference" } check(this is KtSymbolBasedReference) { "To get reference symbol the one should be KtSymbolBasedReference" }
return resolveToSymbols(analysisSession).singleOrNull() return resolveToSymbols(analysisSession).singleOrNull()
} }
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.idea.fir.* import org.jetbrains.kotlin.idea.fir.*
import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade
import org.jetbrains.kotlin.idea.frontend.api.* import org.jetbrains.kotlin.idea.frontend.api.*
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.FirKtSymbolProvider import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbolProvider
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolProvider import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolProvider
@@ -32,9 +32,9 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
class FirAnalysisSession( class KtFirAnalysisSession(
element: KtElement element: KtElement
) : FrontendAnalysisSession(element.project) { ) : KtAnalysisSession(element.project) {
internal val token get() = validityToken internal val token get() = validityToken
internal val firSymbolBuilder = KtSymbolByFirBuilder( internal val firSymbolBuilder = KtSymbolByFirBuilder(
@@ -44,7 +44,7 @@ class FirAnalysisSession(
) )
override val symbolProvider: KtSymbolProvider = override val symbolProvider: KtSymbolProvider =
FirKtSymbolProvider( KtFirSymbolProvider(
this, this,
element.session.firSymbolProvider, element.session.firSymbolProvider,
firSymbolBuilder firSymbolBuilder
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
internal class FirKtSymbolProvider( internal class KtFirSymbolProvider(
override val token: Invalidatable, override val token: Invalidatable,
firSymbolProvider: FirSymbolProvider, firSymbolProvider: FirSymbolProvider,
private val firSymbolBuilder: KtSymbolByFirBuilder private val firSymbolBuilder: KtSymbolByFirBuilder
@@ -82,7 +82,7 @@ internal object FirReferenceResolveHelper {
} }
internal fun resolveSimpleNameReference( internal fun resolveSimpleNameReference(
ref: KtSimpleNameReferenceFirImpl, ref: KtFirSimpleNameReference,
symbolBuilder: KtSymbolByFirBuilder symbolBuilder: KtSymbolByFirBuilder
): Collection<KtSymbol> { ): Collection<KtSymbol> {
val expression = ref.expression val expression = ref.expression
@@ -6,18 +6,18 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtImportAlias import org.jetbrains.kotlin.psi.KtImportAlias
import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression
internal class KtSimpleNameReferenceFirImpl( internal class KtFirSimpleNameReference(
expression: KtSimpleNameExpression expression: KtSimpleNameExpression
) : KtSimpleNameReference(expression), FirKtReference { ) : KtSimpleNameReference(expression), KtFirReference {
override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection<KtSymbol> { override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection<KtSymbol> {
check(analysisSession is FirAnalysisSession) check(analysisSession is KtFirAnalysisSession)
return FirReferenceResolveHelper.resolveSimpleNameReference(this, analysisSession.firSymbolBuilder) return FirReferenceResolveHelper.resolveSimpleNameReference(this, analysisSession.firSymbolBuilder)
} }
@@ -8,11 +8,11 @@ package org.jetbrains.kotlin.idea.references
class KotlinFirReferenceContributor : KotlinReferenceProviderContributor { class KotlinFirReferenceContributor : KotlinReferenceProviderContributor {
override fun registerReferenceProviders(registrar: KotlinPsiReferenceRegistrar) { override fun registerReferenceProviders(registrar: KotlinPsiReferenceRegistrar) {
with(registrar) { with(registrar) {
registerProvider(factory = ::KtSimpleNameReferenceFirImpl) registerProvider(factory = ::KtFirSimpleNameReference)
registerProvider(factory = ::KtForLoopInReferenceFirImpl) registerProvider(factory = ::KtFirForLoopInReference)
registerProvider(factory = ::KtInvokeFunctionReferenceFirImpl) registerProvider(factory = ::KtFirInvokeFunctionReference)
registerProvider(factory = ::KtPropertyDelegationMethodsReferenceFirImpl) registerProvider(factory = ::KtFirPropertyDelegationMethodsReference)
registerProvider(factory = ::KtDestructuringDeclarationReferenceFirImpl) registerProvider(factory = ::KtFirDestructuringDeclarationReference)
} }
} }
} }
@@ -9,19 +9,19 @@ import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.idea.fir.getCalleeSymbol import org.jetbrains.kotlin.idea.fir.getCalleeSymbol
import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry
class KtDestructuringDeclarationReferenceFirImpl( class KtFirDestructuringDeclarationReference(
element: KtDestructuringDeclarationEntry element: KtDestructuringDeclarationEntry
) : KtDestructuringDeclarationReference(element), FirKtReference { ) : KtDestructuringDeclarationReference(element), KtFirReference {
override fun canRename(): Boolean = false //todo override fun canRename(): Boolean = false //todo
override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection<KtSymbol> { override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection<KtSymbol> {
check(analysisSession is FirAnalysisSession) check(analysisSession is KtFirAnalysisSession)
val fir = expression.getOrBuildFirSafe<FirProperty>() ?: return emptyList() val fir = expression.getOrBuildFirSafe<FirProperty>() ?: return emptyList()
val componentFunctionSymbol = (fir.initializer as? FirComponentCall)?.getCalleeSymbol() ?: return emptyList() val componentFunctionSymbol = (fir.initializer as? FirComponentCall)?.getCalleeSymbol() ?: return emptyList()
return listOfNotNull(componentFunctionSymbol.fir.buildSymbol(analysisSession.firSymbolBuilder)) return listOfNotNull(componentFunctionSymbol.fir.buildSymbol(analysisSession.firSymbolBuilder))
@@ -11,16 +11,15 @@ import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe
import org.jetbrains.kotlin.idea.fir.getResolvedSymbolOfNameReference import org.jetbrains.kotlin.idea.fir.getResolvedSymbolOfNameReference
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.psi.KtForExpression import org.jetbrains.kotlin.psi.KtForExpression
open class KtForLoopInReferenceFirImpl(expression: KtForExpression) : KtForLoopInReference(expression), FirKtReference { open class KtFirForLoopInReference(expression: KtForExpression) : KtForLoopInReference(expression), KtFirReference {
override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection<KtSymbol> {
override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection<KtSymbol> { check(analysisSession is KtFirAnalysisSession)
check(analysisSession is FirAnalysisSession)
val firLoop = expression.getOrBuildFirSafe<FirWhileLoop>() ?: return emptyList() val firLoop = expression.getOrBuildFirSafe<FirWhileLoop>() ?: return emptyList()
val condition = firLoop.condition as? FirFunctionCall val condition = firLoop.condition as? FirFunctionCall
val iterator = run { val iterator = run {
@@ -5,19 +5,18 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.VariableAsFunctionLikeCallInfo import org.jetbrains.kotlin.idea.frontend.api.VariableAsFunctionLikeCallInfo
import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
class KtInvokeFunctionReferenceFirImpl(expression: KtCallExpression) : KtInvokeFunctionReference(expression), FirKtReference { class KtFirInvokeFunctionReference(expression: KtCallExpression) : KtInvokeFunctionReference(expression), KtFirReference {
override fun doRenameImplicitConventionalCall(newName: String?): KtExpression { override fun doRenameImplicitConventionalCall(newName: String?): KtExpression {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection<KtSymbol> { override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection<KtSymbol> {
val call = analysisSession.resolveCall(expression) ?: return emptyList() val call = analysisSession.resolveCall(expression) ?: return emptyList()
if (call is VariableAsFunctionLikeCallInfo) { if (call is VariableAsFunctionLikeCallInfo) {
return listOf(call.invokeFunction) return listOf(call.invokeFunction)
@@ -11,18 +11,18 @@ import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.idea.fir.* import org.jetbrains.kotlin.idea.fir.*
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtPropertyDelegate import org.jetbrains.kotlin.psi.KtPropertyDelegate
class KtPropertyDelegationMethodsReferenceFirImpl( class KtFirPropertyDelegationMethodsReference(
element: KtPropertyDelegate element: KtPropertyDelegate
) : KtPropertyDelegationMethodsReference(element), FirKtReference { ) : KtPropertyDelegationMethodsReference(element), KtFirReference {
override fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection<KtSymbol> { override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection<KtSymbol> {
check(analysisSession is FirAnalysisSession) check(analysisSession is KtFirAnalysisSession)
val property = (expression.parent as? KtElement)?.getOrBuildFirSafe<FirProperty>() ?: return emptyList() val property = (expression.parent as? KtElement)?.getOrBuildFirSafe<FirProperty>() ?: return emptyList()
if (property.delegate == null) return emptyList() if (property.delegate == null) return emptyList()
val getValueSymbol = (property.getter?.singleStatementOfType<FirReturnExpression>()?.result as? FirFunctionCall)?.getCalleeSymbol() val getValueSymbol = (property.getter?.singleStatementOfType<FirReturnExpression>()?.result as? FirFunctionCall)?.getCalleeSymbol()
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.frontend.api.FrontendAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
interface FirKtReference : KtReference { interface KtFirReference : KtReference {
fun resolveToSymbols(analysisSession: FrontendAnalysisSession): Collection<KtSymbol> fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection<KtSymbol>
fun getResolvedToPsi(analysisSession: FrontendAnalysisSession): Collection<PsiElement> = fun getResolvedToPsi(analysisSession: KtAnalysisSession): Collection<PsiElement> =
resolveToSymbols(analysisSession).mapNotNull(KtSymbol::psi) resolveToSymbols(analysisSession).mapNotNull(KtSymbol::psi)
override val resolver get() = KtFirReferenceResolver override val resolver get() = KtFirReferenceResolver
@@ -11,18 +11,18 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementResolveResult import com.intellij.psi.PsiElementResolveResult
import com.intellij.psi.ResolveResult import com.intellij.psi.ResolveResult
import com.intellij.psi.impl.source.resolve.ResolveCache import com.intellij.psi.impl.source.resolve.ResolveCache
import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
object KtFirReferenceResolver : ResolveCache.PolyVariantResolver<KtReference> { object KtFirReferenceResolver : ResolveCache.PolyVariantResolver<KtReference> {
class KotlinResolveResult(element: PsiElement) : PsiElementResolveResult(element) class KotlinResolveResult(element: PsiElement) : PsiElementResolveResult(element)
override fun resolve(ref: KtReference, incompleteCode: Boolean): Array<ResolveResult> { override fun resolve(ref: KtReference, incompleteCode: Boolean): Array<ResolveResult> {
check(ref is FirKtReference) { "reference should be FirKtReference, but was ${ref::class}" } check(ref is KtFirReference) { "reference should be FirKtReference, but was ${ref::class}" }
check(ref is AbstractKtReference<*>) { "reference should be AbstractKtReference, but was ${ref::class}" } check(ref is AbstractKtReference<*>) { "reference should be AbstractKtReference, but was ${ref::class}" }
if (ApplicationManager.getApplication().isDispatchThread) { if (ApplicationManager.getApplication().isDispatchThread) {
throw ProcessCanceledException() throw ProcessCanceledException()
} }
val analysisSession = FirAnalysisSession(ref.expression) val analysisSession = KtFirAnalysisSession(ref.expression)
val resolveToPsiElements = ref.getResolvedToPsi(analysisSession) val resolveToPsiElements = ref.getResolvedToPsi(analysisSession)
return resolveToPsiElements.map { KotlinResolveResult(it) }.toTypedArray() return resolveToPsiElements.map { KotlinResolveResult(it) }.toTypedArray()
} }
@@ -39,7 +39,7 @@ abstract class AbstractResolveCallTest : @Suppress("DEPRECATION") KotlinLightCod
} }
val actualText = executeOnPooledThreadInReadAction { val actualText = executeOnPooledThreadInReadAction {
val analysisSession = FirAnalysisSession(file as KtFile) val analysisSession = KtFirAnalysisSession(file as KtFile)
val callInfos = elements.map { element -> val callInfos = elements.map { element ->
when (element) { when (element) {
is KtCallExpression -> analysisSession.resolveCall(element) is KtCallExpression -> analysisSession.resolveCall(element)
@@ -6,10 +6,9 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols package org.jetbrains.kotlin.idea.frontend.api.symbols
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import com.intellij.psi.PsiRecursiveElementWalkingVisitor
import org.jetbrains.kotlin.idea.addExternalTestFiles import org.jetbrains.kotlin.idea.addExternalTestFiles
import org.jetbrains.kotlin.idea.executeOnPooledThreadInReadAction import org.jetbrains.kotlin.idea.executeOnPooledThreadInReadAction
import org.jetbrains.kotlin.idea.frontend.api.fir.FirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -24,7 +23,7 @@ abstract class AbstractSymbolsByPsiBuildingTest : KotlinLightCodeInsightFixtureT
val ktFile = myFixture.configureByText(file.name, FileUtil.loadFile(file)) as KtFile val ktFile = myFixture.configureByText(file.name, FileUtil.loadFile(file)) as KtFile
val renderedSymbols = executeOnPooledThreadInReadAction { val renderedSymbols = executeOnPooledThreadInReadAction {
val analysisSession = FirAnalysisSession(ktFile) val analysisSession = KtFirAnalysisSession(ktFile)
val declarationSymbols = ktFile.collectDescendantsOfType<KtDeclaration>().map { declaration -> val declarationSymbols = ktFile.collectDescendantsOfType<KtDeclaration>().map { declaration ->
analysisSession.symbolProvider.getSymbol(declaration) analysisSession.symbolProvider.getSymbol(declaration)
} }