From e3829a70b0522e8e630f22f17750cef5b6bcd18f Mon Sep 17 00:00:00 2001 From: Denis Vnukov Date: Tue, 17 Apr 2018 00:52:05 -0700 Subject: [PATCH] Stable order of synthesized bridges. In some cases when several bridge methods are generated, their order is undetermenistic. For example for class ClassLowerWithContext in the following example ``` interface IrElement class IrClassContext interface IrElementVisitor { fun visitElement(element: IrElement, data: D): R } interface IrElementTransformer : IrElementVisitor { override fun visitElement(element: IrElement, data: D): IrElement = element.also { throw RuntimeException() } } abstract class ClassLowerWithContext : IrElementTransformer ``` kotlin compiler synthesizes two additional bridges: public IrElement visitElement(IrElement, IrClassContext); [bridge] public Object visitElement(IrElement, Object); [bridge] public IrElement visitElement(IrElement, Object); Unfortunately the behavior is not deterministic and not easy to reproduce. --- .../org/jetbrains/kotlin/backend/common/bridges/bridges.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/bridges/bridges.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/bridges/bridges.kt index ebf4aa03ddc..b35cb24f502 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/bridges/bridges.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/bridges/bridges.kt @@ -56,7 +56,7 @@ fun generateBridges( val implementation = findConcreteSuperDeclaration(function) - val bridgesToGenerate = findAllReachableDeclarations(function).mapTo(HashSet(), signature) + val bridgesToGenerate = findAllReachableDeclarations(function).mapTo(LinkedHashSet(), signature) if (fake) { // If it's a concrete fake override, some of the bridges may be inherited from the super-classes. Specifically, bridges for all @@ -85,7 +85,7 @@ fun findAllReachableDeclarations(function: Function) } @Suppress("UNCHECKED_CAST") DFS.dfs(listOf(function), { it.getOverridden() as Iterable }, collector) - return HashSet(collector.result()) + return LinkedHashSet(collector.result()) } /**