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.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess 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.FirReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.FirThisReference 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.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData 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.AccessorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.* 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( fun FirReference.toSymbolForCall(
session: FirSession, session: FirSession,
classifierStorage: Fir2IrClassifierStorage, classifierStorage: Fir2IrClassifierStorage,
@@ -145,19 +158,8 @@ fun FirReference.toSymbolForCall(
preferGetter: Boolean = true preferGetter: Boolean = true
): IrSymbol? { ): IrSymbol? {
return when (this) { return when (this) {
is FirResolvedNamedReference -> { is FirResolvedNamedReference -> resolvedSymbol.toSymbolForCall(session, classifierStorage, declarationStorage, preferGetter)
when (val resolvedSymbol = resolvedSymbol) { is FirErrorNamedReference -> candidateSymbol?.toSymbolForCall(session, classifierStorage, declarationStorage, preferGetter)
is FirCallableSymbol<*> -> {
resolvedSymbol.unwrapCallRepresentative().toSymbolForCall(declarationStorage, preferGetter)
}
is FirClassifierSymbol<*> -> {
resolvedSymbol.toSymbol(session, classifierStorage)
}
else -> {
error("Unknown symbol: $resolvedSymbol")
}
}
}
is FirThisReference -> { is FirThisReference -> {
when (val boundSymbol = boundSymbol) { when (val boundSymbol = boundSymbol) {
is FirClassSymbol<*> -> classifierStorage.getIrClassSymbol(boundSymbol).owner.thisReceiver?.symbol is FirClassSymbol<*> -> classifierStorage.getIrClassSymbol(boundSymbol).owner.thisReceiver?.symbol