@@ -86,9 +86,12 @@ class Definitions {
86
86
}
87
87
88
88
private def newPolyMethod (cls : ClassSymbol , name : TermName , typeParamCount : Int ,
89
- resultTypeFn : PolyType => Type , flags : FlagSet = EmptyFlags ) = {
89
+ resultTypeFn : PolyType => Type , flags : FlagSet = EmptyFlags ,
90
+ typeBounds : List [TypeBounds ] = Nil ) = {
90
91
val tparamNames = tpnme.syntheticTypeParamNames(typeParamCount)
91
- val tparamBounds = tparamNames map (_ => TypeBounds .empty)
92
+ val tparamBounds =
93
+ if (typeBounds.nonEmpty) typeBounds
94
+ else tparamNames map (_ => TypeBounds .empty)
92
95
val ptype = PolyType (tparamNames)(_ => tparamBounds, resultTypeFn)
93
96
newMethod(cls, name, ptype, flags)
94
97
}
@@ -171,8 +174,27 @@ class Definitions {
171
174
lazy val Any_isInstanceOf = newT1ParameterlessMethod(AnyClass , nme.isInstanceOf_, _ => BooleanType , Final )
172
175
lazy val Any_asInstanceOf = newT1ParameterlessMethod(AnyClass , nme.asInstanceOf_, PolyParam (_, 0 ), Final )
173
176
177
+ /** A method with signature
178
+ *
179
+ * def == [T <: EqClass[_]]($x0: T)(implicit $x1: Eq.Impossible[T]): Boolean = ???
180
+ */
181
+ lazy val Any_forbidden_== = newMethod(AnyClass , nme.EQ , new ForbiddenEqCompleter , Final )
182
+
183
+ class ForbiddenEqCompleter extends LazyType {
184
+ override def complete (denot : SymDenotation )(implicit ctx : Context ): Unit = {
185
+ denot.info =
186
+ PolyType (tpnme.syntheticTypeParamNames(1 ))(
187
+ pt => List (TypeBounds .upper(EqClassType .appliedTo(TypeBounds .empty))),
188
+ pt => MethodType (List (PolyParam (pt, 0 )),
189
+ ImplicitMethodType (List (EqImpossibleType .appliedTo(PolyParam (pt, 0 ))),
190
+ BooleanType )))
191
+ }
192
+ }
193
+
194
+ lazy val Any_null_== = newMethod(AnyClass , nme.EQ , MethodType (List (NullType ), BooleanType ), Final )
195
+
174
196
def AnyMethods = List (Any_== , Any_!= , Any_equals , Any_hashCode ,
175
- Any_toString , Any_## , Any_getClass , Any_isInstanceOf , Any_asInstanceOf )
197
+ Any_toString , Any_## , Any_getClass , Any_isInstanceOf , Any_asInstanceOf , Any_forbidden_== , Any_null_== )
176
198
177
199
lazy val ObjectClass : ClassSymbol = {
178
200
val cls = ctx.requiredClass(" java.lang.Object" )
@@ -212,8 +234,13 @@ class Definitions {
212
234
lazy val NothingClass : ClassSymbol = newCompleteClassSymbol(
213
235
ScalaPackageClass , tpnme.Nothing , AbstractFinal , List (AnyClass .typeRef))
214
236
def NothingType = NothingClass .typeRef
215
- lazy val NullClass : ClassSymbol = newCompleteClassSymbol(
216
- ScalaPackageClass , tpnme.Null , AbstractFinal , List (ObjectClass .typeRef))
237
+ lazy val NullClass : ClassSymbol = {
238
+ val nc = newCompleteClassSymbol(
239
+ ScalaPackageClass , tpnme.Null , AbstractFinal , List (ObjectClass .typeRef))
240
+ val Null_Equals_== = newMethod(nc, nme.EQ , MethodType (List (EqClassType ), BooleanType )).entered
241
+ val Null_Null_== = newMethod(nc, nme.EQ , MethodType (List (nc.typeRef), BooleanType )).entered
242
+ nc
243
+ }
217
244
def NullType = NullClass .typeRef
218
245
219
246
lazy val ScalaPredefModuleRef = ctx.requiredModuleRef(" scala.Predef" )
@@ -282,7 +309,6 @@ class Definitions {
282
309
lazy val ArrayModuleType = ctx.requiredModuleRef(" scala.Array" )
283
310
def ArrayModule (implicit ctx : Context ) = ArrayModuleType .symbol.moduleClass.asClass
284
311
285
-
286
312
lazy val UnitType : TypeRef = valueTypeRef(" scala.Unit" , BoxedUnitType , java.lang.Void .TYPE , UnitEnc )
287
313
def UnitClass (implicit ctx : Context ) = UnitType .symbol.asClass
288
314
lazy val BooleanType = valueTypeRef(" scala.Boolean" , BoxedBooleanType , java.lang.Boolean .TYPE , BooleanEnc )
@@ -401,6 +427,12 @@ class Definitions {
401
427
lazy val StringAdd_plusR = StringAddClass .requiredMethodRef(nme.raw.PLUS )
402
428
def StringAdd_+ (implicit ctx : Context ) = StringAdd_plusR .symbol
403
429
430
+ lazy val EqType : TypeRef = ctx.requiredClassRef(" dotty.Eq" )
431
+ def EqClass (implicit ctx : Context ) = EqType .symbol.asClass
432
+ lazy val EqClassType : TypeRef = ctx.requiredClassRef(" dotty.EqClass" )
433
+ def EqClassClass (implicit ctx : Context ) = EqClassType .symbol.asClass
434
+ lazy val EqImpossibleType : TypeRef = ctx.requiredClassRef(" dotty.Eq.Impossible" )
435
+ def EqImpossibleClass (implicit ctx : Context ) = EqImpossibleType .symbol.asClass
404
436
lazy val PairType : TypeRef = ctx.requiredClassRef(" dotty.Pair" )
405
437
def PairClass (implicit ctx : Context ) = PairType .symbol.asClass
406
438
lazy val PartialFunctionType : TypeRef = ctx.requiredClassRef(" scala.PartialFunction" )
0 commit comments