Use stable order for dependsOn and related diagnostics

This commit is contained in:
Dmitry Savvinov
2019-06-14 16:15:48 +03:00
parent 769ccde43b
commit 68c1a7cedd
4 changed files with 9 additions and 6 deletions
@@ -143,7 +143,9 @@ class ExpectedActualDeclarationChecker(
trace.report(Errors.AMBIGUOUS_ACTUALS.on( trace.report(Errors.AMBIGUOUS_ACTUALS.on(
reportOn, reportOn,
descriptor, 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 } .map { (_, members) -> members }
.flatten() .flatten()
.map { DescriptorUtils.getContainingSourceFile(it).let { it.name ?: it.toString() } } .map { DescriptorUtils.getContainingSourceFile(it).let { it.name ?: it.toString() } }
.sorted()
.toList() .toList()
if (filesWithAtLeastWeaklyCompatibleExpects.size > 1) { if (filesWithAtLeastWeaklyCompatibleExpects.size > 1) {
@@ -127,15 +127,15 @@ fun KotlinType.isDefaultBound(): Boolean = KotlinBuiltIns.isDefaultBound(getSupe
fun createProjection(type: KotlinType, projectionKind: Variance, typeParameterDescriptor: TypeParameterDescriptor?): TypeProjection = fun createProjection(type: KotlinType, projectionKind: Variance, typeParameterDescriptor: TypeParameterDescriptor?): TypeProjection =
TypeProjectionImpl(if (typeParameterDescriptor?.variance == projectionKind) Variance.INVARIANT else projectionKind, type) TypeProjectionImpl(if (typeParameterDescriptor?.variance == projectionKind) Variance.INVARIANT else projectionKind, type)
fun <T> Collection<T>.closure(f: (T) -> Collection<T>): Collection<T> { fun <T> Collection<T>.closure(preserveOrder: Boolean = false, f: (T) -> Collection<T>): Collection<T> {
if (size == 0) return this if (size == 0) return this
val result = HashSet(this) val result = if (preserveOrder) LinkedHashSet(this) else HashSet(this)
var elementsToCheck = result var elementsToCheck = result
var oldSize = 0 var oldSize = 0
while (result.size > oldSize) { while (result.size > oldSize) {
oldSize = result.size oldSize = result.size
val toAdd = hashSetOf<T>() val toAdd = if (preserveOrder) linkedSetOf() else hashSetOf<T>()
elementsToCheck.forEach { toAdd.addAll(f(it)) } elementsToCheck.forEach { toAdd.addAll(f(it)) }
result.addAll(toAdd) result.addAll(toAdd)
elementsToCheck = toAdd elementsToCheck = toAdd
@@ -79,7 +79,7 @@ private fun mergePlatformModules(
listOf(module to module.expectedBy) listOf(module to module.expectedBy)
else emptyList() else emptyList()
}.map { (module, expectedBys) -> }.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 } val rest = allModules - platformModules.flatMap { it.containedModules }
@@ -75,7 +75,7 @@ fun AbstractMultiModuleTest.doSetup(projectModel: ProjectResolveModel) {
}.toMap() }.toMap()
for ((resolveModule, ideaModule) in resolveModulesToIdeaModules.entries) { 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) { when (val to = it.to) {
FullJdk -> ConfigLibraryUtil.configureSdk(ideaModule, PluginTestCaseBase.addJdk(testRootDisposable) { FullJdk -> ConfigLibraryUtil.configureSdk(ideaModule, PluginTestCaseBase.addJdk(testRootDisposable) {
PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK) PluginTestCaseBase.jdk(TestJdkKind.FULL_JDK)