From b0347c38222f9a3529184b1efbbeb294ba434615 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Sat, 28 Nov 2020 01:56:13 +0300 Subject: [PATCH] Stable order of generation and errors in ConvertSealedClassToEnumIntention --- .../ConvertSealedClassToEnumIntention.kt | 28 +++++++++++++------ tests/mute-platform.csv | 6 ---- tests/mute-platform.csv.201 | 5 ---- tests/mute-platform.csv.as41 | 5 ---- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSealedClassToEnumIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSealedClassToEnumIntention.kt index 282f2bf5904..3da15faa05c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSealedClassToEnumIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertSealedClassToEnumIntention.kt @@ -49,11 +49,11 @@ class ConvertSealedClassToEnumIntention : SelfTargetingRangeIntention( val klass = element.liftToExpected() as? KtClass ?: element - val subclasses = project.runSynchronouslyWithProgress(KotlinBundle.message("searching.inheritors"), true) { + val subclasses: List = project.runSynchronouslyWithProgress(KotlinBundle.message("searching.inheritors"), true) { HierarchySearchRequest(klass, klass.useScope, false).searchInheritors().mapNotNull { it.unwrapped } } ?: return - val subclassesByContainer = subclasses.groupBy { + val subclassesByContainer: Map> = 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( containingClass } - val inconvertibleSubclasses = subclassesByContainer[null] ?: emptyList() + val inconvertibleSubclasses: List = 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( } 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, 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, 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( 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( 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( entry } - subclasses.forEach { it.delete() } + movedDeclarations.forEach { it.delete() } klass.removeModifier(KtTokens.SEALED_KEYWORD) klass.addModifier(KtTokens.ENUM_KEYWORD) diff --git a/tests/mute-platform.csv b/tests/mute-platform.csv index 1a93520f31a..f244eec8a34 100644 --- a/tests/mute-platform.csv +++ b/tests/mute-platform.csv @@ -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 diff --git a/tests/mute-platform.csv.201 b/tests/mute-platform.csv.201 index 2fcdef022f7..69c5b260bc7 100644 --- a/tests/mute-platform.csv.201 +++ b/tests/mute-platform.csv.201 @@ -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,, \ No newline at end of file diff --git a/tests/mute-platform.csv.as41 b/tests/mute-platform.csv.as41 index 30507db54bd..c82ed8c1ba7 100644 --- a/tests/mute-platform.csv.as41 +++ b/tests/mute-platform.csv.as41 @@ -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,,