[FIR2IR] Provide more information for errors inside convertToIrSetCall

This commit is contained in:
Mikhail Glukhikh
2020-11-12 16:56:55 +03:00
committed by teamcityserver
parent 9de244515e
commit 59c86bcdc4
@@ -276,69 +276,77 @@ class CallAndReferenceGenerator(
} }
fun convertToIrSetCall(variableAssignment: FirVariableAssignment, explicitReceiverExpression: IrExpression?): IrExpression { fun convertToIrSetCall(variableAssignment: FirVariableAssignment, explicitReceiverExpression: IrExpression?): IrExpression {
val type = irBuiltIns.unitType try {
val calleeReference = variableAssignment.calleeReference val type = irBuiltIns.unitType
val symbol = calleeReference.toSymbolForCall(session, classifierStorage, declarationStorage, conversionScope, preferGetter = false) val calleeReference = variableAssignment.calleeReference
val origin = IrStatementOrigin.EQ val symbol =
return variableAssignment.convertWithOffsets { startOffset, endOffset -> calleeReference.toSymbolForCall(session, classifierStorage, declarationStorage, conversionScope, preferGetter = false)
val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue) val origin = IrStatementOrigin.EQ
when (symbol) { return variableAssignment.convertWithOffsets { startOffset, endOffset ->
is IrFieldSymbol -> IrSetFieldImpl(startOffset, endOffset, symbol, type, origin).apply { val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue)
value = assignedValue when (symbol) {
} is IrFieldSymbol -> IrSetFieldImpl(startOffset, endOffset, symbol, type, origin).apply {
is IrLocalDelegatedPropertySymbol -> { value = assignedValue
val setter = symbol.owner.setter }
when { is IrLocalDelegatedPropertySymbol -> {
setter != null -> IrCallImpl( val setter = symbol.owner.setter
startOffset, endOffset, type, setter.symbol, when {
typeArgumentsCount = setter.typeParameters.size, setter != null -> IrCallImpl(
startOffset, endOffset, type, setter.symbol,
typeArgumentsCount = setter.typeParameters.size,
valueArgumentsCount = 1,
origin = origin,
superQualifierSymbol = variableAssignment.dispatchReceiver.superQualifierSymbol(symbol)
).apply {
putValueArgument(0, assignedValue)
}
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
}
}
is IrPropertySymbol -> {
val irProperty = symbol.owner
val setter = irProperty.setter
val backingField = irProperty.backingField
when {
setter != null -> IrCallImpl(
startOffset, endOffset, type, setter.symbol,
typeArgumentsCount = setter.typeParameters.size,
valueArgumentsCount = 1,
origin = origin,
superQualifierSymbol = variableAssignment.dispatchReceiver.superQualifierSymbol(symbol)
).apply {
putValueArgument(0, assignedValue)
}
backingField != null -> IrSetFieldImpl(
startOffset, endOffset, backingField.symbol, type,
origin = null, // NB: to be consistent with PSI2IR, origin should be null here
superQualifierSymbol = variableAssignment.dispatchReceiver.superQualifierSymbol(symbol)
).apply {
value = assignedValue
}
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
}
}
is IrSimpleFunctionSymbol -> {
IrCallImpl(
startOffset, endOffset, type, symbol,
typeArgumentsCount = symbol.owner.typeParameters.size,
valueArgumentsCount = 1, valueArgumentsCount = 1,
origin = origin, origin = origin
superQualifierSymbol = variableAssignment.dispatchReceiver.superQualifierSymbol(symbol)
).apply { ).apply {
putValueArgument(0, assignedValue) putValueArgument(0, assignedValue)
} }
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
} }
is IrVariableSymbol -> IrSetValueImpl(startOffset, endOffset, type, symbol, assignedValue, origin)
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
} }
is IrPropertySymbol -> { }.applyTypeArguments(variableAssignment).applyReceivers(variableAssignment, explicitReceiverExpression)
val irProperty = symbol.owner } catch (e: Throwable) {
val setter = irProperty.setter throw IllegalStateException(
val backingField = irProperty.backingField "Error while translating ${variableAssignment.render()} " +
when { "from file ${conversionScope.containingFileIfAny()?.name ?: "???"} to BE IR", e
setter != null -> IrCallImpl( )
startOffset, endOffset, type, setter.symbol, }
typeArgumentsCount = setter.typeParameters.size,
valueArgumentsCount = 1,
origin = origin,
superQualifierSymbol = variableAssignment.dispatchReceiver.superQualifierSymbol(symbol)
).apply {
putValueArgument(0, assignedValue)
}
backingField != null -> IrSetFieldImpl(
startOffset, endOffset, backingField.symbol, type,
origin = null, // NB: to be consistent with PSI2IR, origin should be null here
superQualifierSymbol = variableAssignment.dispatchReceiver.superQualifierSymbol(symbol)
).apply {
value = assignedValue
}
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
}
}
is IrSimpleFunctionSymbol -> {
IrCallImpl(
startOffset, endOffset, type, symbol,
typeArgumentsCount = symbol.owner.typeParameters.size,
valueArgumentsCount = 1,
origin = origin
).apply {
putValueArgument(0, assignedValue)
}
}
is IrVariableSymbol -> IrSetValueImpl(startOffset, endOffset, type, symbol, assignedValue, origin)
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
}
}.applyTypeArguments(variableAssignment).applyReceivers(variableAssignment, explicitReceiverExpression)
} }
fun convertToIrConstructorCall(annotationCall: FirAnnotationCall): IrExpression { fun convertToIrConstructorCall(annotationCall: FirAnnotationCall): IrExpression {