diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/MethodOrderTest.kt b/compiler/tests/org/jetbrains/kotlin/codegen/MethodOrderTest.kt index d4121eb72d7..881f6a40234 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/MethodOrderTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/codegen/MethodOrderTest.kt @@ -107,6 +107,31 @@ class MethodOrderTest: CodegenTestCase() { ) } + fun testDeterministicDefaultMethodImplOrder() { + doTest( + """ + interface Base { + fun getSize(): Int = 5 + fun size(): Int = getSize() + fun getKeys(): Int = 4 + fun keySet() = getKeys() + fun getEntries(): Int = 3 + fun entrySet() = getEntries() + fun getValues(): Int = 2 + fun values() = getValues() + + fun removeEldestEntry(eldest: Any?): Boolean + } + + class MinMap : Base { + override fun removeEldestEntry(eldest: Any?) = true + } + """, + "MinMap", + listOf("removeEldestEntry(Ljava/lang/Object;)Z", "()V", "getSize()I", "size()I", "getKeys()I", "keySet()I", "getEntries()I", "entrySet()I", "getValues()I", "values()I") + ) + } + private fun doTest(sourceText: String, classSuffix: String, expectedOrder: List) { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY) myFiles = CodegenTestFiles.create("file.kt", sourceText, myEnvironment!!.project) diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt index d4cae2f38cb..7da12970861 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.inference.wrapWithCapturingSubstitution import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.utils.Printer -import org.jetbrains.kotlin.utils.newHashSetWithExpectedSize +import org.jetbrains.kotlin.utils.newLinkedHashSetWithExpectedSize import org.jetbrains.kotlin.utils.sure import java.util.* @@ -60,7 +60,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: if (substitutor.isEmpty) return descriptors if (descriptors.isEmpty()) return descriptors - val result = newHashSetWithExpectedSize(descriptors.size) + val result = newLinkedHashSetWithExpectedSize(descriptors.size) for (descriptor in descriptors) { val substitute = substitute(descriptor) result.add(substitute)