diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt index 56b9751ba00..5f7f5e7938f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt @@ -143,7 +143,9 @@ class ExpectedActualDeclarationChecker( trace.report(Errors.AMBIGUOUS_ACTUALS.on( reportOn, descriptor, - atLeastWeaklyCompatibleActuals.map { DescriptorUtils.getContainingSourceFile(it).let { it.name ?: it.toString() } } + atLeastWeaklyCompatibleActuals + .map { DescriptorUtils.getContainingSourceFile(it).let { it.name ?: it.toString() } } + .sorted() )) } } @@ -304,6 +306,7 @@ class ExpectedActualDeclarationChecker( .map { (_, members) -> members } .flatten() .map { DescriptorUtils.getContainingSourceFile(it).let { it.name ?: it.toString() } } + .sorted() .toList() if (filesWithAtLeastWeaklyCompatibleExpects.size > 1) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt index 1f80e59aea0..8e24830d4b8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt @@ -127,15 +127,15 @@ fun KotlinType.isDefaultBound(): Boolean = KotlinBuiltIns.isDefaultBound(getSupe fun createProjection(type: KotlinType, projectionKind: Variance, typeParameterDescriptor: TypeParameterDescriptor?): TypeProjection = TypeProjectionImpl(if (typeParameterDescriptor?.variance == projectionKind) Variance.INVARIANT else projectionKind, type) -fun Collection.closure(f: (T) -> Collection): Collection { +fun Collection.closure(preserveOrder: Boolean = false, f: (T) -> Collection): Collection { if (size == 0) return this - val result = HashSet(this) + val result = if (preserveOrder) LinkedHashSet(this) else HashSet(this) var elementsToCheck = result var oldSize = 0 while (result.size > oldSize) { oldSize = result.size - val toAdd = hashSetOf() + val toAdd = if (preserveOrder) linkedSetOf() else hashSetOf() elementsToCheck.forEach { toAdd.addAll(f(it)) } result.addAll(toAdd) elementsToCheck = toAdd diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/moduleInfosFromIdeaModel.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/moduleInfosFromIdeaModel.kt index a7d15d7db9f..8d854f5bdd4 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/moduleInfosFromIdeaModel.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/moduleInfosFromIdeaModel.kt @@ -79,7 +79,7 @@ private fun mergePlatformModules( listOf(module to module.expectedBy) else emptyList() }.map { (module, expectedBys) -> - PlatformModuleInfo(module, expectedBys.closure { it.expectedBy }.toList()) + PlatformModuleInfo(module, expectedBys.closure(preserveOrder = true) { it.expectedBy }.toList()) } val rest = allModules - platformModules.flatMap { it.containedModules } diff --git a/idea/tests/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt b/idea/tests/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt index e5c04c59260..2bfbcdabab2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt @@ -75,7 +75,7 @@ fun AbstractMultiModuleTest.doSetup(projectModel: ProjectResolveModel) { }.toMap() for ((resolveModule, ideaModule) in resolveModulesToIdeaModules.entries) { - resolveModule.dependencies.closure { it.to.dependencies }.forEach { + resolveModule.dependencies.closure(preserveOrder = true) { it.to.dependencies }.forEach { when (val to = it.to) { FullJdk -> ConfigLibraryUtil.configureSdk(ideaModule, PluginTestCaseBase.addJdk(testRootDisposable) { PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK)