Skip to content

Commit ec28ea1

Browse files
authored
Merge pull request #1538 from dotty-staging/simplify-trees
Simplify trees
2 parents b2b475d + d096f00 commit ec28ea1

23 files changed

+86
-254
lines changed

docs/SyntaxSummary.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ grammar.
105105
WithType ::= AnnotType {`with' AnnotType} (deprecated)
106106
AnnotType ::= SimpleType {Annotation} Annotated(t, annot)
107107
SimpleType ::= SimpleType (TypeArgs | NamedTypeArgs) AppliedTypeTree(t, args)
108-
| SimpleType `#' id SelectFromTypeTree(t, name)
108+
| SimpleType `#' id Select(t, name)
109109
| StableId
110110
| Path `.' `type' SingletonTypeTree(p)
111111
| `(' ArgTypes ')' Tuple(ts)

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

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ import collection.mutable.ListBuffer
1111
import util.Attachment
1212

1313
object desugar {
14-
15-
/** Are we using the new unboxed pair scheme? */
16-
private final val unboxedPairs = false
17-
1814
import untpd._
1915

2016
/** Tags a .withFilter call generated by desugaring a for expression.
@@ -923,25 +919,15 @@ object desugar {
923919
case Parens(t) =>
924920
t
925921
case Tuple(ts) =>
926-
if (unboxedPairs) {
927-
def PairTypeTree(l: Tree, r: Tree) =
928-
AppliedTypeTree(ref(defn.PairType), l :: r :: Nil)
929-
if (ctx.mode is Mode.Type) ts.reduceRight(PairTypeTree)
930-
else if (ts.isEmpty) unitLiteral
931-
else ts.reduceRight(Pair(_, _))
932-
}
933-
else {
934-
val arity = ts.length
935-
def tupleTypeRef = defn.TupleType(arity)
936-
if (arity > Definitions.MaxTupleArity) {
937-
ctx.error(s"tuple too long (max allowed: ${Definitions.MaxTupleArity})", tree.pos)
938-
unitLiteral
939-
}
940-
else if (arity == 1) ts.head
941-
else if (ctx.mode is Mode.Type) AppliedTypeTree(ref(tupleTypeRef), ts)
942-
else if (arity == 0) unitLiteral
943-
else Apply(ref(tupleTypeRef.classSymbol.companionModule.valRef), ts)
944-
}
922+
val arity = ts.length
923+
def tupleTypeRef = defn.TupleType(arity)
924+
if (arity > Definitions.MaxTupleArity) {
925+
ctx.error(s"tuple too long (max allowed: ${Definitions.MaxTupleArity})", tree.pos)
926+
unitLiteral
927+
} else if (arity == 1) ts.head
928+
else if (ctx.mode is Mode.Type) AppliedTypeTree(ref(tupleTypeRef), ts)
929+
else if (arity == 0) unitLiteral
930+
else Apply(ref(tupleTypeRef.classSymbol.companionModule.valRef), ts)
945931
case WhileDo(cond, body) =>
946932
// { <label> def while$(): Unit = if (cond) { body; while$() } ; while$() }
947933
val call = Apply(Ident(nme.WHILE_PREFIX), Nil)
@@ -1048,9 +1034,6 @@ object desugar {
10481034
add(id, TypeTree())
10491035
case Apply(_, args) =>
10501036
args foreach collect
1051-
case Pair(left, right) =>
1052-
collect(left)
1053-
collect(right)
10541037
case Typed(expr, _) =>
10551038
collect(expr)
10561039
case NamedArg(_, arg) =>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
182182
case OrTypeTree(tpt1, tpt2) => mayBeTypePat(tpt1) || mayBeTypePat(tpt2)
183183
case RefinedTypeTree(tpt, refinements) => mayBeTypePat(tpt) || refinements.exists(_.isInstanceOf[Bind])
184184
case AppliedTypeTree(tpt, args) => mayBeTypePat(tpt) || args.exists(_.isInstanceOf[Bind])
185-
case SelectFromTypeTree(tpt, _) => mayBeTypePat(tpt)
185+
case Select(tpt, _) => mayBeTypePat(tpt)
186186
case Annotated(tpt, _) => mayBeTypePat(tpt)
187187
case _ => false
188188
}

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

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ object Trees {
364364
override def toString = s"BackquotedIdent($name)"
365365
}
366366

367-
/** qualifier.name */
367+
/** qualifier.name, or qualifier#name, if qualifier is a type */
368368
case class Select[-T >: Untyped] private[ast] (qualifier: Tree[T], name: Name)
369369
extends RefTree[T] {
370370
type ThisTree[-T >: Untyped] = Select[T]
@@ -428,15 +428,6 @@ object Trees {
428428
type ThisTree[-T >: Untyped] = New[T]
429429
}
430430

431-
/** (left, right) */
432-
case class Pair[-T >: Untyped] private[ast] (left: Tree[T], right: Tree[T])
433-
extends TermTree[T] {
434-
type ThisTree[-T >: Untyped] = Pair[T]
435-
override def isTerm = left.isTerm && right.isTerm
436-
override def isType = left.isType && right.isType
437-
override def isPattern = !isTerm && (left.isPattern || left.isTerm) && (right.isPattern || right.isTerm)
438-
}
439-
440431
/** expr : tpt */
441432
case class Typed[-T >: Untyped] private[ast] (expr: Tree[T], tpt: Tree[T])
442433
extends ProxyTree[T] with TermTree[T] {
@@ -558,15 +549,6 @@ object Trees {
558549
type ThisTree[-T >: Untyped] = SingletonTypeTree[T]
559550
}
560551

561-
/** qualifier # name
562-
* In Scala, this always refers to a type, but in a Java
563-
* compilation unit this might refer to a term.
564-
*/
565-
case class SelectFromTypeTree[-T >: Untyped] private[ast] (qualifier: Tree[T], name: Name)
566-
extends RefTree[T] {
567-
type ThisTree[-T >: Untyped] = SelectFromTypeTree[T]
568-
}
569-
570552
/** left & right */
571553
case class AndTypeTree[-T >: Untyped] private[ast] (left: Tree[T], right: Tree[T])
572554
extends TypTree[T] {
@@ -694,7 +676,7 @@ object Trees {
694676

695677
/** import expr.selectors
696678
* where a selector is either an untyped `Ident`, `name` or
697-
* an untyped `Pair` `name => rename`
679+
* an untyped thicket consisting of `name` and `rename`.
698680
*/
699681
case class Import[-T >: Untyped] private[ast] (expr: Tree[T], selectors: List[Tree[Untyped]])
700682
extends DenotingTree[T] {
@@ -836,7 +818,6 @@ object Trees {
836818
type TypeApply = Trees.TypeApply[T]
837819
type Literal = Trees.Literal[T]
838820
type New = Trees.New[T]
839-
type Pair = Trees.Pair[T]
840821
type Typed = Trees.Typed[T]
841822
type NamedArg = Trees.NamedArg[T]
842823
type Assign = Trees.Assign[T]
@@ -851,7 +832,6 @@ object Trees {
851832
type JavaSeqLiteral = Trees.JavaSeqLiteral[T]
852833
type TypeTree = Trees.TypeTree[T]
853834
type SingletonTypeTree = Trees.SingletonTypeTree[T]
854-
type SelectFromTypeTree = Trees.SelectFromTypeTree[T]
855835
type AndTypeTree = Trees.AndTypeTree[T]
856836
type OrTypeTree = Trees.OrTypeTree[T]
857837
type RefinedTypeTree = Trees.RefinedTypeTree[T]
@@ -955,10 +935,6 @@ object Trees {
955935
case tree: New if tpt eq tree.tpt => tree
956936
case _ => finalize(tree, untpd.New(tpt))
957937
}
958-
def Pair(tree: Tree)(left: Tree, right: Tree)(implicit ctx: Context): Pair = tree match {
959-
case tree: Pair if (left eq tree.left) && (right eq tree.right) => tree
960-
case _ => finalize(tree, untpd.Pair(left, right))
961-
}
962938
def Typed(tree: Tree)(expr: Tree, tpt: Tree)(implicit ctx: Context): Typed = tree match {
963939
case tree: Typed if (expr eq tree.expr) && (tpt eq tree.tpt) => tree
964940
case _ => finalize(tree, untpd.Typed(expr, tpt))
@@ -1014,10 +990,6 @@ object Trees {
1014990
case tree: SingletonTypeTree if ref eq tree.ref => tree
1015991
case _ => finalize(tree, untpd.SingletonTypeTree(ref))
1016992
}
1017-
def SelectFromTypeTree(tree: Tree)(qualifier: Tree, name: Name): SelectFromTypeTree = tree match {
1018-
case tree: SelectFromTypeTree if (qualifier eq tree.qualifier) && (name == tree.name) => tree
1019-
case _ => finalize(tree, untpd.SelectFromTypeTree(qualifier, name))
1020-
}
1021993
def AndTypeTree(tree: Tree)(left: Tree, right: Tree): AndTypeTree = tree match {
1022994
case tree: AndTypeTree if (left eq tree.left) && (right eq tree.right) => tree
1023995
case _ => finalize(tree, untpd.AndTypeTree(left, right))
@@ -1132,8 +1104,6 @@ object Trees {
11321104
tree
11331105
case New(tpt) =>
11341106
cpy.New(tree)(transform(tpt))
1135-
case Pair(left, right) =>
1136-
cpy.Pair(tree)(transform(left), transform(right))
11371107
case Typed(expr, tpt) =>
11381108
cpy.Typed(tree)(transform(expr), transform(tpt))
11391109
case NamedArg(name, arg) =>
@@ -1160,8 +1130,6 @@ object Trees {
11601130
tree
11611131
case SingletonTypeTree(ref) =>
11621132
cpy.SingletonTypeTree(tree)(transform(ref))
1163-
case SelectFromTypeTree(qualifier, name) =>
1164-
cpy.SelectFromTypeTree(tree)(transform(qualifier), name)
11651133
case AndTypeTree(left, right) =>
11661134
cpy.AndTypeTree(tree)(transform(left), transform(right))
11671135
case OrTypeTree(left, right) =>
@@ -1238,8 +1206,6 @@ object Trees {
12381206
x
12391207
case New(tpt) =>
12401208
this(x, tpt)
1241-
case Pair(left, right) =>
1242-
this(this(x, left), right)
12431209
case Typed(expr, tpt) =>
12441210
this(this(x, expr), tpt)
12451211
case NamedArg(name, arg) =>
@@ -1266,8 +1232,6 @@ object Trees {
12661232
x
12671233
case SingletonTypeTree(ref) =>
12681234
this(x, ref)
1269-
case SelectFromTypeTree(qualifier, name) =>
1270-
this(x, qualifier)
12711235
case AndTypeTree(left, right) =>
12721236
this(this(x, left), right)
12731237
case OrTypeTree(left, right) =>
@@ -1343,7 +1307,6 @@ object Trees {
13431307
case tree: DefDef => cpy.DefDef(tree)(name = newName.asTermName)
13441308
case tree: untpd.PolyTypeDef => untpd.cpy.PolyTypeDef(tree)(newName.asTypeName, tree.tparams, tree.rhs).withMods(tree.rawMods)
13451309
case tree: TypeDef => cpy.TypeDef(tree)(name = newName.asTypeName)
1346-
case tree: SelectFromTypeTree => cpy.SelectFromTypeTree(tree)(tree.qualifier, newName)
13471310
}
13481311
}.asInstanceOf[tree.ThisTree[T]]
13491312
}

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

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,8 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
3030
def Select(qualifier: Tree, name: Name)(implicit ctx: Context): Select =
3131
ta.assignType(untpd.Select(qualifier, name), qualifier)
3232

33-
def SelectFromTypeTree(qualifier: Tree, name: Name)(implicit ctx: Context): SelectFromTypeTree =
34-
ta.assignType(untpd.SelectFromTypeTree(qualifier, name), qualifier)
35-
36-
def SelectFromTypeTree(qualifier: Tree, tp: NamedType)(implicit ctx: Context): SelectFromTypeTree =
37-
untpd.SelectFromTypeTree(qualifier, tp.name).withType(tp)
33+
def Select(qualifier: Tree, tp: NamedType)(implicit ctx: Context): Select =
34+
untpd.Select(qualifier, tp.name).withType(tp)
3835

3936
def This(cls: ClassSymbol)(implicit ctx: Context): This =
4037
untpd.This(cls.name).withType(cls.thisType)
@@ -59,9 +56,6 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
5956

6057
def New(tp: Type)(implicit ctx: Context): New = New(TypeTree(tp))
6158

62-
def Pair(left: Tree, right: Tree)(implicit ctx: Context): Pair =
63-
ta.assignType(untpd.Pair(left, right), left, right)
64-
6559
def Typed(expr: Tree, tpt: Tree)(implicit ctx: Context): Typed =
6660
ta.assignType(untpd.Typed(expr, tpt), tpt)
6761

@@ -336,7 +330,7 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
336330
Ident(tp)
337331
else tp.prefix match {
338332
case pre: SingletonType => followOuterLinks(singleton(pre)).select(tp)
339-
case pre => SelectFromTypeTree(TypeTree(pre), tp)
333+
case pre => Select(TypeTree(pre), tp)
340334
} // no checks necessary
341335

342336
def ref(sym: Symbol)(implicit ctx: Context): Tree =
@@ -493,14 +487,6 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
493487
override def New(tree: Tree)(tpt: Tree)(implicit ctx: Context): New =
494488
ta.assignType(untpd.cpy.New(tree)(tpt), tpt)
495489

496-
override def Pair(tree: Tree)(left: Tree, right: Tree)(implicit ctx: Context): Pair = {
497-
val tree1 = untpd.cpy.Pair(tree)(left, right)
498-
tree match {
499-
case tree: Pair if (left.tpe eq tree.left.tpe) && (right.tpe eq tree.right.tpe) => tree1.withTypeUnchecked(tree.tpe)
500-
case _ => ta.assignType(tree1, left, right)
501-
}
502-
}
503-
504490
override def Typed(tree: Tree)(expr: Tree, tpt: Tree)(implicit ctx: Context): Typed =
505491
ta.assignType(untpd.cpy.Typed(tree)(expr, tpt), tpt)
506492

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
139139
def TypeApply(fun: Tree, args: List[Tree]): TypeApply = new TypeApply(fun, args)
140140
def Literal(const: Constant): Literal = new Literal(const)
141141
def New(tpt: Tree): New = new New(tpt)
142-
def Pair(left: Tree, right: Tree): Pair = new Pair(left, right)
143142
def Typed(expr: Tree, tpt: Tree): Typed = new Typed(expr, tpt)
144143
def NamedArg(name: Name, arg: Tree): NamedArg = new NamedArg(name, arg)
145144
def Assign(lhs: Tree, rhs: Tree): Assign = new Assign(lhs, rhs)
@@ -155,7 +154,6 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
155154
def TypeTree(original: Tree): TypeTree = new TypeTree(original)
156155
def TypeTree() = new TypeTree(EmptyTree)
157156
def SingletonTypeTree(ref: Tree): SingletonTypeTree = new SingletonTypeTree(ref)
158-
def SelectFromTypeTree(qualifier: Tree, name: Name): SelectFromTypeTree = new SelectFromTypeTree(qualifier, name)
159157
def AndTypeTree(left: Tree, right: Tree): AndTypeTree = new AndTypeTree(left, right)
160158
def OrTypeTree(left: Tree, right: Tree): OrTypeTree = new OrTypeTree(left, right)
161159
def RefinedTypeTree(tpt: Tree, refinements: List[Tree]): RefinedTypeTree = new RefinedTypeTree(tpt, refinements)

src/dotty/tools/dotc/core/tasty/TastyFormat.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ Standard-Section: "ASTs" TopLevelStat*
7474
SELECT possiblySigned_NameRef qual_Term
7575
NEW cls_Type
7676
SUPER Length this_Term mixinTrait_Type?
77-
PAIR Length left_Term right_Term
7877
TYPED Length expr_Term ascription_Type
7978
NAMEDARG Length paramName_NameRef arg_Term
8079
ASSIGN Length lhs_Term rhs_Term
@@ -300,7 +299,8 @@ object TastyFormat {
300299
final val RENAMED = 138
301300
final val APPLY = 139
302301
final val TYPEAPPLY = 140
303-
final val PAIR = 142
302+
303+
304304
final val TYPED = 143
305305
final val NAMEDARG = 144
306306
final val ASSIGN = 145
@@ -452,7 +452,6 @@ object TastyFormat {
452452
case APPLY => "APPLY"
453453
case TYPEAPPLY => "TYPEAPPLY"
454454
case NEW => "NEW"
455-
case PAIR => "PAIR"
456455
case TYPED => "TYPED"
457456
case NAMEDARG => "NAMEDARG"
458457
case ASSIGN => "ASSIGN"

src/dotty/tools/dotc/core/tasty/TreePickler.scala

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,6 @@ class TreePickler(pickler: TastyPickler) {
392392
case New(tpt) =>
393393
writeByte(NEW)
394394
pickleTpt(tpt)
395-
case Pair(left, right) =>
396-
writeByte(PAIR)
397-
withLength { pickleTree(left); pickleTree(right) }
398395
case Typed(expr, tpt) =>
399396
writeByte(TYPED)
400397
withLength { pickleTree(expr); pickleTpt(tpt) }
@@ -496,7 +493,7 @@ class TreePickler(pickler: TastyPickler) {
496493
withLength {
497494
pickleTree(expr)
498495
selectors foreach {
499-
case Pair(Ident(from), Ident(to)) =>
496+
case Thicket(Ident(from) :: Ident(to) :: Nil) =>
500497
writeByte(RENAMED)
501498
withLength { pickleName(from); pickleName(to) }
502499
case Ident(name) =>

src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) {
831831
case RENAMED =>
832832
readByte()
833833
readEnd()
834-
untpd.Pair(untpd.Ident(readName()), untpd.Ident(readName())) :: readSelectors()
834+
untpd.Thicket(untpd.Ident(readName()), untpd.Ident(readName())) :: readSelectors()
835835
case IMPORTED =>
836836
readByte()
837837
untpd.Ident(readName()) :: readSelectors()
@@ -915,8 +915,6 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) {
915915
tpd.Apply(fn, until(end)(readArg()))
916916
case TYPEAPPLY =>
917917
tpd.TypeApply(readTerm(), until(end)(readTpt()))
918-
case PAIR =>
919-
Pair(readTerm(), readTerm())
920918
case TYPED =>
921919
val expr = readTerm()
922920
val tpt = readTpt()

src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ class Scala2Unpickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClas
10441044
val toName = readNameRef()
10451045
val from = untpd.Ident(fromName)
10461046
val to = untpd.Ident(toName)
1047-
if (toName.isEmpty) from else untpd.Pair(from, untpd.Ident(toName))
1047+
if (toName.isEmpty) from else untpd.Thicket(from, untpd.Ident(toName))
10481048
})
10491049

10501050
Import(expr, selectors)
@@ -1194,7 +1194,7 @@ class Scala2Unpickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClas
11941194
case SELECTFROMTYPEtree =>
11951195
val qualifier = readTreeRef()
11961196
val selector = readTypeNameRef()
1197-
SelectFromTypeTree(qualifier, symbol.namedType)
1197+
Select(qualifier, symbol.namedType)
11981198

11991199
case COMPOUNDTYPEtree =>
12001200
readTemplateRef()

src/dotty/tools/dotc/parsing/JavaParsers.scala

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ object JavaParsers {
227227
def convertToTypeId(tree: Tree): Tree = convertToTypeName(tree) match {
228228
case Some(t) => t withPos tree.pos
229229
case _ => tree match {
230-
case AppliedTypeTree(_, _) | SelectFromTypeTree(_, _) =>
230+
case AppliedTypeTree(_, _) | Select(_, _) =>
231231
tree
232232
case _ =>
233233
syntaxError("identifier expected", tree.pos)
@@ -281,14 +281,11 @@ object JavaParsers {
281281
if (in.token == FINAL) in.nextToken()
282282
if (in.token == IDENTIFIER) {
283283
var t = typeArgs(atPos(in.offset)(Ident(ident())))
284-
// typeSelect generates Select nodes is the lhs is an Ident or Select,
285-
// SelectFromTypeTree otherwise. See #3567.
286-
// Select nodes can be later
287-
// converted in the typechecker to SelectFromTypeTree if the class
288-
// turns out to be an instance ionner class instead of a static inner class.
284+
// typeSelect generates Select nodes if the lhs is an Ident or Select,
285+
// For other nodes it always assumes that the selected item is a type.
289286
def typeSelect(t: Tree, name: Name) = t match {
290287
case Ident(_) | Select(_, _) => Select(t, name)
291-
case _ => SelectFromTypeTree(t, name.toTypeName)
288+
case _ => Select(t, name.toTypeName)
292289
}
293290
while (in.token == DOT) {
294291
in.nextToken()

0 commit comments

Comments
 (0)