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
}