1
- package dotty .tools .dotc .core
1
+ package dotty .tools .dotc
2
+ package core
2
3
3
- import Types ._ , Names ._ , Flags ._ , Positions ._ , Contexts ._ , Constants ._ , SymDenotations ._ , Symbols ._
4
+ import Types ._ , Names ._ , Flags ._ , util . Positions ._ , Contexts ._ , Constants ._ , SymDenotations ._ , Symbols ._
4
5
import Denotations ._ , StdNames ._
5
6
import annotation .tailrec
6
7
import language .higherKinds
@@ -110,6 +111,7 @@ object Trees {
110
111
override def getMessage : String = s " type of $tree is not assigned "
111
112
}
112
113
114
+ type Untyped = Null
113
115
type TypedTree = Tree [Type ]
114
116
type UntypedTree = Tree [Nothing ]
115
117
@@ -532,6 +534,9 @@ object Trees {
532
534
extends NameTree [Nothing ] with DefTree [Nothing ] {
533
535
type ThisTree [T ] <: NameTree [T ] with DefTree [T ] with ModuleDef
534
536
val pos = cpos union impl.pos
537
+ def derivedModuleDef (mods : Modifiers [Nothing ], name : TermName , impl : Template [Nothing ]) =
538
+ if (mods == this .mods && name == this .name && (impl eq this .impl)) this
539
+ else ModuleDef (mods, name, impl)
535
540
}
536
541
537
542
/** (vparams) => body */
@@ -541,6 +546,78 @@ object Trees {
541
546
val pos = unionPos(cpos union body.pos, vparams)
542
547
}
543
548
549
+ /** Something in parentheses */
550
+ case class Parens (trees : List [Tree [Nothing ]])(implicit cpos : Position ) extends Tree [Nothing ] {
551
+ type ThisType [T ] <: Parens
552
+ val pos = unionPos(cpos, trees)
553
+ }
554
+
555
+ // ----- Generic Tree Instances, inherited from `tpt` and `untpd`.
556
+
557
+ abstract class Instance [T ] {
558
+
559
+ type Modifiers = Trees .Modifiers [T ]
560
+ type Tree = Trees .Tree [T ]
561
+ type TypTree = Trees .TypTree [T ]
562
+ type TermTree = Trees .TermTree [T ]
563
+ type PatternTree = Trees .PatternTree [T ]
564
+ type DenotingTree = Trees .DenotingTree [T ]
565
+ type ProxyTree = Trees .ProxyTree [T ]
566
+ type NameTree = Trees .NameTree [T ]
567
+ type RefTree = Trees .RefTree [T ]
568
+ type DefTree = Trees .DefTree [T ]
569
+
570
+ type TreeCopier = Trees .TreeCopier [T ]
571
+ type TreeAccumulator [U ] = Trees .TreeAccumulator [U , T ]
572
+ type TreeTransformer = Trees .TreeTransformer [T ]
573
+
574
+ type Ident = Trees .Ident [T ]
575
+ type Select = Trees .Select [T ]
576
+ type This = Trees .This [T ]
577
+ type Super = Trees .Super [T ]
578
+ type Apply = Trees .Apply [T ]
579
+ type TypeApply = Trees .TypeApply [T ]
580
+ type Literal = Trees .Literal [T ]
581
+ type New = Trees .New [T ]
582
+ type Pair = Trees .Pair [T ]
583
+ type Typed = Trees .Typed [T ]
584
+ type NamedArg = Trees .NamedArg [T ]
585
+ type Assign = Trees .Assign [T ]
586
+ type Block = Trees .Block [T ]
587
+ type If = Trees .If [T ]
588
+ type Match = Trees .Match [T ]
589
+ type CaseDef = Trees .CaseDef [T ]
590
+ type Return = Trees .Return [T ]
591
+ type Try = Trees .Try [T ]
592
+ type Throw = Trees .Throw [T ]
593
+ type SeqLiteral = Trees .SeqLiteral [T ]
594
+ type TypeTree = Trees .TypeTree [T ]
595
+ type SingletonTypeTree = Trees .SingletonTypeTree [T ]
596
+ type SelectFromTypeTree = Trees .SelectFromTypeTree [T ]
597
+ type AndTypeTree = Trees .AndTypeTree [T ]
598
+ type OrTypeTree = Trees .OrTypeTree [T ]
599
+ type RefineTypeTree = Trees .RefineTypeTree [T ]
600
+ type AppliedTypeTree = Trees .AppliedTypeTree [T ]
601
+ type TypeBoundsTree = Trees .TypeBoundsTree [T ]
602
+ type Bind = Trees .Bind [T ]
603
+ type Alternative = Trees .Alternative [T ]
604
+ type UnApply = Trees .UnApply [T ]
605
+ type ValDef = Trees .ValDef [T ]
606
+ type DefDef = Trees .DefDef [T ]
607
+ type TypeDef = Trees .TypeDef [T ]
608
+ type Template = Trees .Template [T ]
609
+ type ClassDef = Trees .ClassDef [T ]
610
+ type Import = Trees .Import [T ]
611
+ type PackageDef = Trees .PackageDef [T ]
612
+ type Annotated = Trees .Annotated [T ]
613
+ type EmptyTree = Trees .EmptyTree [T ]
614
+ type SharedTree = Trees .SharedTree [T ]
615
+
616
+ protected implicit def pos (implicit ctx : Context ): Position = ctx.position
617
+
618
+ def defPos (sym : Symbol )(implicit ctx : Context ) = ctx.position union sym.coord.toPosition
619
+ }
620
+
544
621
// ----- Helper functions and classes ---------------------------------------
545
622
546
623
@ tailrec final def unionPos (base : Position , trees : List [Tree [_]]): Position = trees match {
@@ -712,7 +789,7 @@ object Trees {
712
789
}
713
790
}
714
791
715
- abstract class TreeTransformer [T , C ] {
792
+ abstract class FullTreeTransformer [T , C ] {
716
793
var sharedMemo : Map [SharedTree [T ], SharedTree [T ]] = Map ()
717
794
718
795
def transform (tree : Tree [T ], c : C ): Tree [T ] = tree match {
@@ -861,6 +938,107 @@ object Trees {
861
938
def finishSharedTree (tree : Tree [T ], old : Tree [T ], c : C , plugins : Plugins ) = tree
862
939
}
863
940
941
+ abstract class TreeTransformer [T ] {
942
+ var sharedMemo : Map [SharedTree [T ], SharedTree [T ]] = Map ()
943
+
944
+ def transform (tree : Tree [T ]): Tree [T ] = tree match {
945
+ case Ident (name) =>
946
+ tree
947
+ case Select (qualifier, name) =>
948
+ tree.derivedSelect(transform(qualifier), name)
949
+ case This (qual) =>
950
+ tree
951
+ case Super (qual, mix) =>
952
+ tree.derivedSuper(transform(qual), mix)
953
+ case Apply (fun, args) =>
954
+ tree.derivedApply(transform(fun), transform(args))
955
+ case TypeApply (fun, args) =>
956
+ tree.derivedTypeApply(transform(fun), transform(args))
957
+ case Literal (const) =>
958
+ tree
959
+ case New (tpt) =>
960
+ tree.derivedNew(transform(tpt))
961
+ case Pair (left, right) =>
962
+ tree.derivedPair(transform(left), transform(right))
963
+ case Typed (expr, tpt) =>
964
+ tree.derivedTyped(transform(expr), transform(tpt))
965
+ case NamedArg (name, arg) =>
966
+ tree.derivedNamedArg(name, transform(arg))
967
+ case Assign (lhs, rhs) =>
968
+ tree.derivedAssign(transform(lhs), transform(rhs))
969
+ case Block (stats, expr) =>
970
+ tree.derivedBlock(transform(stats), transform(expr))
971
+ case If (cond, thenp, elsep) =>
972
+ tree.derivedIf(transform(cond), transform(thenp), transform(elsep))
973
+ case Match (selector, cases) =>
974
+ tree.derivedMatch(transform(selector), transformSub(cases))
975
+ case CaseDef (pat, guard, body) =>
976
+ tree.derivedCaseDef(transform(pat), transform(guard), transform(body))
977
+ case Return (expr, from) =>
978
+ tree.derivedReturn(transform(expr), transformSub(from))
979
+ case Try (block, catches, finalizer) =>
980
+ tree.derivedTry(transform(block), transformSub(catches), transform(finalizer))
981
+ case Throw (expr) =>
982
+ tree.derivedThrow(transform(expr))
983
+ case SeqLiteral (elemtpt, elems) =>
984
+ tree.derivedSeqLiteral(transform(elemtpt), transform(elems))
985
+ case TypeTree (original) =>
986
+ tree.derivedTypeTree(transform(original))
987
+ case SingletonTypeTree (ref) =>
988
+ tree.derivedSingletonTypeTree(transform(ref))
989
+ case SelectFromTypeTree (qualifier, name) =>
990
+ tree.derivedSelectFromTypeTree(transform(qualifier), name)
991
+ case AndTypeTree (left, right) =>
992
+ tree.derivedAndTypeTree(transform(left), transform(right))
993
+ case OrTypeTree (left, right) =>
994
+ tree.derivedOrTypeTree(transform(left), transform(right))
995
+ case RefineTypeTree (tpt, refinements) =>
996
+ tree.derivedRefineTypeTree(transform(tpt), transformSub(refinements))
997
+ case AppliedTypeTree (tpt, args) =>
998
+ tree.derivedAppliedTypeTree(transform(tpt), transform(args))
999
+ case TypeBoundsTree (lo, hi) =>
1000
+ tree.derivedTypeBoundsTree(transform(lo), transform(hi))
1001
+ case Bind (name, body) =>
1002
+ tree.derivedBind(name, transform(body))
1003
+ case Alternative (trees) =>
1004
+ tree.derivedAlternative(transform(trees))
1005
+ case UnApply (fun, args) =>
1006
+ tree.derivedUnApply(transform(fun), transform(args))
1007
+ case ValDef (mods, name, tpt, rhs) =>
1008
+ tree.derivedValDef(mods, name, transform(tpt), transform(rhs))
1009
+ case DefDef (mods, name, tparams, vparamss, tpt, rhs) =>
1010
+ tree.derivedDefDef(mods, name, transformSub(tparams), vparamss mapConserve (transformSub(_)), transform(tpt), transform(rhs))
1011
+ case TypeDef (mods, name, rhs) =>
1012
+ tree.derivedTypeDef(mods, name, transform(rhs))
1013
+ case Template (parents, self, body) =>
1014
+ tree.derivedTemplate(transform(parents), transformSub(self), transform(body))
1015
+ case ClassDef (mods, name, tparams, impl) =>
1016
+ tree.derivedClassDef(mods, name, transformSub(tparams), transformSub(impl))
1017
+ case Import (expr, selectors) =>
1018
+ tree.derivedImport(transform(expr), selectors)
1019
+ case PackageDef (pid, stats) =>
1020
+ tree.derivedPackageDef(transformSub(pid), transform(stats))
1021
+ case Annotated (annot, arg) =>
1022
+ tree.derivedAnnotated(transform(annot), transform(arg))
1023
+ case EmptyTree () =>
1024
+ tree
1025
+ case tree @ SharedTree (shared) =>
1026
+ sharedMemo get tree match {
1027
+ case Some (tree1) => tree1
1028
+ case None =>
1029
+ val tree1 = tree.derivedSharedTree(transform(shared))
1030
+ sharedMemo = sharedMemo.updated(tree, tree1)
1031
+ tree1
1032
+ }
1033
+ }
1034
+ def transform (trees : List [Tree [T ]]): List [Tree [T ]] =
1035
+ trees mapConserve (transform(_))
1036
+ def transformSub (tree : Tree [T ]): tree.ThisTree [T ] =
1037
+ transform(tree).asInstanceOf [tree.ThisTree [T ]]
1038
+ def transformSub [TT <: Tree [T ]](trees : List [TT ]): List [TT ] =
1039
+ transform(trees).asInstanceOf [List [TT ]]
1040
+ }
1041
+
864
1042
abstract class TreeAccumulator [T , U ] extends ((T , Tree [U ]) => T ) {
865
1043
var sharedMemo : Map [SharedTree [U ], T ] = Map ()
866
1044
def apply (x : T , tree : Tree [U ]): T
0 commit comments