[FIR IDE] Fix annotation call reference resolve to ctor

This commit is contained in:
Igor Yakovlev
2021-01-22 00:41:12 +03:00
parent 65b6a95f64
commit 019635189a
5 changed files with 24 additions and 9 deletions
@@ -89,7 +89,7 @@ internal class FileStructure(
val firFile = firFileBuilder.getFirFileResolvedToPhaseWithCaching( val firFile = firFileBuilder.getFirFileResolvedToPhaseWithCaching(
container, container,
moduleFileCache, moduleFileCache,
FirResolvePhase.IMPORTS, FirResolvePhase.TYPES,
checkPCE = true checkPCE = true
) )
RootStructureElement( RootStructureElement(
@@ -8,17 +8,36 @@ package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
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.*
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
internal class KtFirSimpleNameReference( internal class KtFirSimpleNameReference(
expression: KtSimpleNameExpression expression: KtSimpleNameExpression
) : KtSimpleNameReference(expression), KtFirReference { ) : KtSimpleNameReference(expression), KtFirReference {
private fun KtAnalysisSession.fixUpAnnotationCallResolveToCtor(resultsToFix: Collection<KtSymbol>): Collection<KtSymbol> {
if (resultsToFix.isEmpty()) return resultsToFix
val isAnnotationCall = (((expression.parent as? KtUserType)
?.parent as? KtTypeReference)
?.parent as? KtConstructorCalleeExpression)
?.parent is KtAnnotationEntry
if (!isAnnotationCall) return resultsToFix
return resultsToFix.map { targetSymbol ->
if (targetSymbol is KtFirClassOrObjectSymbol && targetSymbol.classKind == KtClassKind.ANNOTATION_CLASS) {
targetSymbol.getMemberScope().getConstructors().firstOrNull() ?: targetSymbol
} else targetSymbol
}
}
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> { override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
check(this is KtFirAnalysisSession) check(this is KtFirAnalysisSession)
return FirReferenceResolveHelper.resolveSimpleNameReference(this@KtFirSimpleNameReference, this) val results = FirReferenceResolveHelper.resolveSimpleNameReference(this@KtFirSimpleNameReference, this)
return fixUpAnnotationCallResolveToCtor(results)
} }
override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean { override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean {
+1 -1
View File
@@ -1,4 +1,4 @@
FILE: main.kt FILE: main.kt
public? final? [RAW_FIR] fun foofoo(): Int { public? final? [TYPES] fun foofoo(): R|kotlin/Int| {
^foofoo barbar#() ^foofoo barbar#()
} }
-2
View File
@@ -1,5 +1,3 @@
// IGNORE_FIR
@file:[kotlin.<caret>Deprecated("message")] @file:[kotlin.<caret>Deprecated("message")]
package foo package foo
@@ -1,5 +1,3 @@
// IGNORE_FIR
@file:[<caret>D("message")] @file:[<caret>D("message")]
package foo package foo