@@ -31,6 +31,8 @@ object FirstTransform {
31
31
* - drops branches of ifs using the rules
32
32
* if (true) A else B ==> A
33
33
* if (false) A else B ==> B
34
+ * - Notmalize asInsanceOf to always be a selection
35
+ * asInsanceOf[X] ==> this.asInsanceOf[X]
34
36
*/
35
37
class FirstTransform extends MiniPhase with InfoTransformer { thisPhase =>
36
38
import ast .tpd ._
@@ -54,6 +56,8 @@ class FirstTransform extends MiniPhase with InfoTransformer { thisPhase =>
54
56
qual.tpe.derivesFrom(tree.symbol.owner) ||
55
57
tree.symbol.is(JavaStatic ) && qual.tpe.derivesFrom(tree.symbol.enclosingClass),
56
58
i " non member selection of ${tree.symbol.showLocated} from ${qual.tpe} in $tree" )
59
+ case _ : Ident =>
60
+ assert(tree.symbol != defn.Any_asInstanceOf )
57
61
case _ : TypeTree =>
58
62
case _ : Import | _ : NamedArg | _ : TypTree =>
59
63
assert(false , i " illegal tree: $tree" )
@@ -143,8 +147,15 @@ class FirstTransform extends MiniPhase with InfoTransformer { thisPhase =>
143
147
case tree => if (tree.isType) toTypeTree(tree) else tree
144
148
}
145
149
146
- override def transformIdent (tree : Ident )(implicit ctx : Context ): Tree =
147
- if (tree.isType) toTypeTree(tree) else constToLiteral(tree)
150
+ override def transformIdent (tree : Ident )(implicit ctx : Context ): Tree = {
151
+ if (tree.symbol == defn.Any_asInstanceOf ) {
152
+ // Add missing `this` prefix
153
+ val TermRef (ths : ThisType , _) = tree.tpe
154
+ ref(ths.termSymbol).select(tree.name).withSpan(tree.span)
155
+ }
156
+ else if (tree.isType) toTypeTree(tree)
157
+ else constToLiteral(tree)
158
+ }
148
159
149
160
override def transformSelect (tree : Select )(implicit ctx : Context ): Tree =
150
161
if (tree.isType) toTypeTree(tree) else constToLiteral(tree)
0 commit comments