FIR2IR: simplify operations with getStatementsOrigin
#KT-54989 Fixed
This commit is contained in:
committed by
Space Team
parent
ba0ab38b83
commit
e6d43c1f48
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user