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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user