Skip to content

Commit 5a8f4c8

Browse files
committed
More precise untyped tree handling
1) Untyped trees now have precise isType/isTerm methods. 2) The New(tree, args) method can now also handle TypedSplices.
1 parent 57fc70d commit 5a8f4c8

File tree

1 file changed

+35
-10
lines changed

1 file changed

+35
-10
lines changed

src/dotty/tools/dotc/ast/untpd.scala

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,16 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] {
1313

1414
// ----- Tree cases that exist in untyped form only ------------------
1515

16+
trait OpTree extends Tree {
17+
def op: Name
18+
override def isTerm = op.isTermName
19+
override def isType = op.isTypeName
20+
}
21+
1622
/** 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+
}
1826

1927
/** mods object name impl */
2028
case class ModuleDef(mods: Modifiers, name: TermName, impl: Template)
@@ -25,12 +33,20 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] {
2533

2634
case class SymbolLit(str: String) extends TermTree
2735
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+
}
3450
case class WhileDo(cond: Tree, body: Tree) extends TermTree
3551
case class DoWhile(body: Tree, cond: Tree) extends TermTree
3652
case class ForYield(enums: List[Tree], expr: Tree) extends TermTree
@@ -101,10 +117,19 @@ object untpd extends Trees.Instance[Untyped] with TreeInfo[Untyped] {
101117
* ==>
102118
* (new pre.C).<init>[Ts](args1)...(args_n)
103119
*/
104-
def New(tpt: Tree, argss: List[List[Tree]]): Tree = {
120+
def New(tpt: Tree, argss: List[List[Tree]])(implicit ctx: Context): Tree = {
105121
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)
108133
}
109134
var prefix: Tree = Select(New(tycon), nme.CONSTRUCTOR)
110135
if (targs.nonEmpty) prefix = TypeApply(prefix, targs)

0 commit comments

Comments
 (0)