@@ -289,78 +289,75 @@ object Types {
289
289
}
290
290
291
291
/** Tests whether a type `lhs` is a subtype of `rhs` (or equal).
292
- * [[NoType ]] is never a subtype or supertype of anything (including
293
- * itself). All other types are subtypes of themselves.
294
292
* @param isSubclass A function testing whether a class/interface is a
295
293
* subclass of another class/interface.
296
294
*/
297
295
def isSubtype (lhs : Type , rhs : Type )(
298
296
isSubclass : (ClassName , ClassName ) => Boolean ): Boolean = {
299
-
300
- (lhs != NoType && rhs != NoType ) && {
301
- (lhs == rhs) ||
302
- ((lhs, rhs) match {
303
- case (_, AnyType ) => true
304
- case (NothingType , _) => true
305
-
306
- case (ClassType (lhsClass), ClassType (rhsClass)) =>
307
- isSubclass(lhsClass, rhsClass)
308
-
309
- case (NullType , ClassType (_)) => true
310
- case (NullType , ArrayType (_)) => true
311
-
312
- case (UndefType , ClassType (className)) =>
313
- isSubclass(BoxedUnitClass , className)
314
- case (BooleanType , ClassType (className)) =>
315
- isSubclass(BoxedBooleanClass , className)
316
- case (CharType , ClassType (className)) =>
317
- isSubclass(BoxedCharacterClass , className)
318
- case (ByteType , ClassType (className)) =>
319
- isSubclass(BoxedByteClass , className)
320
- case (ShortType , ClassType (className)) =>
321
- isSubclass(BoxedShortClass , className)
322
- case (IntType , ClassType (className)) =>
323
- isSubclass(BoxedIntegerClass , className)
324
- case (LongType , ClassType (className)) =>
325
- isSubclass(BoxedLongClass , className)
326
- case (FloatType , ClassType (className)) =>
327
- isSubclass(BoxedFloatClass , className)
328
- case (DoubleType , ClassType (className)) =>
329
- isSubclass(BoxedDoubleClass , className)
330
- case (StringType , ClassType (className)) =>
331
- isSubclass(BoxedStringClass , className)
332
-
333
- case (ArrayType (ArrayTypeRef (lhsBase, lhsDims)),
334
- ArrayType (ArrayTypeRef (rhsBase, rhsDims))) =>
335
- if (lhsDims < rhsDims) {
336
- false // because Array[A] </: Array[Array[A]]
337
- } else if (lhsDims > rhsDims) {
338
- rhsBase match {
339
- case ClassRef (ObjectClass ) =>
340
- true // because Array[Array[A]] <: Array[Object]
341
- case _ =>
342
- false
343
- }
344
- } else { // lhsDims == rhsDims
345
- // lhsBase must be <: rhsBase
346
- (lhsBase, rhsBase) match {
347
- case (ClassRef (lhsBaseName), ClassRef (rhsBaseName)) =>
348
- /* All things must be considered subclasses of Object for this
349
- * purpose, even JS types and interfaces, which do not have
350
- * Object in their ancestors.
351
- */
352
- rhsBaseName == ObjectClass || isSubclass(lhsBaseName, rhsBaseName)
353
- case _ =>
354
- lhsBase eq rhsBase
355
- }
297
+ (lhs == rhs) ||
298
+ ((lhs, rhs) <
F987
span class="pl-k">match {
299
+ case (_, NoType ) => true
300
+ case (NoType , _) => false
301
+ case (_, AnyType ) => true
302
+ case (NothingType , _) => true
303
+
304
+ case (ClassType (lhsClass), ClassType (rhsClass)) =>
305
+ isSubclass(lhsClass, rhsClass)
306
+
307
+ case (NullType , ClassType (_)) => true
308
+ case (NullType , ArrayType (_)) => true
309
+
310
+ case (UndefType , ClassType (className)) =>
311
+ isSubclass(BoxedUnitClass , className)
312
+ case (BooleanType , ClassType (className)) =>
313
+ isSubclass(BoxedBooleanClass , className)
314
+ case (CharType , ClassType (className)) =>
315
+ isSubclass(BoxedCharacterClass , className)
316
+ case (ByteType , ClassType (className)) =>
317
+ isSubclass(BoxedByteClass , className)
318
+ case (ShortType , ClassType (className)) =>
319
+ isSubclass(BoxedShortClass , className)
320
+ case (IntType , ClassType (className)) =>
321
+ isSubclass(BoxedIntegerClass , className)
322
+ case (LongType , ClassType (className)) =>
323
+ isSubclass(BoxedLongClass , className)
324
+ case (FloatType , ClassType (className)) =>
325
+ isSubclass(BoxedFloatClass , className)
326
+ case (DoubleType , ClassType (className)) =>
327
+ isSubclass(BoxedDoubleClass , className)
328
+ case (StringType , ClassType (className)) =>
329
+ isSubclass(BoxedStringClass , className)
330
+
331
+ case (ArrayType (ArrayTypeRef (lhsBase, lhsDims)),
332
+ ArrayType (ArrayTypeRef (rhsBase, rhsDims))) =>
333
+ if (lhsDims < rhsDims) {
334
+ false // because Array[A] </: Array[Array[A]]
335
+ } else if (lhsDims > rhsDims) {
336
+ rhsBase match {
337
+ case ClassRef (ObjectClass ) =>
338
+ true // because Array[Array[A]] <: Array[Object]
339
+ case _ =>
340
+ false
341
+ }
342
+ } else { // lhsDims == rhsDims
343
+ // lhsBase must be <: rhsBase
344
+ (lhsBase, rhsBase) match {
345
+ case (ClassRef (lhsBaseName), ClassRef (rhsBaseName)) =>
346
+ /* All things must be considered subclasses of Object for this
347
+ * purpose, even JS types and interfaces, which do not have
348
+ * Object in their ancestors.
349
+ */
350
+ rhsBaseName == ObjectClass || isSubclass(lhsBaseName, rhsBaseName)
351
+ case _ =>
352
+ lhsBase eq rhsBase
356
353
}
354
+ }
357
355
358
- case (ArrayType (_), ClassType (className)) =>
359
- AncestorsOfPseudoArrayClass .contains(className)
356
+ case (ArrayType (_), ClassType (className)) =>
357
+ AncestorsOfPseudoArrayClass .contains(className)
360
358
361
- case _ =>
362
- false
363
- })
364
- }
359
+ case _ =>
360
+ false
361
+ })
365
362
}
366
363
}
0 commit comments