FIR checker: carry original candidate in ConeDiagnosticWithCandidates

This is needed by IDE when resolving calls because candidates carry more
information than just the targeting symbol.
This commit is contained in:
Tianyu Geng
2021-11-25 17:11:50 -08:00
committed by Ilya Kirillov
parent b2e1dfa6db
commit 58067e0a1e
9 changed files with 54 additions and 46 deletions
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.fir.annotations.mapAnnotationParameters
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirNamedReference
@@ -22,7 +23,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.psi.KtCallElement
@@ -71,6 +71,7 @@ internal fun ConeDiagnostic.getCandidateSymbols(): Collection<FirBasedSymbol<*>>
emptyList()
}
is ConeDiagnosticWithCandidates -> candidateSymbols
is ConeDiagnosticWithSymbol<*> -> listOf(symbol)
else -> emptyList()
}
@@ -357,7 +357,7 @@ private class ElementsToShortenCollector(
return when (this) {
is ConeClassErrorType -> when (val diagnostic = this.diagnostic) {
// Tolerate code that misses type parameters while shortening it.
is ConeUnmatchedTypeArgumentsError -> diagnostic.candidateSymbol.classId
is ConeUnmatchedTypeArgumentsError -> diagnostic.symbol.classId
else -> null
}
is ConeClassLikeType -> lookupTag.classId
@@ -56,7 +56,7 @@ internal object FirReferenceResolveHelper {
val symbol = resolvedSymbol ?: run {
val diagnostic = (this as? FirErrorTypeRef)?.diagnostic
(diagnostic as? ConeUnmatchedTypeArgumentsError)?.candidateSymbol
(diagnostic as? ConeUnmatchedTypeArgumentsError)?.symbol
}
return symbol?.fir?.buildSymbol(symbolBuilder)