Skip to content

Commit 22319f3

Browse files
committed
Move hashCode and ## to Scrutable
1 parent ee0f6c8 commit 22319f3

File tree

7 files changed

+25
-16
lines changed

7 files changed

+25
-16
lines changed

compiler/src/dotty/tools/backend/jvm/scalaPrimitives.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ class DottyPrimitives(ictx: Context) {
151151
addPrimitive(defn.Any_!=, NE)
152152
addPrimitive(defn.Scrutable_isInstanceOf, IS)
153153
addPrimitive(defn.Any_asInstanceOf, AS)
154-
addPrimitive(defn.Any_##, HASH)
154+
addPrimitive(defn.Scrutable_##, HASH)
155155

156156
// java.lang.Object
157157
addPrimitive(defn.Object_eq, ID)

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -284,14 +284,14 @@ class Definitions {
284284
@tu lazy val Any_== : TermSymbol = enterMethod(AnyClass, nme.EQ, methOfAny(BooleanType), Final)
285285
@tu lazy val Any_!= : TermSymbol = enterMethod(AnyClass, nme.NE, methOfAny(BooleanType), Final)
286286
@tu lazy val Any_equals: TermSymbol = enterMethod(AnyClass, nme.equals_, methOfAny(BooleanType))
287-
@tu lazy val Any_hashCode: TermSymbol = enterMethod(AnyClass, nme.hashCode_, MethodType(Nil, IntType))
288287
@tu lazy val Any_toString: TermSymbol = enterMethod(AnyClass, nme.toString_, MethodType(Nil, StringType))
289-
@tu lazy val Any_## : TermSymbol = enterMethod(AnyClass, nme.HASHHASH, ExprType(IntType), Final)
290288
@tu lazy val Any_asInstanceOf: TermSymbol = enterT1ParameterlessMethod(AnyClass, nme.asInstanceOf_, _.paramRefs(0), Final)
291289
@tu lazy val Any_typeTest: TermSymbol = enterT1ParameterlessMethod(AnyClass, nme.isInstanceOfPM, _ => BooleanType, Final | Synthetic | Artifact)
292290
@tu lazy val Any_typeCast: TermSymbol = enterT1ParameterlessMethod(AnyClass, nme.asInstanceOfPM, _.paramRefs(0), Final | Synthetic | Artifact | StableRealizable)
293291
// generated by pattern matcher and explicit nulls, eliminated by erasure
294292

293+
@tu lazy val Scrutable_hashCode: TermSymbol = enterMethod(ScrutableClass, nme.hashCode_, MethodType(Nil, IntType))
294+
@tu lazy val Scrutable_## : TermSymbol = enterMethod(ScrutableClass, nme.HASHHASH, ExprType(IntType), Final)
295295
@tu lazy val Scrutable_isInstanceOf: TermSymbol = enterT1ParameterlessMethod(ScrutableClass, nme.isInstanceOf_, _ => BooleanType, Final)
296296

297297
/** def getClass[A >: this.type](): Class[? <: A] */
@@ -302,10 +302,11 @@ class Definitions {
302302
Final,
303303
bounds = TypeBounds.lower(ScrutableClass.thisType))
304304

305-
def AnyMethods: List[TermSymbol] = List(Any_==, Any_!=, Any_equals, Any_hashCode,
306-
Any_toString, Any_##, Scrutable_isInstanceOf, Any_asInstanceOf, Any_typeTest, Any_typeCast)
305+
def AnyMethods: List[TermSymbol] =
306+
List(Any_==, Any_!=, Any_equals, Any_toString, Any_asInstanceOf, Any_typeTest, Any_typeCast)
307307

308-
def ScrutableMethods: List[TermSymbol] = List(Scrutable_getClass, Scrutable_isInstanceOf)
308+
def ScrutableMethods: List[TermSymbol] =
309+
List(Scrutable_getClass, Scrutable_isInstanceOf, Scrutable_hashCode, Scrutable_##)
309310

310311
@tu lazy val ScrutableMethodNames = ScrutableMethods.map(_.name)
311312

@@ -442,8 +443,8 @@ class Definitions {
442443
Object_finalize, Object_notify, Object_notifyAll, Object_wait, Object_waitL, Object_waitLI)
443444

444445
/** Methods in Object, Scrutable, and Any that do not have a side effect */
445-
@tu lazy val pureMethods: List[TermSymbol] = List(Any_==, Any_!=, Any_equals, Any_hashCode,
446-
Any_toString, Any_##, Scrutable_getClass, Scrutable_isInstanceOf, Any_typeTest, Object_eq, Object_ne)
446+
@tu lazy val pureMethods: List[TermSymbol] = List(Any_==, Any_!=, Any_equals, Scrutable_hashCode,
447+
Any_toString, Scrutable_##, Scrutable_getClass, Scrutable_isInstanceOf, Any_typeTest, Object_eq, Object_ne)
447448

448449
@tu lazy val AnyKindClass: ClassSymbol = {
449450
val cls = newCompleteClassSymbol(ScalaPackageClass, tpnme.AnyKind, AbstractFinal | Permanent, Nil)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class InterceptedMethods extends MiniPhase {
3535
transformRefTree(tree)
3636

3737
private def transformRefTree(tree: RefTree)(using Context): Tree =
38-
if (tree.symbol.isTerm && (defn.Any_## eq tree.symbol)) {
38+
if (tree.symbol.isTerm && (defn.Scrutable_## eq tree.symbol)) {
3939
val qual = tree match {
4040
case id: Ident => tpd.desugarIdentPrefix(id)
4141
case sel: Select => sel.qualifier

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ class SuperAccessors(thisPhase: DenotTransformer) {
174174
sym.isTypeTestOrCast ||
175175
(sym eq defn.Any_==) ||
176176
(sym eq defn.Any_!=) ||
177-
(sym eq defn.Any_##)
177+
(sym eq defn.Scrutable_##)
178178

179179
/** Transform select node, adding super and protected accessors as needed */
180180
def transformSelect(tree: Tree, targs: List[Tree])(using Context): Tree = {

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
6262

6363
private def initSymbols(using Context) =
6464
if (myValueSymbols.isEmpty) {
65-
myValueSymbols = List(defn.Any_hashCode, defn.Any_equals)
65+
myValueSymbols = List(defn.Scrutable_hashCode, defn.Any_equals)
6666
myCaseSymbols = myValueSymbols ++ List(defn.Any_toString, defn.Product_canEqual,
6767
defn.Product_productArity, defn.Product_productPrefix, defn.Product_productElement,
6868
defn.Product_productElementName)
@@ -285,7 +285,10 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
285285
*/
286286
def valueHashCodeBody(using Context): Tree = {
287287
assert(accessors.nonEmpty)
288-
ref(accessors.head).select(nme.hashCode_).ensureApplied
288+
ref(accessors.head)
289+
.ensureConforms(defn.ScrutableType)
290+
.select(nme.hashCode_)
291+
.ensureApplied
289292
}
290293

291294
/** The class
@@ -344,7 +347,12 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
344347
val acc = newSymbol(ctx.owner, nme.acc, Mutable | Synthetic, defn.IntType, coord = ctx.owner.span)
345348
val accDef = ValDef(acc, Literal(Constant(0xcafebabe)))
346349
val mixPrefix = Assign(ref(acc),
347-
ref(defn.staticsMethod("mix")).appliedTo(ref(acc), This(clazz).select(defn.Product_productPrefix).select(defn.Any_hashCode).appliedToNone))
350+
ref(defn.staticsMethod("mix")).appliedTo(
351+
ref(acc),
352+
This(clazz)
353+
.select(defn.Product_productPrefix)
354+
.select(defn.Scrutable_hashCode)
355+
.appliedToNone))
348356
val mixes = for (accessor <- accessors) yield
349357
Assign(ref(acc), ref(defn.staticsMethod("mix")).appliedTo(ref(acc), hashImpl(accessor)))
350358
val finish = ref(defn.staticsMethod("finalizeHash")).appliedTo(ref(acc), Literal(Constant(accessors.size)))

compiler/src/dotty/tools/dotc/transform/sjs/PrepJSInterop.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ class PrepJSInterop extends MacroTransform with IdentityDenotTransformer { thisP
604604
" if you want to define a method named \"equals\" in JavaScript, use a different name and add @JSName(\"equals\").",
605605
sym)
606606

607-
case nme.hashCode_ if sym.info.matches(defn.Any_hashCode.info) =>
607+
case nme.hashCode_ if sym.info.matches(defn.Scrutable_hashCode.info) =>
608608
report.error(
609609
"error overriding method hashCode(): Int in a JS class;\n" +
610610
" method hashCode(): Int is considered final in trait js.Any;\n" +

tests/run/t6534.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
trait Foo extends Any { override def equals(x: Any) = false }
2-
trait Ding extends Any { override def hashCode = -1 }
1+
trait Foo extends Scrutable { override def equals(x: Any) = false }
2+
trait Ding extends Scrutable { override def hashCode = -1 }
33

44
class Bippy1(val x: Int) extends AnyVal with Foo { } // warn
55
class Bippy2(val x: Int) extends AnyVal with Ding { } // warn

0 commit comments

Comments
 (0)