Skip to content

Commit 4141bd2

Browse files
authored
Merge pull request #5935 from dotty-staging/drop-andor-typetree
Drop AndTypeTree and OrTypeTree
2 parents af3ab3b + 6ad1432 commit 4141bd2

34 files changed

+143
-848
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1440,7 +1440,7 @@ object desugar {
14401440
def collect(tree: Tree): Unit = tree match {
14411441
case Bind(nme.WILDCARD, tree1) =>
14421442
collect(tree1)
1443-
case tree @ Bind(_, Typed(tree1, tpt)) if !mayBeTypePat(tpt) =>
1443+
case tree @ Bind(_, Typed(tree1, tpt)) =>
14441444
add(tree, tpt)
14451445
collect(tree1)
14461446
case tree @ Bind(_, tree1) =>

compiler/src/dotty/tools/dotc/ast/DesugarEnums.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ object DesugarEnums {
154154
parentTypes.head match {
155155
case parent: RefTree if parent.name == enumClass.name =>
156156
// need a widen method to compute correct type parameters for enum base class
157-
val widenParamType = (appliedEnumRef /: parentTypes.tail)(AndTypeTree)
157+
val widenParamType = (appliedEnumRef /: parentTypes.tail)(makeAndType)
158158
val widenParam = makeSyntheticParameter(tpt = widenParamType)
159159
val widenDef = DefDef(
160160
name = s"${cdef.name}$$to$$${enumClass.name}".toTermName,
@@ -164,7 +164,7 @@ object DesugarEnums {
164164
rhs = Ident(widenParam.name))
165165
(TypeTree(), widenDef :: Nil)
166166
case _ =>
167-
(parentTypes.reduceLeft(AndTypeTree), Nil)
167+
(parentTypes.reduceLeft(makeAndType), Nil)
168168
}
169169
}
170170

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -164,17 +164,6 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
164164
/** Is name a left-associative operator? */
165165
def isLeftAssoc(operator: Name): Boolean = !operator.isEmpty && (operator.toSimpleName.last != ':')
166166

167-
/** can this type be a type pattern? */
168-
def mayBeTypePat(tree: Tree): Boolean = unsplice(tree) match {
169-
case AndTypeTree(tpt1, tpt2) => mayBeTypePat(tpt1) || mayBeTypePat(tpt2)
170-
case OrTypeTree(tpt1, tpt2) => mayBeTypePat(tpt1) || mayBeTypePat(tpt2)
171-
case RefinedTypeTree(tpt, refinements) => mayBeTypePat(tpt) || refinements.exists(_.isInstanceOf[Bind])
172-
case AppliedTypeTree(tpt, args) => mayBeTypePat(tpt) || args.exists(_.isInstanceOf[Bind])
173-
case Select(tpt, _) => mayBeTypePat(tpt)
174-
case Annotated(tpt, _) => mayBeTypePat(tpt)
175-
case _ => false
176-
}
177-
178167
/** Is this argument node of the form <expr> : _*, or is it a reference to
179168
* such an argument ? The latter case can happen when an argument is lifted.
180169
*/

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

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -626,18 +626,6 @@ object Trees {
626626
type ThisTree[-T >: Untyped] = SingletonTypeTree[T]
627627
}
628628

629-
/** left & right */
630-
case class AndTypeTree[-T >: Untyped] private[ast] (left: Tree[T], right: Tree[T])(implicit @constructorOnly src: SourceFile)
631-
extends TypTree[T] {
632-
type ThisTree[-T >: Untyped] = AndTypeTree[T]
633-
}
634-
635-
/** left | right */
636-
case class OrTypeTree[-T >: Untyped] private[ast] (left: Tree[T], right: Tree[T])(implicit @constructorOnly src: SourceFile)
637-
extends TypTree[T] {
638-
type ThisTree[-T >: Untyped] = OrTypeTree[T]
639-
}
640-
641629
/** tpt { refinements } */
642630
case class RefinedTypeTree[-T >: Untyped] private[ast] (tpt: Tree[T], refinements: List[Tree[T]])(implicit @constructorOnly src: SourceFile)
643631
extends ProxyTree[T] with TypTree[T] {
@@ -934,8 +922,6 @@ object Trees {
934922
type Inlined = Trees.Inlined[T]
935923
type TypeTree = Trees.TypeTree[T]
936924
type SingletonTypeTree = Trees.SingletonTypeTree[T]
937-
type AndTypeTree = Trees.AndTypeTree[T]
938-
type OrTypeTree = Trees.OrTypeTree[T]
939925
type RefinedTypeTree = Trees.RefinedTypeTree[T]
940926
type AppliedTypeTree = Trees.AppliedTypeTree[T]
941927
type LambdaTypeTree = Trees.LambdaTypeTree[T]
@@ -1102,14 +1088,6 @@ object Trees {
11021088
case tree: SingletonTypeTree if (ref eq tree.ref) => tree
11031089
case _ => finalize(tree, untpd.SingletonTypeTree(ref)(sourceFile(tree)))
11041090
}
1105-
def AndTypeTree(tree: Tree)(left: Tree, right: Tree)(implicit ctx: Context): AndTypeTree = tree match {
1106-
case tree: AndTypeTree if (left eq tree.left) && (right eq tree.right) => tree
1107-
case _ => finalize(tree, untpd.AndTypeTree(left, right)(sourceFile(tree)))
1108-
}
1109-
def OrTypeTree(tree: Tree)(left: Tree, right: Tree)(implicit ctx: Context): OrTypeTree = tree match {
1110-
case tree: OrTypeTree if (left eq tree.left) && (right eq tree.right) => tree
1111-
case _ => finalize(tree, untpd.OrTypeTree(left, right)(sourceFile(tree)))
1112-
}
11131091
def RefinedTypeTree(tree: Tree)(tpt: Tree, refinements: List[Tree])(implicit ctx: Context): RefinedTypeTree = tree match {
11141092
case tree: RefinedTypeTree if (tpt eq tree.tpt) && (refinements eq tree.refinements) => tree
11151093
case _ => finalize(tree, untpd.RefinedTypeTree(tpt, refinements)(sourceFile(tree)))
@@ -1271,10 +1249,6 @@ object Trees {
12711249
tree
12721250
case SingletonTypeTree(ref) =>
12731251
cpy.SingletonTypeTree(tree)(transform(ref))
1274-
case AndTypeTree(left, right) =>
1275-
cpy.AndTypeTree(tree)(transform(left), transform(right))
1276-
case OrTypeTree(left, right) =>
1277-
cpy.OrTypeTree(tree)(transform(left), transform(right))
12781252
case RefinedTypeTree(tpt, refinements) =>
12791253
cpy.RefinedTypeTree(tree)(transform(tpt), transformSub(refinements))
12801254
case AppliedTypeTree(tpt, args) =>
@@ -1399,10 +1373,6 @@ object Trees {
13991373
x
14001374
case SingletonTypeTree(ref) =>
14011375
this(x, ref)
1402-
case AndTypeTree(left, right) =>
1403-
this(this(x, left), right)
1404-
case OrTypeTree(left, right) =>
1405-
this(this(x, left), right)
14061376
case RefinedTypeTree(tpt, refinements) =>
14071377
this(this(x, tpt), refinements)
14081378
case AppliedTypeTree(tpt, args) =>

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,6 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
161161
def SingletonTypeTree(ref: Tree)(implicit ctx: Context): SingletonTypeTree =
162162
ta.assignType(untpd.SingletonTypeTree(ref), ref)
163163

164-
def AndTypeTree(left: Tree, right: Tree)(implicit ctx: Context): AndTypeTree =
165-
ta.assignType(untpd.AndTypeTree(left, right), left, right)
166-
167-
def OrTypeTree(left: Tree, right: Tree)(implicit ctx: Context): OrTypeTree =
168-
ta.assignType(untpd.OrTypeTree(left, right), left, right)
169-
170164
def RefinedTypeTree(parent: Tree, refinements: List[Tree], refineCls: ClassSymbol)(implicit ctx: Context): Tree =
171165
ta.assignType(untpd.RefinedTypeTree(parent, refinements), parent, refinements, refineCls)
172166

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,6 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
309309
def Inlined(call: tpd.Tree, bindings: List[MemberDef], expansion: Tree)(implicit src: SourceFile): Inlined = new Inlined(call, bindings, expansion)
310310
def TypeTree()(implicit src: SourceFile): TypeTree = new TypeTree()
311311
def SingletonTypeTree(ref: Tree)(implicit src: SourceFile): SingletonTypeTree = new SingletonTypeTree(ref)
312-
def AndTypeTree(left: Tree, right: Tree)(implicit src: SourceFile): AndTypeTree = new AndTypeTree(left, right)
313-
def OrTypeTree(left: Tree, right: Tree)(implicit src: SourceFile): OrTypeTree = new OrTypeTree(left, right)
314312
def RefinedTypeTree(tpt: Tree, refinements: List[Tree])(implicit src: SourceFile): RefinedTypeTree = new RefinedTypeTree(tpt, refinements)
315313
def AppliedTypeTree(tpt: Tree, args: List[Tree])(implicit src: SourceFile): AppliedTypeTree = new AppliedTypeTree(tpt, args)
316314
def LambdaTypeTree(tparams: List[TypeDef], body: Tree)(implicit src: SourceFile): LambdaTypeTree = new LambdaTypeTree(tparams, body)
@@ -403,6 +401,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
403401
case _ => Tuple(ts)
404402
}
405403

404+
def makeAndType(left: Tree, right: Tree)(implicit ctx: Context): AppliedTypeTree =
405+
AppliedTypeTree(ref(defn.andType.typeRef), left :: right :: Nil)
406+
406407
def makeParameter(pname: TermName, tpe: Tree, mods: Modifiers = EmptyModifiers)(implicit ctx: Context): ValDef =
407408
ValDef(pname, tpe, EmptyTree).withMods(mods | Param)
408409

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ class Definitions {
153153
sym
154154
}
155155

156+
private def enterBinaryAlias(name: TypeName, op: (Type, Type) => Type): TypeSymbol =
157+
enterAliasType(name,
158+
HKTypeLambda(TypeBounds.empty :: TypeBounds.empty :: Nil)(
159+
tl => op(tl.paramRefs(0), tl.paramRefs(1))))
160+
156161
private def enterPolyMethod(cls: ClassSymbol, name: TermName, typeParamCount: Int,
157162
resultTypeFn: PolyType => Type, flags: FlagSet = EmptyFlags,
158163
useCompleter: Boolean = false) = {
@@ -323,6 +328,9 @@ class Definitions {
323328
}
324329
def AnyKindType: TypeRef = AnyKindClass.typeRef
325330

331+
lazy val andType: TypeSymbol = enterBinaryAlias(tpnme.AND, AndType(_, _))
332+
lazy val orType: TypeSymbol = enterBinaryAlias(tpnme.OR, OrType(_, _))
333+
326334
/** Marker method to indicate an argument to a call-by-name parameter.
327335
* Created by byNameClosures and elimByName, eliminated by Erasure,
328336
*/
@@ -1327,6 +1335,8 @@ class Definitions {
13271335
AnyClass,
13281336
AnyRefAlias,
13291337
AnyKindClass,
1338+
andType,
1339+
orType,
13301340
RepeatedParamClass,
13311341
ByNameParamClass2x,
13321342
AnyValClass,

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,6 @@ Standard-Section: "ASTs" TopLevelStat*
106106
LAMBDAtpt Length TypeParam* body_Term
107107
TYPEBOUNDStpt Length low_Term high_Term?
108108
ANNOTATEDtpt Length underlying_Term fullAnnotation_Term
109-
ANDtpt Length left_Term right_Term
110-
ORtpt Length left_Term right_Term
111109
MATCHtpt Length bound_Term? sel_Term CaseDef*
112110
BYNAMEtpt underlying_Term
113111
SHAREDterm term_ASTRef
@@ -246,7 +244,7 @@ Standard Section: "Comments" Comment*
246244
object TastyFormat {
247245

248246
final val header: Array[Int] = Array(0x5C, 0xA1, 0xAB, 0x1F)
249-
val MajorVersion: Int = 12
247+
val MajorVersion: Int = 13
250248
val MinorVersion: Int = 0
251249

252250
/** Tags used to serialize names */
@@ -419,9 +417,7 @@ object TastyFormat {
419417
final val TYPEBOUNDS = 163
420418
final val TYPEBOUNDStpt = 164
421419
final val ANDtype = 165
422-
final val ANDtpt = 166
423420
final val ORtype = 167
424-
final val ORtpt = 168
425421
final val POLYtype = 169
426422
final val TYPELAMBDAtype = 170
427423
final val LAMBDAtpt = 171
@@ -517,8 +513,6 @@ object TastyFormat {
517513
| LAMBDAtpt
518514
| TYPEBOUNDStpt
519515
| ANNOTATEDtpt
520-
| ANDtpt
521-
| ORtpt
522516
| BYNAMEtpt
523517
| MATCHtpt
524518
| BIND => true
@@ -647,9 +641,7 @@ object TastyFormat {
647641
case TYPEBOUNDStpt => "TYPEBOUNDStpt"
648642
case TYPEALIAS => "TYPEALIAS"
649643
case ANDtype => "ANDtype"
650-
case ANDtpt => "ANDtpt"
651644
case ORtype => "ORtype"
652-
case ORtpt => "ORtpt"
653645
case BYNAMEtype => "BYNAMEtype"
654646
case BYNAMEtpt => "BYNAMEtpt"
655647
case POLYtype => "POLYtype"

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -559,12 +559,6 @@ class TreePickler(pickler: TastyPickler) {
559559
case AppliedTypeTree(tycon, args) =>
560560
writeByte(APPLIEDtpt)
561561
withLength { pickleTree(tycon); args.foreach(pickleTree) }
562-
case AndTypeTree(tp1, tp2) =>
563-
writeByte(ANDtpt)
564-
withLength { pickleTree(tp1); pickleTree(tp2) }
565-
case OrTypeTree(tp1, tp2) =>
566-
writeByte(ORtpt)
567-
withLength { pickleTree(tp1); pickleTree(tp2) }
568562
case MatchTypeTree(bound, selector, cases) =>
569563
writeByte(MATCHtpt)
570564
withLength {

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,14 +1175,11 @@ class TreeUnpickler(reader: TastyReader,
11751175
// types. This came up in #137 of collection strawman.
11761176
val tycon = readTpt()
11771177
val args = until(end)(readTpt())
1178-
untpd.AppliedTypeTree(tycon, args).withType(tycon.tpe.safeAppliedTo(args.tpes))
1179-
case ANDtpt =>
1180-
val tpt1 = readTpt()
1181-
val tpt2 = readTpt()
1182-
// FIXME: We need to do this instead of "AndType(tpt1, tpt2)" to avoid self-type cyclic reference in tasty_tools
1183-
untpd.AndTypeTree(tpt1, tpt2).withType(AndType(tpt1.tpe, tpt2.tpe))
1184-
case ORtpt =>
1185-
OrTypeTree(readTpt(), readTpt())
1178+
val ownType =
1179+
if (tycon.symbol == defn.andType) AndType(args(0).tpe, args(1).tpe)
1180+
else if (tycon.symbol == defn.orType) OrType(args(0).tpe, args(1).tpe)
1181+
else tycon.tpe.safeAppliedTo(args.tpes)
1182+
untpd.AppliedTypeTree(tycon, args).withType(ownType)
11861183
case ANNOTATEDtpt =>
11871184
Annotated(readTpt(), readTerm())
11881185
case LAMBDAtpt =>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ object JavaParsers {
428428
}
429429
val ts = buf.toList
430430
if (ts.tail.isEmpty) ts.head
431-
else ts.reduce(AndTypeTree(_,_))
431+
else ts.reduce(makeAndType(_,_))
432432
}
433433

434434
def formalParams(): List[ValDef] = {

0 commit comments

Comments
 (0)