Skip to content

Commit

Permalink
Backport "Fix deterministically adding additional interfaces" to LTS (#…
Browse files Browse the repository at this point in the history
…21151)

Backports #20593 to the LTS branch.

PR submitted by the release tooling.
[skip ci]
  • Loading branch information
WojciechMazur authored Jul 10, 2024
2 parents 132467a + 27bb69a commit 5310094
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 7 deletions.
7 changes: 4 additions & 3 deletions compiler/src/dotty/tools/backend/jvm/BTypesFromSymbols.scala
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,12 @@ class BTypesFromSymbols[I <: DottyBackendInterface](val int: I, val frontendAcce
val directlyInheritedTraits = sym.directlyInheritedTraits
val directlyInheritedTraitsSet = directlyInheritedTraits.toSet
val allBaseClasses = directlyInheritedTraits.iterator.flatMap(_.asClass.baseClasses.drop(1)).toSet
val superCalls = superCallsMap.getOrElse(sym, Set.empty)
val additional = (superCalls -- directlyInheritedTraitsSet).filter(_.is(Trait))
val superCalls = superCallsMap.getOrElse(sym, List.empty)
val superCallsSet = superCalls.toSet
val additional = superCalls.filter(t => !directlyInheritedTraitsSet(t) && t.is(Trait))
// if (additional.nonEmpty)
// println(s"$fullName: adding supertraits $additional")
directlyInheritedTraits.filter(t => !allBaseClasses(t) || superCalls(t)) ++ additional
directlyInheritedTraits.filter(t => !allBaseClasses(t) || superCallsSet(t)) ++ additional
}

val interfaces = classSym.superInterfaces.map(classBTypeFromSymbol)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import StdNames.nme
import NameKinds.{LazyBitMapName, LazyLocalName}
import Names.Name

class DottyBackendInterface(val superCallsMap: ReadOnlyMap[Symbol, Set[ClassSymbol]])(using val ctx: Context) {
class DottyBackendInterface(val superCallsMap: ReadOnlyMap[Symbol, List[ClassSymbol]])(using val ctx: Context) {

private val desugared = new java.util.IdentityHashMap[Type, tpd.Select]

Expand Down
7 changes: 4 additions & 3 deletions compiler/src/dotty/tools/backend/jvm/GenBCode.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ class GenBCode extends Phase { self =>

override def description: String = GenBCode.description

private val superCallsMap = new MutableSymbolMap[Set[ClassSymbol]]
private val superCallsMap = new MutableSymbolMap[List[ClassSymbol]]
def registerSuperCall(sym: Symbol, calls: ClassSymbol): Unit = {
val old = superCallsMap.getOrElse(sym, Set.empty)
superCallsMap.update(sym, old + calls)
val old = superCallsMap.getOrElse(sym, List.empty)
if (!old.contains(calls))
superCallsMap.update(sym, old :+ calls)
}

private val entryPoints = new mutable.HashSet[String]()
Expand Down
24 changes: 24 additions & 0 deletions compiler/test/dotty/tools/backend/jvm/DottyBytecodeTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1963,6 +1963,30 @@ class DottyBytecodeTests extends DottyBytecodeTest {
assertSameCode(instructions, expected)
}
}

/**
* Test 'additional' imports are generated in deterministic order
* https://github.com/scala/scala3/issues/20496
*/
@Test def deterministicAdditionalImports = {
val source =
"""trait Actor:
| def receive() = ()
|trait Timers:
| def timers() = ()
|abstract class ShardCoordinator extends Actor with Timers
|class PersistentShardCoordinator extends ShardCoordinator:
| def foo =
| super.receive()
| super.timers()""".stripMargin
checkBCode(source) { dir =>
val clsIn = dir.lookupName("PersistentShardCoordinator.class", directory = false).input
val clsNode = loadClassNode(clsIn)

val expected = List("Actor", "Timers")
assertEquals(expected, clsNode.interfaces.asScala)
}
}
}

object invocationReceiversTestCode {
Expand Down

0 comments on commit 5310094

Please sign in to comment.