@@ -96,23 +96,30 @@ trait TypeTestsCasts {
96
96
/** Transform isInstanceOf OrType
97
97
*
98
98
* expr.isInstanceOf[A | B] ~~> expr.isInstanceOf[A] | expr.isInstanceOf[B]
99
+ * expr.isInstanceOf[A & B] ~~> expr.isInstanceOf[A] & expr.isInstanceOf[B]
99
100
*
100
101
* The transform happens before erasure of `argType`, thus cannot be merged
101
102
* with `transformIsInstanceOf`, which depends on erased type of `argType`.
102
103
*/
103
- def transformOrTypeTest (qual : Tree , argType : Type ): Tree = argType.dealias match {
104
+ def transformTypeTest (qual : Tree , argType : Type ): Tree = argType.dealias match {
104
105
case OrType (tp1, tp2) =>
105
106
evalOnce(qual) { fun =>
106
- transformOrTypeTest(fun, tp1)
107
- .select(nme.OR )
108
- .appliedTo(transformOrTypeTest(fun, tp2))
107
+ transformTypeTest(fun, tp1)
108
+ .select(defn.Boolean_|| )
109
+ .appliedTo(transformTypeTest(fun, tp2))
110
+ }
111
+ case AndType (tp1, tp2) =>
112
+ evalOnce(qual) { fun =>
113
+ transformTypeTest(fun, tp1)
114
+ .select(defn.Boolean_&& )
115
+ .appliedTo(transformTypeTest(fun, tp2))
109
116
}
110
117
case _ =>
111
118
transformIsInstanceOf(qual, erasure(argType))
112
119
}
113
120
114
121
if (sym eq defn.Any_isInstanceOf )
115
- transformOrTypeTest (qual, tree.args.head.tpe)
122
+ transformTypeTest (qual, tree.args.head.tpe)
116
123
else if (sym eq defn.Any_asInstanceOf )
117
124
transformAsInstanceOf(erasure(tree.args.head.tpe))
118
125
else tree
0 commit comments