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 {
|
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
|
val rValue = rValue
|
||||||
if (rValue is FirFunctionCall && calleeReferenceSymbol.callableId.isLocal) {
|
if (rValue is FirFunctionCall && calleeReferenceSymbol.callableId.isLocal) {
|
||||||
val callableId = rValue.calleeReference.toResolvedCallableSymbol()?.callableId
|
val callableId = rValue.calleeReference.toResolvedCallableSymbol()?.callableId
|
||||||
if (callableId?.classId == StandardClassIds.Int) {
|
if (callableId?.classId == StandardClassIds.Int) {
|
||||||
val callableName = callableId.callableName
|
return 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 IrStatementOrigin.EQ
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FirCallableDeclaration.contextReceiversForFunctionOrContainingProperty(): List<FirContextReceiver> =
|
fun FirCallableDeclaration.contextReceiversForFunctionOrContainingProperty(): List<FirContextReceiver> =
|
||||||
@@ -764,4 +783,4 @@ fun FirCallableDeclaration.contextReceiversForFunctionOrContainingProperty(): Li
|
|||||||
|
|
||||||
fun IrActualizedResult?.extractFirDeclarations(): Set<FirDeclaration>? {
|
fun IrActualizedResult?.extractFirDeclarations(): Set<FirDeclaration>? {
|
||||||
return this?.actualizedExpectDeclarations?.mapNotNullTo(mutableSetOf()) { ((it as IrMetadataSourceOwner).metadata as FirMetadataSource).fir }
|
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? {
|
private fun List<FirStatement>.getStatementsOrigin(index: Int): IrStatementOrigin? {
|
||||||
if (index + 3 > size) return null
|
val incrementStatement = getOrNull(index + 1)
|
||||||
|
|
||||||
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]
|
|
||||||
if (incrementStatement !is FirVariableAssignment) return null
|
if (incrementStatement !is FirVariableAssignment) return null
|
||||||
|
|
||||||
if (incrementStatement.calleeReference?.toResolvedCallableSymbol() != variable) return null
|
return incrementStatement.getIrPrefixPostfixOriginIfAny()
|
||||||
|
|
||||||
val origin = incrementStatement.getIrAssignmentOrigin()
|
|
||||||
return if (origin == IrStatementOrigin.EQ) null else origin
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun convertToIrBlockBody(block: FirBlock): IrBlockBody {
|
internal fun convertToIrBlockBody(block: FirBlock): IrBlockBody {
|
||||||
|
|||||||
Reference in New Issue
Block a user