[FIR2IR] Intercept exceptions in convertToIrCall to provide more info
This commit is contained in:
@@ -24,6 +24,8 @@ class Fir2IrConversionScope {
|
|||||||
return parent
|
return parent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun containingFileIfAny(): IrFile? = parentStack.getOrNull(0) as? IrFile
|
||||||
|
|
||||||
fun withContainingFirClass(containingFirClass: FirClass<*>, f: () -> Unit) {
|
fun withContainingFirClass(containingFirClass: FirClass<*>, f: () -> Unit) {
|
||||||
containingFirClassStack += containingFirClass
|
containingFirClassStack += containingFirClass
|
||||||
f()
|
f()
|
||||||
|
|||||||
+65
-60
@@ -460,69 +460,74 @@ class CallAndReferenceGenerator(
|
|||||||
explicitReceiverExpression: IrExpression?,
|
explicitReceiverExpression: IrExpression?,
|
||||||
annotationMode: Boolean = false
|
annotationMode: Boolean = false
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
val type = typeRef.toIrType()
|
try {
|
||||||
val samConstructorCall = qualifiedAccess.tryConvertToSamConstructorCall(type)
|
val type = typeRef.toIrType()
|
||||||
if (samConstructorCall != null) return samConstructorCall
|
val samConstructorCall = qualifiedAccess.tryConvertToSamConstructorCall(type)
|
||||||
|
if (samConstructorCall != null) return samConstructorCall
|
||||||
|
|
||||||
val symbol = qualifiedAccess.calleeReference.toSymbol(
|
val symbol = qualifiedAccess.calleeReference.toSymbol(
|
||||||
session,
|
session,
|
||||||
classifierStorage,
|
classifierStorage,
|
||||||
declarationStorage,
|
declarationStorage,
|
||||||
conversionScope
|
conversionScope
|
||||||
)
|
)
|
||||||
return qualifiedAccess.convertWithOffsets { startOffset, endOffset ->
|
return qualifiedAccess.convertWithOffsets { startOffset, endOffset ->
|
||||||
val dispatchReceiver = qualifiedAccess.dispatchReceiver
|
val dispatchReceiver = qualifiedAccess.dispatchReceiver
|
||||||
if (qualifiedAccess.calleeReference is FirSuperReference) {
|
if (qualifiedAccess.calleeReference is FirSuperReference) {
|
||||||
if (dispatchReceiver !is FirNoReceiverExpression) {
|
if (dispatchReceiver !is FirNoReceiverExpression) {
|
||||||
return@convertWithOffsets visitor.convertToIrExpression(dispatchReceiver)
|
return@convertWithOffsets visitor.convertToIrExpression(dispatchReceiver)
|
||||||
}
|
|
||||||
}
|
|
||||||
when (symbol) {
|
|
||||||
is IrConstructorSymbol -> IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, type, symbol)
|
|
||||||
is IrSimpleFunctionSymbol -> {
|
|
||||||
IrCallImpl(
|
|
||||||
startOffset, endOffset, type, symbol,
|
|
||||||
typeArgumentsCount = symbol.owner.typeParameters.size,
|
|
||||||
valueArgumentsCount = symbol.owner.valueParameters.size,
|
|
||||||
origin = qualifiedAccess.calleeReference.statementOrigin(),
|
|
||||||
superQualifierSymbol = dispatchReceiver.superQualifierSymbol(symbol)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
is IrPropertySymbol -> {
|
|
||||||
val getter = symbol.owner.getter
|
|
||||||
val backingField = symbol.owner.backingField
|
|
||||||
when {
|
|
||||||
getter != null -> IrCallImpl(
|
|
||||||
startOffset, endOffset, type, getter.symbol,
|
|
||||||
typeArgumentsCount = getter.typeParameters.size,
|
|
||||||
valueArgumentsCount = 0,
|
|
||||||
origin = IrStatementOrigin.GET_PROPERTY,
|
|
||||||
superQualifierSymbol = dispatchReceiver.superQualifierSymbol(symbol)
|
|
||||||
)
|
|
||||||
backingField != null -> IrGetFieldImpl(
|
|
||||||
startOffset, endOffset, backingField.symbol, type,
|
|
||||||
superQualifierSymbol = dispatchReceiver.superQualifierSymbol(symbol)
|
|
||||||
)
|
|
||||||
else -> IrErrorCallExpressionImpl(
|
|
||||||
startOffset, endOffset, type,
|
|
||||||
description = "No getter or backing field found for ${qualifiedAccess.calleeReference.render()}"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is IrFieldSymbol -> IrGetFieldImpl(
|
when (symbol) {
|
||||||
startOffset, endOffset, symbol, type,
|
is IrConstructorSymbol -> IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, type, symbol)
|
||||||
origin = IrStatementOrigin.GET_PROPERTY.takeIf { qualifiedAccess.calleeReference !is FirDelegateFieldReference },
|
is IrSimpleFunctionSymbol -> {
|
||||||
superQualifierSymbol = dispatchReceiver.superQualifierSymbol(symbol)
|
IrCallImpl(
|
||||||
)
|
startOffset, endOffset, type, symbol,
|
||||||
is IrValueSymbol -> IrGetValueImpl(
|
typeArgumentsCount = symbol.owner.typeParameters.size,
|
||||||
startOffset, endOffset, type, symbol,
|
valueArgumentsCount = symbol.owner.valueParameters.size,
|
||||||
origin = qualifiedAccess.calleeReference.statementOrigin()
|
origin = qualifiedAccess.calleeReference.statementOrigin(),
|
||||||
)
|
superQualifierSymbol = dispatchReceiver.superQualifierSymbol(symbol)
|
||||||
is IrEnumEntrySymbol -> IrGetEnumValueImpl(startOffset, endOffset, type, symbol)
|
)
|
||||||
else -> generateErrorCallExpression(startOffset, endOffset, qualifiedAccess.calleeReference, type)
|
}
|
||||||
}
|
is IrPropertySymbol -> {
|
||||||
}.applyCallArguments(qualifiedAccess as? FirCall, annotationMode)
|
val getter = symbol.owner.getter
|
||||||
.applyTypeArguments(qualifiedAccess).applyReceivers(qualifiedAccess, explicitReceiverExpression)
|
val backingField = symbol.owner.backingField
|
||||||
|
when {
|
||||||
|
getter != null -> IrCallImpl(
|
||||||
|
startOffset, endOffset, type, getter.symbol,
|
||||||
|
typeArgumentsCount = getter.typeParameters.size,
|
||||||
|
valueArgumentsCount = 0,
|
||||||
|
origin = IrStatementOrigin.GET_PROPERTY,
|
||||||
|
superQualifierSymbol = dispatchReceiver.superQualifierSymbol(symbol)
|
||||||
|
)
|
||||||
|
backingField != null -> IrGetFieldImpl(
|
||||||
|
startOffset, endOffset, backingField.symbol, type,
|
||||||
|
superQualifierSymbol = dispatchReceiver.superQualifierSymbol(symbol)
|
||||||
|
)
|
||||||
|
else -> IrErrorCallExpressionImpl(
|
||||||
|
startOffset, endOffset, type,
|
||||||
|
description = "No getter or backing field found for ${qualifiedAccess.calleeReference.render()}"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is IrFieldSymbol -> IrGetFieldImpl(
|
||||||
|
startOffset, endOffset, symbol, type,
|
||||||
|
origin = IrStatementOrigin.GET_PROPERTY.takeIf { qualifiedAccess.calleeReference !is FirDelegateFieldReference },
|
||||||
|
superQualifierSymbol = dispatchReceiver.superQualifierSymbol(symbol)
|
||||||
|
)
|
||||||
|
is IrValueSymbol -> IrGetValueImpl(
|
||||||
|
startOffset, endOffset, type, symbol,
|
||||||
|
origin = qualifiedAccess.calleeReference.statementOrigin()
|
||||||
|
)
|
||||||
|
is IrEnumEntrySymbol -> IrGetEnumValueImpl(startOffset, endOffset, type, symbol)
|
||||||
|
else -> generateErrorCallExpression(startOffset, endOffset, qualifiedAccess.calleeReference, type)
|
||||||
|
}
|
||||||
|
}.applyCallArguments(qualifiedAccess as? FirCall, annotationMode)
|
||||||
|
.applyTypeArguments(qualifiedAccess).applyReceivers(qualifiedAccess, explicitReceiverExpression)
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
throw IllegalStateException("Error while translating ${qualifiedAccess.render()} " +
|
||||||
|
"from file ${conversionScope.containingFileIfAny()?.name ?: "???"} to BE IR", e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun convertToIrSetCall(variableAssignment: FirVariableAssignment, explicitReceiverExpression: IrExpression?): IrExpression {
|
fun convertToIrSetCall(variableAssignment: FirVariableAssignment, explicitReceiverExpression: IrExpression?): IrExpression {
|
||||||
|
|||||||
Reference in New Issue
Block a user