fun collectReturns()

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
  }