FIR2IR: simplify operations with getStatementsOrigin

#KT-54989 Fixed
This commit is contained in:
Mikhail Glukhikh
2023-06-27 13:58:55 +03:00
committed by Space Team
parent ba0ab38b83
commit e6d43c1f48
2 changed files with 45 additions and 41 deletions
@@ -725,35 +725,54 @@ fun FirDeclaration?.computeIrOrigin(predefinedOrigin: IrDeclarationOrigin? = nul
}
fun FirVariableAssignment.getIrAssignmentOrigin(): IrStatementOrigin {
val calleeReferenceSymbol = calleeReference?.toResolvedCallableSymbol() ?: return IrStatementOrigin.EQ
val callableName = getCallableNameFromIntClassIfAny() ?: return IrStatementOrigin.EQ
getIrPrefixPostfixOriginIfAny(callableName)?.let { return it }
val rValue = rValue as FirFunctionCall
val kind = rValue.source?.kind
if (kind == KtFakeSourceElementKind.DesugaredIncrementOrDecrement || kind == KtFakeSourceElementKind.DesugaredCompoundAssignment) {
if (callableName == OperatorNameConventions.PLUS) {
return IrStatementOrigin.PLUSEQ
} else if (callableName == OperatorNameConventions.MINUS) {
return IrStatementOrigin.MINUSEQ
}
}
return IrStatementOrigin.EQ
}
fun FirVariableAssignment.getIrPrefixPostfixOriginIfAny(): IrStatementOrigin? {
val callableName = getCallableNameFromIntClassIfAny() ?: return null
return getIrPrefixPostfixOriginIfAny(callableName)
}
private fun FirVariableAssignment.getIrPrefixPostfixOriginIfAny(
callableNameFromIntClass: Name
): IrStatementOrigin? {
if (callableNameFromIntClass == OperatorNameConventions.INC) {
return if (source?.elementType == KtNodeTypes.PREFIX_EXPRESSION)
IrStatementOrigin.PREFIX_INCR
else
IrStatementOrigin.POSTFIX_INCR
} else if (callableNameFromIntClass == OperatorNameConventions.DEC) {
return if (source?.elementType == KtNodeTypes.PREFIX_EXPRESSION)
IrStatementOrigin.PREFIX_DECR
else
IrStatementOrigin.POSTFIX_DECR
}
return null
}
private fun FirVariableAssignment.getCallableNameFromIntClassIfAny(): Name? {
val calleeReferenceSymbol = calleeReference?.toResolvedCallableSymbol() ?: return null
val rValue = rValue
if (rValue is FirFunctionCall && calleeReferenceSymbol.callableId.isLocal) {
val callableId = rValue.calleeReference.toResolvedCallableSymbol()?.callableId
if (callableId?.classId == StandardClassIds.Int) {
val callableName = callableId.callableName
if (callableName == OperatorNameConventions.INC) {
return if (source?.elementType == KtNodeTypes.PREFIX_EXPRESSION)
IrStatementOrigin.PREFIX_INCR
else
IrStatementOrigin.POSTFIX_INCR
} else if (callableName == OperatorNameConventions.DEC) {
return if (source?.elementType == KtNodeTypes.PREFIX_EXPRESSION)
IrStatementOrigin.PREFIX_DECR
else
IrStatementOrigin.POSTFIX_DECR
}
val kind = rValue.source?.kind
if (kind == KtFakeSourceElementKind.DesugaredIncrementOrDecrement || kind == KtFakeSourceElementKind.DesugaredCompoundAssignment) {
if (callableName == OperatorNameConventions.PLUS) {
return IrStatementOrigin.PLUSEQ
} else if (callableName == OperatorNameConventions.MINUS) {
return IrStatementOrigin.MINUSEQ
}
}
return callableId.callableName
}
}
return IrStatementOrigin.EQ
return null
}
fun FirCallableDeclaration.contextReceiversForFunctionOrContainingProperty(): List<FirContextReceiver> =
@@ -764,4 +783,4 @@ fun FirCallableDeclaration.contextReceiversForFunctionOrContainingProperty(): Li
fun IrActualizedResult?.extractFirDeclarations(): Set<FirDeclaration>? {
return this?.actualizedExpectDeclarations?.mapNotNullTo(mutableSetOf()) { ((it as IrMetadataSourceOwner).metadata as FirMetadataSource).fir }
}
}
@@ -851,25 +851,10 @@ class Fir2IrVisitor(
}
private fun List<FirStatement>.getStatementsOrigin(index: Int): IrStatementOrigin? {
if (index + 3 > size) return null
val statement0 = this[index]
if (statement0 !is FirProperty || !statement0.isLocal) return null
val unarySymbol = statement0.symbol
if (unarySymbol.callableId.callableName != SpecialNames.UNARY) return null
val variable = statement0.initializer?.toResolvedCallableSymbol() ?: return null
val statement2 = this[index + 2]
if (statement2 !is FirPropertyAccessExpression) return null
if (statement2.calleeReference.toResolvedCallableSymbol() != unarySymbol) return null
val incrementStatement = this[index + 1]
val incrementStatement = getOrNull(index + 1)
if (incrementStatement !is FirVariableAssignment) return null
if (incrementStatement.calleeReference?.toResolvedCallableSymbol() != variable) return null
val origin = incrementStatement.getIrAssignmentOrigin()
return if (origin == IrStatementOrigin.EQ) null else origin
return incrementStatement.getIrPrefixPostfixOriginIfAny()
}
internal fun convertToIrBlockBody(block: FirBlock): IrBlockBody {