override fun performReplace()

in src/org/jetbrains/r/refactoring/RIntroduceVariableHandler.kt [27:81]


  override fun performReplace(operation: IntroduceOperation): RIdentifierExpression {
    val suggestedName = operation.suggestedNames[0]
    var declaration = RElementFactory.createRPsiElementFromText(operation.project, "$suggestedName <- expr") as RAssignmentStatement
    var replacedOccurrences = mutableListOf<RIdentifierExpression>()

    WriteCommandAction.runWriteCommandAction(operation.project) {
      var anchor = findAnchor(operation.occurrences)
      var anchorParent = anchor.parent

      declaration.assignedValue!!.replace(operation.expression)
      RPrecedenceUtil.wrapToParenthesisIfNeeded(declaration.assignedValue!!, operation.project)

      var declarationAdded = false
      var declarationAddedToFirst = false
      for (occurrence in operation.occurrences) {
        if (occurrence == anchor && anchorParent !is RFunctionExpression) {
          if (occurrence == operation.expression) {
            declarationAddedToFirst = true
          }
          declaration = occurrence.replace(declaration) as RAssignmentStatement
          anchor = declaration as RExpression
          declarationAdded = true
          CodeEditUtil.setNodeGeneratedRecursively(declaration.node, true)
        } else {
          replacedOccurrences.add(occurrence.findParenthesisParent().replace(declaration.assignee!!) as RIdentifierExpression)
          if (occurrence == anchor) {
            anchor = replacedOccurrences.last()
          }
          CodeEditUtil.setNodeGeneratedRecursively(replacedOccurrences.last().node, true)
        }
      }
      if (anchorParent !is RFile && anchorParent !is RBlockExpression) {
        anchor = wrapToBraces(anchor, operation)
        anchorParent = anchor.parent
        replacedOccurrences = PsiTreeUtil.findChildrenOfType(anchor, RIdentifierExpression::class.java)
          .filter { it.name == suggestedName }.toMutableList()
        if (declarationAdded) {
          declaration = anchor as RAssignmentStatement
        }
        CodeEditUtil.setNodeGeneratedRecursively(anchorParent.node, true)
      }
      operation.editor.selectionModel.removeSelection()
      if (!declarationAdded) {
        declaration = anchorParent.addBefore(declaration, anchor) as RAssignmentStatement
        CodeEditUtil.setNodeGeneratedRecursively(declaration.node, true)
      }
      if (declarationAddedToFirst) {
        operation.editor.caretModel.moveToOffset(declaration.textRange.startOffset)
      } else {
        operation.editor.caretModel.moveToOffset(replacedOccurrences[0].textRange.startOffset)
      }
    }
    operation.replacedOccurrences = replacedOccurrences
    return declaration.assignee as RIdentifierExpression
  }