in src/org/jetbrains/r/refactoring/RRefactoringUtil.kt [70:112]
fun collectReturns(project: Project, functionExpression: RFunctionExpression): Set<ReturnResult> {
val controlFlow = functionExpression.controlFlow
val instructions = controlFlow.instructions
val returns = mutableSetOf<ReturnResult>()
ControlFlowUtil.iteratePrev(instructions.size - 1, instructions) { instruction: Instruction ->
val element = instruction.element ?: return@iteratePrev ControlFlowUtil.Operation.NEXT
if (element is RFunctionExpression) return@iteratePrev ControlFlowUtil.Operation.CONTINUE
if (element is RBlockExpression && element.children.isEmpty()) {
returns.add(ImplicitNullResult(project, element.firstChild))
return@iteratePrev ControlFlowUtil.Operation.CONTINUE
}
val parent = element.parent
if (parent is RIfStatement && parent.condition == element) return@iteratePrev ControlFlowUtil.Operation.CONTINUE
if (element is RBlockExpression) return@iteratePrev ControlFlowUtil.Operation.NEXT
if (element is RIfStatement) {
if (element.elseBody == null) returns.add(ImplicitNullResult(project, element))
return@iteratePrev ControlFlowUtil.Operation.NEXT
}
if (element is RParameter) return@iteratePrev ControlFlowUtil.Operation.CONTINUE
if (element is RLoopStatement) {
returns.add(ImplicitNullResult(project, element))
return@iteratePrev ControlFlowUtil.Operation.CONTINUE
}
if (RPsiUtil.isReturn(element)) {
val expressionList = (element as RCallExpression).argumentList.expressionList
returns.add(if (expressionList.isNotEmpty()) CorrectReturnResult(project, element, expressionList.first())
else ImplicitNullResult(project, element))
return@iteratePrev ControlFlowUtil.Operation.CONTINUE
}
returns.add(CorrectReturnResult(project, element))
return@iteratePrev ControlFlowUtil.Operation.CONTINUE
}
return returns
}