From 8805675539fc02f79b576f0fbe13fd253a96ea22 Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Fri, 19 Mar 2021 15:02:19 -0700 Subject: [PATCH] FIR IDE: Enforce an order on subclasses of sealed class Currently the order is non-determinstic, causing non-determinstic behavior in the IDE diagnostics. This change enforces an alphabetic order. --- .../idea/fir/low/level/api/FirIdeSealedHierarchyProcessor.kt | 5 ++++- idea/testData/checker/WhenNonExhaustive.fir.kt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeSealedHierarchyProcessor.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeSealedHierarchyProcessor.kt index 6357171a61e..1a0c8eb0028 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeSealedHierarchyProcessor.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeSealedHierarchyProcessor.kt @@ -84,6 +84,9 @@ class FirIdeSealedHierarchyProcessor(session: FirSession, scopeSession: ScopeSes .mapNotNull { it.classIdIfNonLocal() } .toMutableList() + // Enforce a deterministic order on the result. + subclasses.sortBy { it.toString() } + data[regularClass] = subclasses } @@ -98,4 +101,4 @@ class FirIdeSealedHierarchyProcessor(session: FirSession, scopeSession: ScopeSes private fun getPackageViaDirectoryService(ktClass: KtClass): PsiPackage? { val directory = ktClass.containingFile.containingDirectory ?: return null return JavaDirectoryService.getInstance().getPackage(directory) -} \ No newline at end of file +} diff --git a/idea/testData/checker/WhenNonExhaustive.fir.kt b/idea/testData/checker/WhenNonExhaustive.fir.kt index ca5e1c75d95..d612b7ce475 100644 --- a/idea/testData/checker/WhenNonExhaustive.fir.kt +++ b/idea/testData/checker/WhenNonExhaustive.fir.kt @@ -49,7 +49,7 @@ sealed class Variant { object Another : Variant() } -fun nonExhaustiveSealed(v: Variant) = when(v) { +fun nonExhaustiveSealed(v: Variant) = when(v) { Variant.Singleton -> false }