@@ -13,8 +13,16 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] {
13
13
14
14
// ----- Tree cases that exist in untyped form only ------------------
15
15
16
+ trait OpTree extends Tree {
17
+ def op : Name
18
+ override def isTerm = op.isTermName
19
+ override def isType = op.isTypeName
20
+ }
21
+
16
22
/** A typed subtree of an untyped tree needs to be wrapped in a TypedSlice */
17
- case class TypedSplice (tree : tpd.Tree ) extends Tree
23
+ case class TypedSplice (tree : tpd.Tree ) extends ProxyTree {
24
+ def forwardTo = tree
25
+ }
18
26
19
27
/** mods object name impl */
20
28
case class ModuleDef (mods : Modifiers , name : TermName , impl : Template )
@@ -25,12 +33,20 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] {
25
33
26
34
case class SymbolLit (str : String ) extends TermTree
27
35
case class InterpolatedString (id : TermName , strings : List [Literal ], elems : List [Tree ]) extends TermTree
28
- case class Function (args : List [Tree ], body : Tree ) extends Tree
29
- case class InfixOp (left : Tree , op : Name , right : Tree ) extends Tree
30
- case class PostfixOp (od : Tree , op : Name ) extends Tree
31
- case class PrefixOp (op : Name , od : Tree ) extends Tree
32
- case class Parens (t : Tree ) extends Tree
33
- case class Tuple (trees : List [Tree ]) extends Tree
36
+ case class Function (args : List [Tree ], body : Tree ) extends Tree {
37
+ override def isTerm = body.isTerm
38
+ override def isType = body.isType
39
+ }
40
+ case class InfixOp (left : Tree , op : Name , right : Tree ) extends OpTree
41
+ case class PostfixOp (od : Tree , op : Name ) extends OpTree
42
+ case class PrefixOp (op : Name , od : Tree ) extends OpTree
43
+ case class Parens (t : Tree ) extends ProxyTree {
44
+ def forwardTo = t
45
+ }
46
+ case class Tuple (trees : List [Tree ]) extends Tree {
47
+ override def isTerm = trees.isEmpty || trees.head.isTerm
48
+ override def isType = ! isTerm
49
+ }
34
50
case class WhileDo (cond : Tree , body : Tree ) extends TermTree
35
51
case class DoWhile (body : Tree , cond : Tree ) extends TermTree
36
52
case class ForYield (enums : List [Tree ], expr : Tree ) extends TermTree
@@ -101,10 +117,19 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] {
101
117
* ==>
102
118
* (new pre.C).<init>[Ts](args1)...(args_n)
103
119
*/
104
- def New (tpt : Tree , argss : List [List [Tree ]]): Tree = {
120
+ def New (tpt : Tree , argss : List [List [Tree ]])( implicit ctx : Context ) : Tree = {
105
121
val (tycon, targs) = tpt match {
106
- case AppliedTypeTree (tycon, targs) => (tycon, targs)
107
- case _ => (tpt, Nil )
122
+ case AppliedTypeTree (tycon, targs) =>
123
+ (tycon, targs)
124
+ case TypedSplice (AppliedTypeTree (tycon, targs)) =>
125
+ (TypedSplice (tycon), targs map TypedSplice )
126
+ case TypedSplice (tpt1 : Tree ) =>
127
+ val argTypes = tpt1.tpe.typeArgs
128
+ val tycon = tpt1.tpe.withoutArgs(argTypes)
129
+ def wrap (tpe : Type ) = TypeTree (tpe) withPos tpt.pos
130
+ (wrap(tycon), argTypes map wrap)
131
+ case _ =>
132
+ (tpt, Nil )
108
133
}
109
134
var prefix : Tree = Select (New (tycon), nme.CONSTRUCTOR )
110
135
if (targs.nonEmpty) prefix = TypeApply (prefix, targs)
0 commit comments