Rename: Support rename by caret in multi-module tests

This commit is contained in:
Alexey Sedunov
2017-04-13 21:21:24 +03:00
parent b65e082425
commit 701ba5b59b
2 changed files with 59 additions and 32 deletions
@@ -20,6 +20,7 @@ import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiManager
import junit.framework.TestCase
import org.jetbrains.kotlin.idea.jsonUtils.getString
import org.jetbrains.kotlin.idea.test.KotlinMultiFileTestCase
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
@@ -39,9 +40,15 @@ abstract class AbstractMultiModuleRenameTest : KotlinMultiFileTestCase() {
doTestCommittingDocuments { rootDir, _ ->
val mainFile = rootDir.findFileByRelativePath(file)!!
val psiFile = PsiManager.getInstance(project).findFile(mainFile)
val psiFile = PsiManager.getInstance(project).findFile(mainFile)!!
runRenameProcessor(project, newName, psiFile, renameParamsObject, true, true)
val renameType = renameParamsObject.getString("type")
when (RenameType.valueOf(renameType)) {
RenameType.FILE -> runRenameProcessor(project, newName, psiFile, renameParamsObject, true, true)
RenameType.MARKED_ELEMENT -> doRenameMarkedElement(renameParamsObject, psiFile)
else -> TestCase.fail("Unexpected rename type: $renameType")
}
}
}
@@ -23,6 +23,7 @@ import com.intellij.lang.properties.psi.PropertiesFile
import com.intellij.lang.properties.psi.Property
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.EditorFactory
import com.intellij.openapi.extensions.Extensions
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.module.Module
@@ -66,7 +67,7 @@ import org.jetbrains.kotlin.test.KotlinTestUtils
import org.junit.Assert
import java.io.File
private enum class RenameType {
enum class RenameType {
JAVA_CLASS,
JAVA_METHOD,
KOTLIN_CLASS,
@@ -174,40 +175,12 @@ abstract class AbstractRenameTest : KotlinLightCodeInsightFixtureTestCase() {
private fun renameMarkedElement(renameParamsObject: JsonObject, context: TestContext) {
val mainFilePath = renameParamsObject.getString("mainFile")
val newName = renameParamsObject.getString("newName")
doTestCommittingDocuments(context) { rootDir ->
configExtra(rootDir, renameParamsObject)
val psiFile = myFixture.configureFromTempProjectFile(mainFilePath)
val doc = PsiDocumentManager.getInstance(project).getDocument(psiFile)!!
val marker = doc.extractMarkerOffset(project, "/*rename*/")
assert(marker != -1)
val isByRef = renameParamsObject["byRef"]?.asBoolean ?: false
val isInjected = renameParamsObject["injected"]?.asBoolean ?: false
var currentEditor = myFixture.editor
var currentFile: PsiFile = psiFile
if (isByRef || isInjected) {
currentEditor.caretModel.moveToOffset(marker)
if (isInjected) {
currentFile = InjectedLanguageUtil.findInjectedPsiNoCommit(psiFile, marker)!!
currentEditor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(myFixture.editor, currentFile)
}
}
val toRename = if (isByRef) {
TargetElementUtil.findTargetElement(currentEditor, TargetElementUtil.getInstance().allAccepted)!!
}
else {
currentFile.findElementAt(marker)!!.getNonStrictParentOfType<PsiNamedElement>()!!
}
val substitution = RenamePsiElementProcessor.forElement(toRename).substituteElementToRename(toRename, null)
val searchInComments = renameParamsObject["searchInComments"]?.asBoolean ?: true
val searchInTextOccurrences = renameParamsObject["searchInTextOccurrences"]?.asBoolean ?: true
runRenameProcessor(context.project, newName, substitution, renameParamsObject, searchInComments, searchInTextOccurrences)
doRenameMarkedElement(renameParamsObject, psiFile)
}
}
@@ -445,3 +418,50 @@ fun runRenameProcessor(
processor.run()
}
fun doRenameMarkedElement(renameParamsObject: JsonObject, psiFile: PsiFile) {
val project = psiFile.project
val newName = renameParamsObject.getString("newName")
val doc = PsiDocumentManager.getInstance(project).getDocument(psiFile)!!
val marker = doc.extractMarkerOffset(project, "/*rename*/")
assert(marker != -1)
val editorFactory = EditorFactory.getInstance()
var editor = editorFactory.getEditors(doc).firstOrNull()
var shouldReleaseEditor = false
if (editor == null) {
editor = editorFactory.createEditor(doc)
shouldReleaseEditor = true
}
try {
val isByRef = renameParamsObject["byRef"]?.asBoolean ?: false
val isInjected = renameParamsObject["injected"]?.asBoolean ?: false
var currentEditor = editor!!
var currentFile: PsiFile = psiFile
if (isByRef || isInjected) {
currentEditor.caretModel.moveToOffset(marker)
if (isInjected) {
currentFile = InjectedLanguageUtil.findInjectedPsiNoCommit(psiFile, marker)!!
currentEditor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(editor, currentFile)
}
}
val toRename = if (isByRef) {
TargetElementUtil.findTargetElement(currentEditor, TargetElementUtil.getInstance().allAccepted)!!
}
else {
currentFile.findElementAt(marker)!!.getNonStrictParentOfType<PsiNamedElement>()!!
}
val substitution = RenamePsiElementProcessor.forElement(toRename).substituteElementToRename(toRename, null)
val searchInComments = renameParamsObject["searchInComments"]?.asBoolean ?: true
val searchInTextOccurrences = renameParamsObject["searchInTextOccurrences"]?.asBoolean ?: true
runRenameProcessor(project, newName, substitution, renameParamsObject, searchInComments, searchInTextOccurrences)
}
finally {
if (shouldReleaseEditor) {
editorFactory.releaseEditor(editor!!)
}
}
}