Skip to content

Commit d60a914

Browse files
authored
Recover scala 2's semantics for AnyVal under -Ycompile-scala2-library (#22536)
Closes #22533
2 parents 7b39421 + 645e822 commit d60a914

File tree

6 files changed

+58
-3
lines changed

6 files changed

+58
-3
lines changed

compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala

+7-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,13 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
7878

7979
private def existingDef(sym: Symbol, clazz: ClassSymbol)(using Context): Symbol =
8080
val existing = sym.matchingMember(clazz.thisType)
81-
if existing != sym && !existing.is(Deferred) then existing else NoSymbol
81+
if ctx.settings.YcompileScala2Library.value && clazz.isValueClass && (sym == defn.Any_equals || sym == defn.Any_hashCode) then
82+
NoSymbol
83+
else if existing != sym && !existing.is(Deferred) then
84+
existing
85+
else
86+
NoSymbol
87+
end existingDef
8288

8389
private def synthesizeDef(sym: TermSymbol, rhsFn: List[List[Tree]] => Context ?=> Tree)(using Context): Tree =
8490
DefDef(sym, rhsFn(_)(using ctx.withOwner(sym))).withSpan(ctx.owner.span.focus)

compiler/test/dotty/tools/dotc/printing/PrintingTest.scala

+3
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ class PrintingTest {
6969
@Test
7070
def printing: Unit = testIn("tests/printing", "typer")
7171

72+
@Test
73+
def posttyper: Unit = testIn("tests/printing/posttyper", "posttyper")
74+
7275
@Test
7376
def untypedPrinting: Unit = testIn("tests/printing/untyped", "parser")
7477

project/Scala2LibraryBootstrappedMiMaFilters.scala

+15-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,21 @@ object Scala2LibraryBootstrappedMiMaFilters {
1515
ProblemFilters.exclude[FinalClassProblem]("scala.language$experimental$"),
1616
ProblemFilters.exclude[FinalClassProblem]("scala.languageFeature$*$"),
1717

18-
// Value class extension methods
19-
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.*$extension"),
18+
// Issue: https://github.com/scala/scala3/issues/22495
19+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.ArrayOps.scala$collection$ArrayOps$$elemTag$extension"),
20+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.ArrayOps.iterateUntilEmpty$extension"),
21+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.StringOps.isLineBreak$extension"),
22+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.StringOps.isLineBreak2$extension"),
23+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.StringOps.linesSeparated$extension"),
24+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.StringOps.escape$extension"),
25+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.StringOps.toBooleanImpl$extension"),
26+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.StringOps.unwrapArg$extension"),
27+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.StringOps.iterateUntilEmpty$extension"),
28+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.runtime.Tuple2Zipped.coll1$extension"),
29+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.runtime.Tuple2Zipped.coll2$extension"),
30+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.runtime.Tuple3Zipped.coll1$extension"),
31+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.runtime.Tuple3Zipped.coll2$extension"),
32+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.runtime.Tuple3Zipped.coll3$extension"),
2033

2134
// Companion module class
2235
ProblemFilters.exclude[FinalClassProblem]("scala.*$"),

tests/printing/posttyper/i22533.check

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
[[syntax trees at end of posttyper]] // tests/printing/posttyper/i22533.scala
2+
package <empty> {
3+
@SourceFile("tests/printing/posttyper/i22533.scala") trait A() extends Any {
4+
override def equals(x: Any): Boolean = ???
5+
override def hashCode(): Int = ???
6+
}
7+
@SourceFile("tests/printing/posttyper/i22533.scala") final class Foo(u: Int)
8+
extends AnyVal(), A {
9+
override def hashCode(): Int = Foo.this.u.hashCode()
10+
override def equals(x$0: Any): Boolean =
11+
x$0 match
12+
{
13+
case x$0 @ _:Foo @unchecked => this.u.==(x$0.u)
14+
case _ => false
15+
}
16+
private[this] val u: Int
17+
}
18+
final lazy module val Foo: Foo = new Foo()
19+
@SourceFile("tests/printing/posttyper/i22533.scala") final module class Foo()
20+
extends AnyRef() { this: Foo.type =>
21+
private def writeReplace(): AnyRef =
22+
new scala.runtime.ModuleSerializationProxy(classOf[Foo.type])
23+
}
24+
}
25+

tests/printing/posttyper/i22533.flags

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-Ycompile-scala2-library

tests/printing/posttyper/i22533.scala

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//> using options -Ycompile-scala2-library
2+
3+
trait A extends Any:
4+
override def equals(x: Any): Boolean = ???
5+
override def hashCode(): Int = ???
6+
7+
class Foo(u: Int) extends AnyVal, A

0 commit comments

Comments
 (0)