Fix AbstractScratchRunActionTest.kt and remove usages of projectDisposable
This commit is contained in:
+1
@@ -281,6 +281,7 @@
|
|||||||
<Problem reference="com.intellij.testFramework.PlatformTestCase#createModuleAt" reason="Not static anymore in 181 after 7dacf096c47d2125e17031c71a037b63ab00ec53" />
|
<Problem reference="com.intellij.testFramework.PlatformTestCase#createModuleAt" reason="Not static anymore in 181 after 7dacf096c47d2125e17031c71a037b63ab00ec53" />
|
||||||
<Problem reference="com.intellij.testFramework.PlatformTestCase#doCreateRealModuleIn" reason="Not static anymore in 181 after 7dacf096c47d2125e17031c71a037b63ab00ec53" />
|
<Problem reference="com.intellij.testFramework.PlatformTestCase#doCreateRealModuleIn" reason="Not static anymore in 181 after 7dacf096c47d2125e17031c71a037b63ab00ec53" />
|
||||||
<Problem reference="com.intellij.openapi.progress.ProgressManager#getProgressIndicator" reason="Nullable in 181. Temporary use progressIndicatorNullable instead." />
|
<Problem reference="com.intellij.openapi.progress.ProgressManager#getProgressIndicator" reason="Nullable in 181. Temporary use progressIndicatorNullable instead." />
|
||||||
|
<Problem reference="com.intellij.testFramework.fixtures.CodeInsightTestFixture#getProjectDisposable" reason="Method was introduced in 173 and absent in 172. Use getProjectDisposableEx instead. (95eaf81e0ea497f8c69263c11fd3202d28a7a1b2)" />
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</inspection_tool>
|
</inspection_tool>
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.compatibility
|
||||||
|
|
||||||
|
import com.intellij.openapi.Disposable
|
||||||
|
import com.intellij.testFramework.fixtures.CodeInsightTestFixture
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method was introduced in 173 idea. Should be dropped after abandoning 172 branch.
|
||||||
|
* BUNCH: 173
|
||||||
|
*/
|
||||||
|
val CodeInsightTestFixture.projectDisposableEx: Disposable get() = projectDisposable
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.compatibility
|
||||||
|
|
||||||
|
import com.intellij.openapi.Disposable
|
||||||
|
import com.intellij.testFramework.fixtures.CodeInsightTestFixture
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method was introduced in 173 idea. Should be dropped after abandoning 172 branch.
|
||||||
|
* BUNCH: 173
|
||||||
|
*/
|
||||||
|
val CodeInsightTestFixture.projectDisposableEx: Disposable get() = project
|
||||||
+2
-1
@@ -40,6 +40,7 @@ import com.intellij.refactoring.util.occurrences.ExpressionOccurrenceManager
|
|||||||
import com.intellij.testFramework.fixtures.CodeInsightTestFixture
|
import com.intellij.testFramework.fixtures.CodeInsightTestFixture
|
||||||
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
||||||
|
import org.jetbrains.kotlin.compatibility.projectDisposableEx
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils
|
import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils
|
||||||
import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively
|
import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively
|
||||||
@@ -331,7 +332,7 @@ abstract class AbstractExtractionTest : KotlinLightCodeInsightFixtureTestCase()
|
|||||||
protected fun doTest(path: String, checkAdditionalAfterdata: Boolean = false, action: (PsiFile) -> Unit) {
|
protected fun doTest(path: String, checkAdditionalAfterdata: Boolean = false, action: (PsiFile) -> Unit) {
|
||||||
val mainFile = File(path)
|
val mainFile = File(path)
|
||||||
|
|
||||||
PluginTestCaseBase.addJdk(myFixture.projectDisposable, PluginTestCaseBase::mockJdk)
|
PluginTestCaseBase.addJdk(myFixture.projectDisposableEx, PluginTestCaseBase::mockJdk)
|
||||||
|
|
||||||
fixture.testDataPath = "${KotlinTestUtils.getHomeDirectory()}/${mainFile.parent}"
|
fixture.testDataPath = "${KotlinTestUtils.getHomeDirectory()}/${mainFile.parent}"
|
||||||
|
|
||||||
|
|||||||
-467
@@ -1,467 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.refactoring.introduce
|
|
||||||
|
|
||||||
import com.intellij.codeInsight.CodeInsightUtil
|
|
||||||
import com.intellij.codeInsight.completion.JavaCompletionUtil
|
|
||||||
import com.intellij.ide.DataManager
|
|
||||||
import com.intellij.openapi.editor.Editor
|
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
|
||||||
import com.intellij.psi.PsiComment
|
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import com.intellij.psi.PsiFile
|
|
||||||
import com.intellij.psi.PsiJavaFile
|
|
||||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager
|
|
||||||
import com.intellij.psi.codeStyle.VariableKind
|
|
||||||
import com.intellij.refactoring.BaseRefactoringProcessor.ConflictsInTestsException
|
|
||||||
import com.intellij.refactoring.IntroduceParameterRefactoring
|
|
||||||
import com.intellij.refactoring.introduceField.ElementToWorkOn
|
|
||||||
import com.intellij.refactoring.introduceParameter.AbstractJavaInplaceIntroducer
|
|
||||||
import com.intellij.refactoring.introduceParameter.IntroduceParameterProcessor
|
|
||||||
import com.intellij.refactoring.introduceParameter.Util
|
|
||||||
import com.intellij.refactoring.util.CommonRefactoringUtil
|
|
||||||
import com.intellij.refactoring.util.DocCommentPolicy
|
|
||||||
import com.intellij.refactoring.util.occurrences.ExpressionOccurrenceManager
|
|
||||||
import com.intellij.testFramework.fixtures.CodeInsightTestFixture
|
|
||||||
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
|
||||||
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.chooseMembers
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ExtractSuperInfo
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ExtractSuperRefactoring
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.extractFunction.EXTRACT_FUNCTION
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.extractFunction.ExtractKotlinFunctionHandler
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.*
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.introduceParameter.*
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.introduceProperty.INTRODUCE_PROPERTY
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.introduceProperty.KotlinIntroducePropertyHandler
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.introduceTypeAlias.IntroduceTypeAliasDescriptor
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.introduceTypeAlias.KotlinIntroduceTypeAliasHandler
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.introduceTypeParameter.KotlinIntroduceTypeParameterHandler
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.introduceVariable.KotlinIntroduceVariableHandler
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.markMembersInfo
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.memberInfo.extractClassMembers
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.selectElement
|
|
||||||
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
|
|
||||||
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
|
|
||||||
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCaseBase
|
|
||||||
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
|
||||||
import org.jetbrains.kotlin.psi.*
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
|
||||||
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
|
||||||
import org.jetbrains.kotlin.test.util.findElementByCommentPrefix
|
|
||||||
import java.io.File
|
|
||||||
import java.lang.AssertionError
|
|
||||||
import java.util.*
|
|
||||||
import kotlin.test.assertEquals
|
|
||||||
|
|
||||||
abstract class AbstractExtractionTest : KotlinLightCodeInsightFixtureTestCase() {
|
|
||||||
override fun getProjectDescriptor() = LightCodeInsightFixtureTestCase.JAVA_LATEST
|
|
||||||
|
|
||||||
val fixture: JavaCodeInsightTestFixture get() = myFixture
|
|
||||||
|
|
||||||
protected fun doIntroduceVariableTest(path: String) {
|
|
||||||
doTest(path) { file ->
|
|
||||||
file as KtFile
|
|
||||||
|
|
||||||
KotlinIntroduceVariableHandler.invoke(
|
|
||||||
fixture.project,
|
|
||||||
fixture.editor,
|
|
||||||
file,
|
|
||||||
DataManager.getInstance().getDataContext(fixture.editor.component)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun doIntroduceParameterTest(path: String, asLambda: Boolean) {
|
|
||||||
doTest(path) { file ->
|
|
||||||
val fileText = file.text
|
|
||||||
|
|
||||||
open class HelperImpl: KotlinIntroduceParameterHelper {
|
|
||||||
override fun configure(descriptor: IntroduceParameterDescriptor): IntroduceParameterDescriptor {
|
|
||||||
return with (descriptor) {
|
|
||||||
val singleReplace = InTextDirectivesUtils.isDirectiveDefined(fileText, "// SINGLE_REPLACE")
|
|
||||||
val withDefaultValue = InTextDirectivesUtils.getPrefixedBoolean(fileText, "// WITH_DEFAULT_VALUE:") ?: true
|
|
||||||
|
|
||||||
copy(occurrencesToReplace = if (singleReplace) Collections.singletonList(originalOccurrence) else occurrencesToReplace,
|
|
||||||
withDefaultValue = withDefaultValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class LambdaHelperImpl: HelperImpl(), KotlinIntroduceLambdaParameterHelper {
|
|
||||||
override fun configureExtractLambda(descriptor: ExtractableCodeDescriptor): ExtractableCodeDescriptor {
|
|
||||||
return with(descriptor) {
|
|
||||||
if (name.isNullOrEmpty()) copy(suggestedNames = listOf("__dummyTestFun__")) else this
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val handler = if (asLambda) {
|
|
||||||
KotlinIntroduceLambdaParameterHandler(LambdaHelperImpl())
|
|
||||||
} else {
|
|
||||||
KotlinIntroduceParameterHandler(HelperImpl())
|
|
||||||
}
|
|
||||||
with (handler) {
|
|
||||||
val target = (file as KtFile).findElementByCommentPrefix("// TARGET:") as? KtNamedDeclaration
|
|
||||||
if (target != null) {
|
|
||||||
selectElement(fixture.editor, file, true, listOf(CodeInsightUtils.ElementKind.EXPRESSION)) { element ->
|
|
||||||
invoke(fixture.project, fixture.editor, element as KtExpression, target)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
invoke(fixture.project, fixture.editor, file, null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun doIntroduceSimpleParameterTest(path: String) {
|
|
||||||
doIntroduceParameterTest(path, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun doIntroduceLambdaParameterTest(path: String) {
|
|
||||||
doIntroduceParameterTest(path, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun doIntroduceJavaParameterTest(path: String) {
|
|
||||||
// Copied from com.intellij.refactoring.IntroduceParameterTest.perform()
|
|
||||||
doTest(path, true) { file ->
|
|
||||||
file as PsiJavaFile
|
|
||||||
|
|
||||||
var elementToWorkOn: ElementToWorkOn? = null
|
|
||||||
ElementToWorkOn.processElementToWorkOn(
|
|
||||||
editor,
|
|
||||||
file,
|
|
||||||
"Introduce parameter",
|
|
||||||
null,
|
|
||||||
project,
|
|
||||||
object : ElementToWorkOn.ElementsProcessor<ElementToWorkOn> {
|
|
||||||
override fun accept(e: ElementToWorkOn): Boolean {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun pass(e: ElementToWorkOn?) {
|
|
||||||
if (e != null) {
|
|
||||||
elementToWorkOn = e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
val expr = elementToWorkOn!!.expression
|
|
||||||
val localVar = elementToWorkOn!!.localVariable
|
|
||||||
|
|
||||||
val context = expr ?: localVar
|
|
||||||
val method = Util.getContainingMethod(context) ?: throw AssertionError("No containing method found")
|
|
||||||
|
|
||||||
val applyToSuper = InTextDirectivesUtils.isDirectiveDefined(file.getText(), "// APPLY_TO_SUPER")
|
|
||||||
val methodToSearchFor = if (applyToSuper) method.findDeepestSuperMethods()[0] else method
|
|
||||||
|
|
||||||
val (initializer, occurrences) =
|
|
||||||
if (expr == null) {
|
|
||||||
localVar.initializer!! to CodeInsightUtil.findReferenceExpressions(method, localVar)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
expr to ExpressionOccurrenceManager(expr, method, null).findExpressionOccurrences()
|
|
||||||
}
|
|
||||||
val type = initializer.type
|
|
||||||
|
|
||||||
val parametersToRemove = Util.findParametersToRemove(method, initializer, occurrences)
|
|
||||||
|
|
||||||
val codeStyleManager = JavaCodeStyleManager.getInstance(project)
|
|
||||||
val info = codeStyleManager.suggestUniqueVariableName(
|
|
||||||
codeStyleManager.suggestVariableName(VariableKind.PARAMETER, localVar?.name, initializer, type),
|
|
||||||
expr,
|
|
||||||
true
|
|
||||||
)
|
|
||||||
val suggestedNames = AbstractJavaInplaceIntroducer.appendUnresolvedExprName(
|
|
||||||
JavaCompletionUtil.completeVariableNameForRefactoring(codeStyleManager, type, VariableKind.LOCAL_VARIABLE, info),
|
|
||||||
initializer
|
|
||||||
)
|
|
||||||
|
|
||||||
IntroduceParameterProcessor(project,
|
|
||||||
method,
|
|
||||||
methodToSearchFor,
|
|
||||||
initializer,
|
|
||||||
expr,
|
|
||||||
localVar,
|
|
||||||
true,
|
|
||||||
suggestedNames.first(),
|
|
||||||
true,
|
|
||||||
IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_NONE,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
parametersToRemove).run()
|
|
||||||
|
|
||||||
editor.selectionModel.removeSelection()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun doIntroducePropertyTest(path: String) {
|
|
||||||
doTest(path) { file ->
|
|
||||||
file as KtFile
|
|
||||||
|
|
||||||
val extractionTarget = propertyTargets.single {
|
|
||||||
it.targetName == InTextDirectivesUtils.findStringWithPrefixes(file.getText(), "// EXTRACTION_TARGET: ")
|
|
||||||
}
|
|
||||||
val explicitPreviousSibling = file.findElementByCommentPrefix("// SIBLING:")
|
|
||||||
val helper = object : ExtractionEngineHelper(INTRODUCE_PROPERTY) {
|
|
||||||
override fun validate(descriptor: ExtractableCodeDescriptor) = descriptor.validate(extractionTarget)
|
|
||||||
|
|
||||||
override fun configureAndRun(
|
|
||||||
project: Project,
|
|
||||||
editor: Editor,
|
|
||||||
descriptorWithConflicts: ExtractableCodeDescriptorWithConflicts,
|
|
||||||
onFinish: (ExtractionResult) -> Unit
|
|
||||||
) {
|
|
||||||
doRefactor(
|
|
||||||
ExtractionGeneratorConfiguration(
|
|
||||||
descriptorWithConflicts.descriptor,
|
|
||||||
ExtractionGeneratorOptions.DEFAULT.copy(target = extractionTarget, delayInitialOccurrenceReplacement = true)
|
|
||||||
),
|
|
||||||
onFinish
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val handler = KotlinIntroducePropertyHandler(helper)
|
|
||||||
val editor = fixture.editor
|
|
||||||
handler.selectElements(editor, file) { elements, previousSibling ->
|
|
||||||
handler.doInvoke(project, editor, file, elements, explicitPreviousSibling ?: previousSibling)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun doExtractFunctionTest(path: String) {
|
|
||||||
doTest(path) { file -> doExtractFunction(myFixture, file as KtFile) }
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun doIntroduceTypeParameterTest(path: String) {
|
|
||||||
doTest(path) { file ->
|
|
||||||
file as KtFile
|
|
||||||
|
|
||||||
val explicitPreviousSibling = file.findElementByCommentPrefix("// SIBLING:")
|
|
||||||
val editor = fixture.editor
|
|
||||||
KotlinIntroduceTypeParameterHandler.selectElements(editor, file) { elements, previousSibling ->
|
|
||||||
KotlinIntroduceTypeParameterHandler.doInvoke(project, editor, elements, explicitPreviousSibling ?: previousSibling)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun doIntroduceTypeAliasTest(path: String) {
|
|
||||||
doTest(path) { file ->
|
|
||||||
file as KtFile
|
|
||||||
|
|
||||||
val explicitPreviousSibling = file.findElementByCommentPrefix("// SIBLING:")
|
|
||||||
val fileText = file.text
|
|
||||||
val aliasName = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// NAME:")
|
|
||||||
val aliasVisibility = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// VISIBILITY:")?.let {
|
|
||||||
KtPsiFactory(project).createModifierList(it).firstChild.node.elementType as KtModifierKeywordToken
|
|
||||||
}
|
|
||||||
val editor = fixture.editor
|
|
||||||
object : KotlinIntroduceTypeAliasHandler() {
|
|
||||||
override fun doInvoke(
|
|
||||||
project: Project,
|
|
||||||
editor: Editor,
|
|
||||||
elements: List<PsiElement>,
|
|
||||||
targetSibling: PsiElement,
|
|
||||||
descriptorSubstitutor: ((IntroduceTypeAliasDescriptor) -> IntroduceTypeAliasDescriptor)?
|
|
||||||
) {
|
|
||||||
super.doInvoke(project, editor, elements, explicitPreviousSibling ?: targetSibling) {
|
|
||||||
it.copy(name = aliasName ?: it.name, visibility = aliasVisibility ?: it.visibility)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.invoke(project, editor, file, null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun doExtractSuperTest(path: String, isInterface: Boolean) {
|
|
||||||
doTest(path) { file ->
|
|
||||||
file as KtFile
|
|
||||||
|
|
||||||
markMembersInfo(file)
|
|
||||||
|
|
||||||
val targetParent = file.findElementByCommentPrefix("// SIBLING:")?.parent ?: file.parent!!
|
|
||||||
val fileText = file.text
|
|
||||||
val className = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// NAME:")!!
|
|
||||||
val editor = fixture.editor
|
|
||||||
val originalClass = file.findElementAt(editor.caretModel.offset)?.getStrictParentOfType<KtClassOrObject>()!!
|
|
||||||
val memberInfos = chooseMembers(extractClassMembers(originalClass))
|
|
||||||
val conflicts = ExtractSuperRefactoring.collectConflicts(originalClass, memberInfos, targetParent, className, isInterface)
|
|
||||||
project.checkConflictsInteractively(conflicts) {
|
|
||||||
val extractInfo = ExtractSuperInfo(
|
|
||||||
originalClass,
|
|
||||||
memberInfos,
|
|
||||||
targetParent,
|
|
||||||
"$className.${KotlinFileType.EXTENSION}",
|
|
||||||
className,
|
|
||||||
isInterface,
|
|
||||||
DocCommentPolicy<PsiComment>(DocCommentPolicy.ASIS)
|
|
||||||
)
|
|
||||||
ExtractSuperRefactoring(extractInfo).performRefactoring()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun doExtractSuperclassTest(path: String) = doExtractSuperTest(path, false)
|
|
||||||
|
|
||||||
protected fun doExtractInterfaceTest(path: String) = doExtractSuperTest(path, true)
|
|
||||||
|
|
||||||
protected fun doTest(path: String, checkAdditionalAfterdata: Boolean = false, action: (PsiFile) -> Unit) {
|
|
||||||
val mainFile = File(path)
|
|
||||||
|
|
||||||
PluginTestCaseBase.addJdk(myFixture.project, PluginTestCaseBase::mockJdk)
|
|
||||||
|
|
||||||
fixture.testDataPath = "${KotlinTestUtils.getHomeDirectory()}/${mainFile.parent}"
|
|
||||||
|
|
||||||
val mainFileName = mainFile.name
|
|
||||||
val mainFileBaseName = FileUtil.getNameWithoutExtension(mainFileName)
|
|
||||||
val extraFiles = mainFile.parentFile.listFiles { _, name ->
|
|
||||||
name != mainFileName && name.startsWith("$mainFileBaseName.") && (name.endsWith(".kt") || name.endsWith(".java"))
|
|
||||||
}
|
|
||||||
val extraFilesToPsi = extraFiles.associateBy { fixture.configureByFile(it.name) }
|
|
||||||
val fileText = FileUtil.loadFile(File(path), true)
|
|
||||||
|
|
||||||
val addKotlinRuntime = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// WITH_RUNTIME") != null
|
|
||||||
if (addKotlinRuntime) {
|
|
||||||
ConfigLibraryUtil.configureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk())
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
checkExtract(ExtractTestFiles(path, fixture.configureByFile(mainFileName), extraFilesToPsi), checkAdditionalAfterdata, action)
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if (addKotlinRuntime) {
|
|
||||||
ConfigLibraryUtil.unConfigureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ExtractTestFiles(
|
|
||||||
val mainFile: PsiFile,
|
|
||||||
val afterFile: File,
|
|
||||||
val conflictFile: File,
|
|
||||||
val extraFilesToPsi: Map<PsiFile, File> = emptyMap()) {
|
|
||||||
constructor(path: String, mainFile: PsiFile, extraFilesToPsi: Map<PsiFile, File> = emptyMap()) :
|
|
||||||
this(mainFile, File("$path.after"), File("$path.conflicts"), extraFilesToPsi)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun checkExtract(files: ExtractTestFiles, checkAdditionalAfterdata: Boolean = false, action: (PsiFile) -> Unit) {
|
|
||||||
val conflictFile = files.conflictFile
|
|
||||||
val afterFile = files.afterFile
|
|
||||||
|
|
||||||
try {
|
|
||||||
action(files.mainFile)
|
|
||||||
|
|
||||||
assert(!conflictFile.exists()) { "Conflict file $conflictFile should not exist" }
|
|
||||||
KotlinTestUtils.assertEqualsToFile(afterFile, files.mainFile.text!!)
|
|
||||||
|
|
||||||
if (checkAdditionalAfterdata) {
|
|
||||||
for ((extraPsiFile, extraFile) in files.extraFilesToPsi) {
|
|
||||||
KotlinTestUtils.assertEqualsToFile(File("${extraFile.path}.after"), extraPsiFile.text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(e: ConflictsInTestsException) {
|
|
||||||
val message = e.messages.sorted().joinToString(" ").replace("\n", " ")
|
|
||||||
KotlinTestUtils.assertEqualsToFile(conflictFile, message)
|
|
||||||
}
|
|
||||||
catch(e: CommonRefactoringUtil.RefactoringErrorHintException) {
|
|
||||||
KotlinTestUtils.assertEqualsToFile(conflictFile, e.message!!)
|
|
||||||
}
|
|
||||||
catch(e: RuntimeException) { // RuntimeException is thrown by IDEA code in CodeInsightUtils.java
|
|
||||||
if (e::class.java != RuntimeException::class.java) throw e
|
|
||||||
KotlinTestUtils.assertEqualsToFile(conflictFile, e.message!!)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun doExtractFunction(fixture: CodeInsightTestFixture, file: KtFile) {
|
|
||||||
val explicitPreviousSibling = file.findElementByCommentPrefix("// SIBLING:")
|
|
||||||
val fileText = file.getText() ?: ""
|
|
||||||
val expectedNames = InTextDirectivesUtils.findListWithPrefixes(fileText, "// SUGGESTED_NAMES: ")
|
|
||||||
val expectedReturnTypes = InTextDirectivesUtils.findListWithPrefixes(fileText, "// SUGGESTED_RETURN_TYPES: ")
|
|
||||||
val expectedDescriptors =
|
|
||||||
InTextDirectivesUtils.findLinesWithPrefixesRemoved(fileText, "// PARAM_DESCRIPTOR: ").joinToString()
|
|
||||||
val expectedTypes =
|
|
||||||
InTextDirectivesUtils.findLinesWithPrefixesRemoved(fileText, "// PARAM_TYPES: ").map { "[$it]" }.joinToString()
|
|
||||||
|
|
||||||
val extractionOptions = InTextDirectivesUtils.findListWithPrefixes(fileText, "// OPTIONS: ").let {
|
|
||||||
if (it.isNotEmpty()) {
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val args = it.map { it.toBoolean() }.toTypedArray() as Array<Any?>
|
|
||||||
ExtractionOptions::class.java.constructors.first { it.parameterTypes.size == args.size }.newInstance(*args) as ExtractionOptions
|
|
||||||
} else ExtractionOptions.DEFAULT
|
|
||||||
}
|
|
||||||
|
|
||||||
val renderer = DescriptorRenderer.FQ_NAMES_IN_TYPES
|
|
||||||
|
|
||||||
val editor = fixture.editor
|
|
||||||
val handler = ExtractKotlinFunctionHandler(
|
|
||||||
helper = object : ExtractionEngineHelper(EXTRACT_FUNCTION) {
|
|
||||||
override fun adjustExtractionData(data: ExtractionData): ExtractionData {
|
|
||||||
return data.copy(options = extractionOptions)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun configureAndRun(
|
|
||||||
project: Project,
|
|
||||||
editor: Editor,
|
|
||||||
descriptorWithConflicts: ExtractableCodeDescriptorWithConflicts,
|
|
||||||
onFinish: (ExtractionResult) -> Unit
|
|
||||||
) {
|
|
||||||
val descriptor = descriptorWithConflicts.descriptor
|
|
||||||
val actualNames = descriptor.suggestedNames
|
|
||||||
val actualReturnTypes = descriptor.controlFlow.possibleReturnTypes.map {
|
|
||||||
IdeDescriptorRenderers.SOURCE_CODE.renderType(it)
|
|
||||||
}
|
|
||||||
val allParameters = listOfNotNull(descriptor.receiverParameter) + descriptor.parameters
|
|
||||||
val actualDescriptors = allParameters.map { renderer.render(it.originalDescriptor) }.joinToString()
|
|
||||||
val actualTypes = allParameters.map {
|
|
||||||
it.getParameterTypeCandidates(false).map { renderer.renderType(it) }.joinToString(", ", "[", "]")
|
|
||||||
}.joinToString()
|
|
||||||
|
|
||||||
if (actualNames.size != 1 || expectedNames.isNotEmpty()) {
|
|
||||||
assertEquals(expectedNames, actualNames, "Expected names mismatch.")
|
|
||||||
}
|
|
||||||
if (actualReturnTypes.size != 1 || expectedReturnTypes.isNotEmpty()) {
|
|
||||||
assertEquals(expectedReturnTypes, actualReturnTypes, "Expected return types mismatch.")
|
|
||||||
}
|
|
||||||
KotlinLightCodeInsightFixtureTestCaseBase.assertEquals("Expected descriptors mismatch.", expectedDescriptors, actualDescriptors)
|
|
||||||
KotlinLightCodeInsightFixtureTestCaseBase.assertEquals("Expected types mismatch.", expectedTypes, actualTypes)
|
|
||||||
|
|
||||||
val newDescriptor = if (descriptor.name == "") {
|
|
||||||
descriptor.copy(suggestedNames = Collections.singletonList("__dummyTestFun__"))
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
descriptor
|
|
||||||
}
|
|
||||||
|
|
||||||
doRefactor(ExtractionGeneratorConfiguration(newDescriptor, ExtractionGeneratorOptions.DEFAULT), onFinish)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
handler.selectElements(editor, file) { elements, previousSibling ->
|
|
||||||
handler.doInvoke(editor, file, elements, explicitPreviousSibling ?: previousSibling)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -32,6 +32,7 @@ import com.intellij.testFramework.MapDataContext
|
|||||||
import com.intellij.testFramework.PsiTestUtil
|
import com.intellij.testFramework.PsiTestUtil
|
||||||
import com.intellij.testFramework.TestActionEvent
|
import com.intellij.testFramework.TestActionEvent
|
||||||
import com.intellij.util.ui.UIUtil
|
import com.intellij.util.ui.UIUtil
|
||||||
|
import org.jetbrains.kotlin.compatibility.projectDisposableEx
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.idea.scratch.actions.RunScratchAction
|
import org.jetbrains.kotlin.idea.scratch.actions.RunScratchAction
|
||||||
import org.jetbrains.kotlin.idea.scratch.output.InlayScratchOutputHandler
|
import org.jetbrains.kotlin.idea.scratch.output.InlayScratchOutputHandler
|
||||||
@@ -164,7 +165,7 @@ abstract class AbstractScratchRunActionTest : FileEditorManagerTestCase() {
|
|||||||
override fun setUp() {
|
override fun setUp() {
|
||||||
super.setUp()
|
super.setUp()
|
||||||
|
|
||||||
PluginTestCaseBase.addJdk(myFixture.projectDisposable) { PluginTestCaseBase.fullJdk() }
|
PluginTestCaseBase.addJdk(myFixture.projectDisposableEx) { PluginTestCaseBase.fullJdk() }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun tearDown() {
|
override fun tearDown() {
|
||||||
|
|||||||
+2
-1
@@ -25,6 +25,7 @@ import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
|||||||
import icons.SpringApiIcons
|
import icons.SpringApiIcons
|
||||||
import junit.framework.Assert
|
import junit.framework.Assert
|
||||||
import junit.framework.AssertionFailedError
|
import junit.framework.AssertionFailedError
|
||||||
|
import org.jetbrains.kotlin.compatibility.projectDisposableEx
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
||||||
import org.jetbrains.kotlin.idea.spring.lineMarking.KotlinSpringClassAnnotator
|
import org.jetbrains.kotlin.idea.spring.lineMarking.KotlinSpringClassAnnotator
|
||||||
@@ -55,7 +56,7 @@ abstract class AbstractSpringClassAnnotatorTest : KotlinLightCodeInsightFixtureT
|
|||||||
|
|
||||||
val config = JsonParser().parse(FileUtil.loadFile(configFile, true)) as JsonObject
|
val config = JsonParser().parse(FileUtil.loadFile(configFile, true)) as JsonObject
|
||||||
|
|
||||||
PluginTestCaseBase.addJdk(myFixture.projectDisposable, PluginTestCaseBase::mockJdk)
|
PluginTestCaseBase.addJdk(myFixture.projectDisposableEx, PluginTestCaseBase::mockJdk)
|
||||||
|
|
||||||
val withRuntime = config["withRuntime"]?.asBoolean ?: false
|
val withRuntime = config["withRuntime"]?.asBoolean ?: false
|
||||||
if (withRuntime) {
|
if (withRuntime) {
|
||||||
|
|||||||
+2
-1
@@ -25,6 +25,7 @@ import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
|||||||
import icons.SpringApiIcons
|
import icons.SpringApiIcons
|
||||||
import junit.framework.Assert
|
import junit.framework.Assert
|
||||||
import junit.framework.AssertionFailedError
|
import junit.framework.AssertionFailedError
|
||||||
|
import org.jetbrains.kotlin.compatibility.projectDisposableEx
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
||||||
import org.jetbrains.kotlin.idea.spring.lineMarking.KotlinSpringClassAnnotator
|
import org.jetbrains.kotlin.idea.spring.lineMarking.KotlinSpringClassAnnotator
|
||||||
@@ -55,7 +56,7 @@ abstract class AbstractSpringClassAnnotatorTest : KotlinLightCodeInsightFixtureT
|
|||||||
|
|
||||||
val config = JsonParser().parse(FileUtil.loadFile(configFile, true)) as JsonObject
|
val config = JsonParser().parse(FileUtil.loadFile(configFile, true)) as JsonObject
|
||||||
|
|
||||||
PluginTestCaseBase.addJdk(myFixture.project, PluginTestCaseBase::mockJdk)
|
PluginTestCaseBase.addJdk(myFixture.projectDisposableEx, PluginTestCaseBase::mockJdk)
|
||||||
|
|
||||||
val withRuntime = config["withRuntime"]?.asBoolean ?: false
|
val withRuntime = config["withRuntime"]?.asBoolean ?: false
|
||||||
if (withRuntime) {
|
if (withRuntime) {
|
||||||
|
|||||||
+2
-1
@@ -25,6 +25,7 @@ import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
|||||||
import icons.SpringApiIcons
|
import icons.SpringApiIcons
|
||||||
import junit.framework.Assert
|
import junit.framework.Assert
|
||||||
import junit.framework.AssertionFailedError
|
import junit.framework.AssertionFailedError
|
||||||
|
import org.jetbrains.kotlin.compatibility.projectDisposableEx
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
||||||
import org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension
|
import org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension
|
||||||
@@ -50,7 +51,7 @@ abstract class AbstractSpringClassAnnotatorTest : KotlinLightCodeInsightFixtureT
|
|||||||
|
|
||||||
val config = JsonParser().parse(FileUtil.loadFile(configFile, true)) as JsonObject
|
val config = JsonParser().parse(FileUtil.loadFile(configFile, true)) as JsonObject
|
||||||
|
|
||||||
PluginTestCaseBase.addJdk(myFixture.projectDisposable, PluginTestCaseBase::mockJdk)
|
PluginTestCaseBase.addJdk(myFixture.projectDisposableEx, PluginTestCaseBase::mockJdk)
|
||||||
|
|
||||||
val withRuntime = config["withRuntime"]?.asBoolean ?: false
|
val withRuntime = config["withRuntime"]?.asBoolean ?: false
|
||||||
if (withRuntime) {
|
if (withRuntime) {
|
||||||
|
|||||||
Reference in New Issue
Block a user