FIR checker: report UNSAFE_CALL for overloaded function calls

Previously if an unsafe call is to an overloaded function, FIR checkers
report NONE_APPLICABLE. This change instead report them as UNSAFE_CALL
or its variants.
This commit is contained in:
Tianyu Geng
2021-04-09 21:26:07 +03:00
committed by Mikhail Glukhikh
parent 92df1f575a
commit 454ae3b17a
30 changed files with 83 additions and 142 deletions
@@ -43,7 +43,7 @@ internal fun FirErrorNamedReference.getCandidateSymbols(): Collection<FirBasedSy
when (val diagnostic = diagnostic) {
is ConeInapplicableCandidateError -> listOf(diagnostic.candidate.symbol)
is ConeHiddenCandidateError -> listOf(diagnostic.candidateSymbol)
is ConeAmbiguityError -> diagnostic.candidates
is ConeAmbiguityError -> diagnostic.candidates.map { it.symbol }
is ConeOperatorAmbiguityError -> diagnostic.candidates
is ConeUnsupportedCallableReferenceTarget -> listOf(diagnostic.fir.symbol)
else -> emptyList()
@@ -383,7 +383,7 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort
private fun getSingleUnambiguousCandidate(namedReference: FirErrorNamedReference): FirCallableSymbol<*>? {
val coneAmbiguityError = namedReference.diagnostic as? ConeAmbiguityError ?: return null
val candidates = coneAmbiguityError.candidates.map { it as FirCallableSymbol<*> }
val candidates = coneAmbiguityError.candidates.map { it.symbol as FirCallableSymbol<*> }
require(candidates.isNotEmpty()) { "Cannot have zero candidates" }
val distinctCandidates = candidates.distinctBy { it.callableId }
@@ -15,7 +15,10 @@ import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertySymbol
import org.jetbrains.kotlin.fir.resolve.diagnostics.*
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguityError
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeInapplicableCandidateError
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeOperatorAmbiguityError
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnmatchedTypeArgumentsError
import org.jetbrains.kotlin.fir.resolve.symbolProvider
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
@@ -284,7 +287,7 @@ internal object FirReferenceResolveHelper {
fun getFirSymbolsByErrorNamedReference(
errorNamedReference: FirErrorNamedReference,
): Collection<FirBasedSymbol<*>> = when (val diagnostic = errorNamedReference.diagnostic) {
is ConeAmbiguityError -> diagnostic.candidates
is ConeAmbiguityError -> diagnostic.candidates.map { it.symbol }
is ConeOperatorAmbiguityError -> diagnostic.candidates
is ConeInapplicableCandidateError -> listOf(diagnostic.candidate.symbol)
else -> emptyList()