FIR2IR: convert some error calls to non-error IR

This allows suppressing "invisible reference"-type errors, which some
people do in production code.
This commit is contained in:
pyos
2021-04-19 09:34:40 +02:00
committed by Mikhail Glukhikh
parent 6833e83a6f
commit f1cf6b54e7
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.FirThisReference
@@ -27,6 +28,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.originalConstructorIfTypeAlias
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.AccessorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
@@ -137,6 +139,17 @@ fun FirClassifierSymbol<*>.toSymbol(
}
}
private fun AbstractFirBasedSymbol<*>.toSymbolForCall(
session: FirSession,
classifierStorage: Fir2IrClassifierStorage,
declarationStorage: Fir2IrDeclarationStorage,
preferGetter: Boolean
) = when (this) {
is FirCallableSymbol<*> -> unwrapCallRepresentative().toSymbolForCall(declarationStorage, preferGetter)
is FirClassifierSymbol<*> -> toSymbol(session, classifierStorage)
else -> error("Unknown symbol: $this")
}
fun FirReference.toSymbolForCall(
session: FirSession,
classifierStorage: Fir2IrClassifierStorage,
@@ -145,19 +158,8 @@ fun FirReference.toSymbolForCall(
preferGetter: Boolean = true
): IrSymbol? {
return when (this) {
is FirResolvedNamedReference -> {
when (val resolvedSymbol = resolvedSymbol) {
is FirCallableSymbol<*> -> {
resolvedSymbol.unwrapCallRepresentative().toSymbolForCall(declarationStorage, preferGetter)
}
is FirClassifierSymbol<*> -> {
resolvedSymbol.toSymbol(session, classifierStorage)
}
else -> {
error("Unknown symbol: $resolvedSymbol")
}
}
}
is FirResolvedNamedReference -> resolvedSymbol.toSymbolForCall(session, classifierStorage, declarationStorage, preferGetter)
is FirErrorNamedReference -> candidateSymbol?.toSymbolForCall(session, classifierStorage, declarationStorage, preferGetter)
is FirThisReference -> {
when (val boundSymbol = boundSymbol) {
is FirClassSymbol<*> -> classifierStorage.getIrClassSymbol(boundSymbol).owner.thisReceiver?.symbol