Stable order of generation and errors in ConvertSealedClassToEnumIntention
This commit is contained in:
committed by
TeamCityServer
parent
2ad4824eb0
commit
b0347c3822
@@ -49,11 +49,11 @@ class ConvertSealedClassToEnumIntention : SelfTargetingRangeIntention<KtClass>(
|
||||
|
||||
val klass = element.liftToExpected() as? KtClass ?: element
|
||||
|
||||
val subclasses = project.runSynchronouslyWithProgress(KotlinBundle.message("searching.inheritors"), true) {
|
||||
val subclasses: List<PsiElement> = project.runSynchronouslyWithProgress(KotlinBundle.message("searching.inheritors"), true) {
|
||||
HierarchySearchRequest(klass, klass.useScope, false).searchInheritors().mapNotNull { it.unwrapped }
|
||||
} ?: return
|
||||
|
||||
val subclassesByContainer = subclasses.groupBy {
|
||||
val subclassesByContainer: Map<KtClass?, List<PsiElement>> = subclasses.groupBy {
|
||||
if (it !is KtObjectDeclaration) return@groupBy null
|
||||
if (it.superTypeListEntries.size != 1) return@groupBy null
|
||||
val containingClass = it.containingClassOrObject as? KtClass ?: return@groupBy null
|
||||
@@ -61,7 +61,7 @@ class ConvertSealedClassToEnumIntention : SelfTargetingRangeIntention<KtClass>(
|
||||
containingClass
|
||||
}
|
||||
|
||||
val inconvertibleSubclasses = subclassesByContainer[null] ?: emptyList()
|
||||
val inconvertibleSubclasses: List<PsiElement> = subclassesByContainer[null] ?: emptyList()
|
||||
if (inconvertibleSubclasses.isNotEmpty()) {
|
||||
return showError(
|
||||
KotlinBundle.message("all.inheritors.must.be.nested.objects.of.the.class.itself.and.may.not.inherit.from.other.classes.or.interfaces"),
|
||||
@@ -83,23 +83,34 @@ class ConvertSealedClassToEnumIntention : SelfTargetingRangeIntention<KtClass>(
|
||||
}
|
||||
|
||||
if (subclassesByContainer.isNotEmpty()) {
|
||||
subclassesByContainer.forEach { (currentClass, currentSubclasses) -> processClass(currentClass!!, currentSubclasses, project) }
|
||||
subclassesByContainer.forEach { (currentClass, currentSubclasses) ->
|
||||
processClass(currentClass!!, currentSubclasses, project)
|
||||
}
|
||||
} else {
|
||||
processClass(klass, emptyList(), project)
|
||||
}
|
||||
}
|
||||
|
||||
private fun showError(message: String, elements: List<PsiElement>, project: Project, editor: Editor?) {
|
||||
val elementDescriptions = elements.map {
|
||||
ElementDescriptionUtil.getElementDescription(it, RefactoringDescriptionLocation.WITHOUT_PARENT)
|
||||
}
|
||||
|
||||
val errorText = buildString {
|
||||
append(message)
|
||||
append(KotlinBundle.message("following.problems.are.found"))
|
||||
elements.joinTo(this) { ElementDescriptionUtil.getElementDescription(it, RefactoringDescriptionLocation.WITHOUT_PARENT) }
|
||||
elementDescriptions.sorted().joinTo(this)
|
||||
}
|
||||
|
||||
return CommonRefactoringUtil.showErrorHint(project, editor, errorText, text, null)
|
||||
}
|
||||
|
||||
private fun processClass(klass: KtClass, subclasses: List<PsiElement>, project: Project) {
|
||||
val needSemicolon = klass.declarations.size > subclasses.size
|
||||
val movedDeclarations = run {
|
||||
val subclassesSet = subclasses.toSet()
|
||||
klass.declarations.filter { it in subclassesSet }
|
||||
}
|
||||
|
||||
val psiFactory = KtPsiFactory(klass)
|
||||
|
||||
@@ -107,7 +118,8 @@ class ConvertSealedClassToEnumIntention : SelfTargetingRangeIntention<KtClass>(
|
||||
val semicolon = psiFactory.createSemicolon()
|
||||
|
||||
val constructorCallNeeded = klass.hasExplicitPrimaryConstructor() || klass.secondaryConstructors.isNotEmpty()
|
||||
val entriesToAdd = subclasses.mapIndexed { i, subclass ->
|
||||
|
||||
val entriesToAdd = movedDeclarations.mapIndexed { i, subclass ->
|
||||
subclass as KtObjectDeclaration
|
||||
|
||||
val entryText = buildString {
|
||||
@@ -120,7 +132,7 @@ class ConvertSealedClassToEnumIntention : SelfTargetingRangeIntention<KtClass>(
|
||||
val entry = psiFactory.createEnumEntry(entryText)
|
||||
subclass.body?.let { body -> entry.add(body) }
|
||||
|
||||
if (i < subclasses.lastIndex) {
|
||||
if (i < movedDeclarations.lastIndex) {
|
||||
entry.add(comma)
|
||||
} else if (needSemicolon) {
|
||||
entry.add(semicolon)
|
||||
@@ -129,7 +141,7 @@ class ConvertSealedClassToEnumIntention : SelfTargetingRangeIntention<KtClass>(
|
||||
entry
|
||||
}
|
||||
|
||||
subclasses.forEach { it.delete() }
|
||||
movedDeclarations.forEach { it.delete() }
|
||||
|
||||
klass.removeModifier(KtTokens.SEALED_KEYWORD)
|
||||
klass.addModifier(KtTokens.ENUM_KEYWORD)
|
||||
|
||||
@@ -62,14 +62,11 @@ org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveB
|
||||
org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveBraces.testIf, KT-34408,,
|
||||
org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveBraces.testNotSingleLineStatement, KT-34408,,
|
||||
org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveBraces.testWhenEntry, KT-34408,,
|
||||
org.jetbrains.kotlin.idea.intentions.IntentionTestGenerated.ConvertSealedClassToEnum.testWithNonObjectInheritors, Enum reorder,, FLAKY
|
||||
org.jetbrains.kotlin.idea.navigation.KotlinGotoImplementationMultiModuleTestGenerated.testExpectClassSuperclassFun,,, FLAKY
|
||||
org.jetbrains.kotlin.idea.parameterInfo.ParameterInfoTestGenerated.WithLib1.testUseJavaFromLib, KT-34542, FAIL,
|
||||
org.jetbrains.kotlin.idea.parameterInfo.ParameterInfoTestGenerated.WithLib2.testUseJavaSAMFromLib, KT-34542, FAIL,
|
||||
org.jetbrains.kotlin.idea.parameterInfo.ParameterInfoTestGenerated.WithLib3.testUseJavaSAMFromLib, KT-34542, FAIL,
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiFileTestGenerated.ChangeSignature.Jk.testJkKeepValOnParameterTypeChange, Unprocessed,,
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiModuleTestGenerated.Other.testConvertActualSealedClassToEnum, Enum reorder,,
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiModuleTestGenerated.Other.testConvertExpectSealedClassToEnum, Enum reorder,,
|
||||
org.jetbrains.kotlin.idea.refactoring.inline.InlineTestGenerated.Function.ExpressionBody.testMultipleInExpression, Unstable order of usages,,FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.introduce.ExtractionTestGenerated.IntroduceJavaParameter.testJavaMethodOverridingKotlinFunctionWithUsages, Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.move.MoveTestGenerated.testJava_moveClass_moveInnerToTop_moveNestedClassToTopLevelInTheSamePackageAndAddOuterInstanceWithLambda_MoveNestedClassToTopLevelInTheSamePackageAndAddOuterInstanceWithLambda, final modifier added,,
|
||||
@@ -111,8 +108,6 @@ org.jetbrains.kotlin.jps.build.IncrementalJvmJpsTestGenerated.WithJava.JavaUsedI
|
||||
org.jetbrains.kotlin.idea.codeInsight.surroundWith.SurroundWithTestGenerated.If.MoveDeclarationsOut.Var.testVarWithTypeWoInitializer, Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.pullUp.PullUpTestGenerated.K2K.testAccidentalOverrides, Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.move.MoveTestGenerated.testKotlin_moveTopLevelDeclarations_moveFunctionToPackage_MoveFunctionToPackage, fail on TeamCity but works well locally,, FLAKY
|
||||
org.jetbrains.kotlin.idea.intentions.IntentionTestGenerated.ConvertSealedClassToEnum.testInstancesOnly, Generated entries reordered,, FLAKY
|
||||
org.jetbrains.kotlin.idea.intentions.IntentionTestGenerated.ConvertSealedClassToEnum.testInstancesAndMembers, Enum reorder,, FLAKY
|
||||
org.jetbrains.kotlin.idea.navigation.GotoDeclarationTestGenerated.testImportAliasMultiDeclarations, showInBestPositionFor doesn't work in headless in 202,,
|
||||
org.jetbrains.kotlin.idea.navigation.GotoDeclarationTestGenerated.testItParameterInLambda,Broken in 202,,
|
||||
org.jetbrains.kotlin.idea.navigation.GotoDeclarationTestGenerated.testThisExtensionFunction,Broken in 202,,
|
||||
@@ -134,7 +129,6 @@ org.jetbrains.kotlin.idea.externalAnnotations.ExternalAnnotationTest.testNotNull
|
||||
org.jetbrains.kotlin.idea.externalAnnotations.ExternalAnnotationTest.testNullableMethodParameter,Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.externalAnnotations.ExternalAnnotationTest.testNullableField,Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.externalAnnotations.ExternalAnnotationTest.testNullableMethod,Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiModuleTestGenerated$Other.testConvertActualSealedClassToEnum,Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.quickfix.UpdateConfigurationQuickFixTest.testEnableCoroutinesFacet,Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.quickfix.UpdateConfigurationQuickFixTest.testEnableInlineClasses,Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.quickfix.UpdateConfigurationQuickFixTest.testIncreaseLangLevelFacet,Unprocessed,, FLAKY
|
||||
|
||||
|
@@ -64,14 +64,11 @@ org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveB
|
||||
org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveBraces.testIf, KT-34408,,
|
||||
org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveBraces.testNotSingleLineStatement, KT-34408,,
|
||||
org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveBraces.testWhenEntry, KT-34408,,
|
||||
org.jetbrains.kotlin.idea.intentions.IntentionTestGenerated.ConvertSealedClassToEnum.testWithNonObjectInheritors, Enum reorder,, FLAKY
|
||||
org.jetbrains.kotlin.idea.navigation.KotlinGotoImplementationMultiModuleTestGenerated.testExpectClassSuperclassFun,,, FLAKY
|
||||
org.jetbrains.kotlin.idea.parameterInfo.ParameterInfoTestGenerated.WithLib1.testUseJavaFromLib, KT-34542, FAIL,
|
||||
org.jetbrains.kotlin.idea.parameterInfo.ParameterInfoTestGenerated.WithLib2.testUseJavaSAMFromLib, KT-34542, FAIL,
|
||||
org.jetbrains.kotlin.idea.parameterInfo.ParameterInfoTestGenerated.WithLib3.testUseJavaSAMFromLib, KT-34542, FAIL,
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiFileTestGenerated.ChangeSignature.Jk.testJkKeepValOnParameterTypeChange, Unprocessed,,
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiModuleTestGenerated.Other.testConvertActualSealedClassToEnum, Enum reorder,,
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiModuleTestGenerated.Other.testConvertExpectSealedClassToEnum, Enum reorder,,
|
||||
org.jetbrains.kotlin.idea.refactoring.inline.InlineTestGenerated.Function.ExpressionBody.testMultipleInExpression, Unstable order of usages,,FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.introduce.ExtractionTestGenerated.IntroduceJavaParameter.testJavaMethodOverridingKotlinFunctionWithUsages, Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.move.MoveTestGenerated.testJava_moveClass_moveInnerToTop_moveNestedClassToTopLevelInTheSamePackageAndAddOuterInstanceWithLambda_MoveNestedClassToTopLevelInTheSamePackageAndAddOuterInstanceWithLambda, final modifier added,,
|
||||
@@ -113,8 +110,6 @@ org.jetbrains.kotlin.jps.build.IncrementalJvmJpsTestGenerated.WithJava.JavaUsedI
|
||||
org.jetbrains.kotlin.idea.codeInsight.surroundWith.SurroundWithTestGenerated.If.MoveDeclarationsOut.Var.testVarWithTypeWoInitializer, Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.pullUp.PullUpTestGenerated.K2K.testAccidentalOverrides, Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.move.MoveTestGenerated.testKotlin_moveTopLevelDeclarations_moveFunctionToPackage_MoveFunctionToPackage, fail on TeamCity but works well locally,, FLAKY
|
||||
org.jetbrains.kotlin.idea.intentions.IntentionTestGenerated.ConvertSealedClassToEnum.testInstancesOnly, Generated entries reordered,, FLAKY
|
||||
org.jetbrains.kotlin.idea.intentions.IntentionTestGenerated.ConvertSealedClassToEnum.testInstancesAndMembers, Enum reorder,, FLAKY
|
||||
org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptListenerTest.testChangeInsideNonKtsFileInvalidatesOtherFiles, Unprocessed,,
|
||||
org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptListenerTest.testTwoFilesChanged, Unprocessed,,
|
||||
org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptListenerTest.testLoadedConfigurationWhenExternalFileChanged, Unprocessed,,
|
||||
@@ -64,14 +64,11 @@ org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveB
|
||||
org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveBraces.testIf, KT-34408,,
|
||||
org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveBraces.testNotSingleLineStatement, KT-34408,,
|
||||
org.jetbrains.kotlin.idea.intentions.declarations.JoinLinesTestGenerated.RemoveBraces.testWhenEntry, KT-34408,,
|
||||
org.jetbrains.kotlin.idea.intentions.IntentionTestGenerated.ConvertSealedClassToEnum.testWithNonObjectInheritors, Enum reorder,, FLAKY
|
||||
org.jetbrains.kotlin.idea.navigation.KotlinGotoImplementationMultiModuleTestGenerated.testExpectClassSuperclassFun,,, FLAKY
|
||||
org.jetbrains.kotlin.idea.parameterInfo.ParameterInfoTestGenerated.WithLib1.testUseJavaFromLib, KT-34542, FAIL,
|
||||
org.jetbrains.kotlin.idea.parameterInfo.ParameterInfoTestGenerated.WithLib2.testUseJavaSAMFromLib, KT-34542, FAIL,
|
||||
org.jetbrains.kotlin.idea.parameterInfo.ParameterInfoTestGenerated.WithLib3.testUseJavaSAMFromLib, KT-34542, FAIL,
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiFileTestGenerated.ChangeSignature.Jk.testJkKeepValOnParameterTypeChange, Unprocessed,,
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiModuleTestGenerated.Other.testConvertActualSealedClassToEnum, Enum reorder,,
|
||||
org.jetbrains.kotlin.idea.quickfix.QuickFixMultiModuleTestGenerated.Other.testConvertExpectSealedClassToEnum, Enum reorder,,
|
||||
org.jetbrains.kotlin.idea.refactoring.inline.InlineTestGenerated.Function.ExpressionBody.testMultipleInExpression, Unstable order of usages,,FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.introduce.ExtractionTestGenerated.IntroduceJavaParameter.testJavaMethodOverridingKotlinFunctionWithUsages, Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.move.MoveTestGenerated.testJava_moveClass_moveInnerToTop_moveNestedClassToTopLevelInTheSamePackageAndAddOuterInstanceWithLambda_MoveNestedClassToTopLevelInTheSamePackageAndAddOuterInstanceWithLambda, final modifier added,,
|
||||
@@ -113,8 +110,6 @@ org.jetbrains.kotlin.jps.build.IncrementalJvmJpsTestGenerated.WithJava.JavaUsedI
|
||||
org.jetbrains.kotlin.idea.codeInsight.surroundWith.SurroundWithTestGenerated.If.MoveDeclarationsOut.Var.testVarWithTypeWoInitializer, Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.pullUp.PullUpTestGenerated.K2K.testAccidentalOverrides, Unprocessed,, FLAKY
|
||||
org.jetbrains.kotlin.idea.refactoring.move.MoveTestGenerated.testKotlin_moveTopLevelDeclarations_moveFunctionToPackage_MoveFunctionToPackage, fail on TeamCity but works well locally,, FLAKY
|
||||
org.jetbrains.kotlin.idea.intentions.IntentionTestGenerated.ConvertSealedClassToEnum.testInstancesOnly, Generated entries reordered,, FLAKY
|
||||
org.jetbrains.kotlin.idea.intentions.IntentionTestGenerated.ConvertSealedClassToEnum.testInstancesAndMembers, Enum reorder,, FLAKY
|
||||
org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptListenerTest.testChangeInsideNonKtsFileInvalidatesOtherFiles, Unprocessed,,
|
||||
org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptListenerTest.testTwoFilesChanged, Unprocessed,,
|
||||
org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptListenerTest.testLoadedConfigurationWhenExternalFileChanged, Unprocessed,,
|
||||
|
||||
Reference in New Issue
Block a user