Skip to content

Commit 97a3732

Browse files
committed
Merge pull request #202 from dotty-staging/no-closure-try
Restructure Try node.
2 parents 9f508df + 5540f13 commit 97a3732

20 files changed

+131
-84
lines changed

src/dotty/tools/dotc/Run.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package dotc
33

44
import core._
55
import Contexts._, Periods._, Symbols._, Phases._, Decorators._
6+
import dotty.tools.dotc.transform.TreeTransforms.TreeTransformer
67
import io.PlainFile
78
import util.{SourceFile, NoSource, Stats, SimpleMap}
89
import reporting.Reporter
@@ -60,7 +61,10 @@ class Run(comp: Compiler)(implicit ctx: Context) {
6061

6162
private def printTree(ctx: Context) = {
6263
val unit = ctx.compilationUnit
63-
println(s"result of $unit after ${ctx.phase.prev}:")
64+
val prevPhase = ctx.phase.prev // can be a mini-phase
65+
val squahsedPhase = ctx.squashed(prevPhase)
66+
67+
println(s"result of $unit after ${squahsedPhase}:")
6468
println(unit.tpdTree.show(ctx))
6569
}
6670

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,16 @@ object desugar {
817817
case PatDef(mods, pats, tpt, rhs) =>
818818
val pats1 = if (tpt.isEmpty) pats else pats map (Typed(_, tpt))
819819
flatTree(pats1 map (makePatDef(mods, _, rhs)))
820+
case ParsedTry(body, handler, finalizer) =>
821+
handler match {
822+
case Match(EmptyTree, cases) => Try(body, cases, finalizer)
823+
case EmptyTree => Try(body, Nil, finalizer)
824+
case _ =>
825+
Try(body,
826+
List(CaseDef(Ident(nme.DEFAULT_EXCEPTION_NAME), EmptyTree, Apply(handler, Ident(nme.DEFAULT_EXCEPTION_NAME)))),
827+
finalizer)
828+
}
829+
820830
}
821831
}.withPos(tree.pos)
822832

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ object Trees {
611611
*
612612
* Match(EmptyTree, <case x: Throwable => $anonfun(x)>)
613613
*/
614-
case class Try[-T >: Untyped] private[ast] (expr: Tree[T], handler: Tree[T], finalizer: Tree[T])
614+
case class Try[-T >: Untyped] private[ast] (expr: Tree[T], cases: List[CaseDef[T]], finalizer: Tree[T])
615615
extends TermTree[T] {
616616
type ThisTree[-T >: Untyped] = Try[T]
617617
}
@@ -1024,9 +1024,9 @@ object Trees {
10241024
case tree: Return if (expr eq tree.expr) && (from eq tree.from) => tree
10251025
case _ => finalize(tree, untpd.Return(expr, from))
10261026
}
1027-
def Try(tree: Tree)(expr: Tree, handler: Tree, finalizer: Tree)(implicit ctx: Context): Try = tree match {
1028-
case tree: Try if (expr eq tree.expr) && (handler eq tree.handler) && (finalizer eq tree.finalizer) => tree
1029-
case _ => finalize(tree, untpd.Try(expr, handler, finalizer))
1027+
def Try(tree: Tree)(expr: Tree, cases: List[CaseDef], finalizer: Tree)(implicit ctx: Context): Try = tree match {
1028+
case tree: Try if (expr eq tree.expr) && (cases eq tree.cases) && (finalizer eq tree.finalizer) => tree
1029+
case _ => finalize(tree, untpd.Try(expr, cases, finalizer))
10301030
}
10311031
def Throw(tree: Tree)(expr: Tree)(implicit ctx: Context): Throw = tree match {
10321032
case tree: Throw if (expr eq tree.expr) => tree
@@ -1128,8 +1128,8 @@ object Trees {
11281128
Closure(tree: Tree)(env, meth, tpt)
11291129
def CaseDef(tree: CaseDef)(pat: Tree = tree.pat, guard: Tree = tree.guard, body: Tree = tree.body)(implicit ctx: Context): CaseDef =
11301130
CaseDef(tree: Tree)(pat, guard, body)
1131-
def Try(tree: Try)(expr: Tree = tree.expr, handler: Tree = tree.handler, finalizer: Tree = tree.finalizer)(implicit ctx: Context): Try =
1132-
Try(tree: Tree)(expr, handler, finalizer)
1131+
def Try(tree: Try)(expr: Tree = tree.expr, cases: List[CaseDef] = tree.cases, finalizer: Tree = tree.finalizer)(implicit ctx: Context): Try =
1132+
Try(tree: Tree)(expr, cases, finalizer)
11331133
def UnApply(tree: UnApply)(fun: Tree = tree.fun, implicits: List[Tree] = tree.implicits, patterns: List[Tree] = tree.patterns): UnApply =
11341134
UnApply(tree: Tree)(fun, implicits, patterns)
11351135
def ValDef(tree: ValDef)(mods: Modifiers = tree.mods, name: TermName = tree.name, tpt: Tree = tree.tpt, rhs: Tree = tree.rhs): ValDef =
@@ -1181,8 +1181,8 @@ object Trees {
11811181
cpy.CaseDef(tree)(transform(pat), transform(guard), transform(body))
11821182
case Return(expr, from) =>
11831183
cpy.Return(tree)(transform(expr), transformSub(from))
1184-
case Try(block, handler, finalizer) =>
1185-
cpy.Try(tree)(transform(block), transform(handler), transform(finalizer))
1184+
case Try(block, cases, finalizer) =>
1185+
cpy.Try(tree)(transform(block), transformSub(cases), transform(finalizer))
11861186
case Throw(expr) =>
11871187
cpy.Throw(tree)(transform(expr))
11881188
case SeqLiteral(elems) =>

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
113113
def Return(expr: Tree, from: Tree)(implicit ctx: Context): Return =
114114
ta.assignType(untpd.Return(expr, from))
115115

116-
def Try(block: Tree, handler: Tree, finalizer: Tree)(implicit ctx: Context): Try =
117-
ta.assignType(untpd.Try(block, handler, finalizer), block, handler)
116+
def Try(block: Tree, cases: List[CaseDef], finalizer: Tree)(implicit ctx: Context): Try =
117+
ta.assignType(untpd.Try(block, cases, finalizer), block, cases)
118118

119119
def Throw(expr: Tree)(implicit ctx: Context): Throw =
120120
ta.assignType(untpd.Throw(expr))
@@ -457,11 +457,11 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
457457
override def Return(tree: Tree)(expr: Tree, from: Tree)(implicit ctx: Context): Return =
458458
ta.assignType(untpd.cpy.Return(tree)(expr, from))
459459

460-
override def Try(tree: Tree)(expr: Tree, handler: Tree, finalizer: Tree)(implicit ctx: Context): Try = {
461-
val tree1 = untpd.cpy.Try(tree)(expr, handler, finalizer)
460+
override def Try(tree: Tree)(expr: Tree, cases: List[CaseDef], finalizer: Tree)(implicit ctx: Context): Try = {
461+
val tree1 = untpd.cpy.Try(tree)(expr, cases, finalizer)
462462
tree match {
463-
case tree: Try if (expr.tpe eq tree.expr.tpe) && (handler.tpe eq tree.handler.tpe) => tree1.withTypeUnchecked(tree.tpe)
464-
case _ => ta.assignType(tree1, expr, handler)
463+
case tree: Try if (expr.tpe eq tree.expr.tpe) && (sameTypes(cases, tree.cases)) => tree1.withTypeUnchecked(tree.tpe)
464+
case _ => ta.assignType(tree1, expr, cases)
465465
}
466466
}
467467

@@ -490,8 +490,8 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
490490
Closure(tree: Tree)(env, meth, tpt)
491491
override def CaseDef(tree: CaseDef)(pat: Tree = tree.pat, guard: Tree = tree.guard, body: Tree = tree.body)(implicit ctx: Context): CaseDef =
492492
CaseDef(tree: Tree)(pat, guard, body)
493-
override def Try(tree: Try)(expr: Tree = tree.expr, handler: Tree = tree.handler, finalizer: Tree = tree.finalizer)(implicit ctx: Context): Try =
494-
Try(tree: Tree)(expr, handler, finalizer)
493+
override def Try(tree: Try)(expr: Tree = tree.expr, cases: List[CaseDef] = tree.cases, finalizer: Tree = tree.finalizer)(implicit ctx: Context): Try =
494+
Try(tree: Tree)(expr, cases, finalizer)
495495
}
496496

497497
implicit class TreeOps[ThisTree <: tpd.Tree](val tree: ThisTree) extends AnyVal {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
3232
def withName(name: Name)(implicit ctx: Context) = cpy.ModuleDef(this)(mods, name.toTermName, impl)
3333
}
3434

35+
case class ParsedTry(expr: Tree, handler: Tree, finalizer: Tree) extends TermTree
36+
3537
case class SymbolLit(str: String) extends TermTree
3638
case class InterpolatedString(id: TermName, strings: List[Literal], elems: List[Tree]) extends TermTree
3739
case class Function(args: List[Tree], body: Tree) extends Tree {
@@ -123,7 +125,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
123125
def Match(selector: Tree, cases: List[CaseDef]): Match = new Match(selector, cases)
124126
def CaseDef(pat: Tree, guard: Tree, body: Tree): CaseDef = new CaseDef(pat, guard, body)
125127
def Return(expr: Tree, from: Tree): Return = new Return(expr, from)
126-
def Try(expr: Tree, handler: Tree, finalizer: Tree): Try = new Try(expr, handler, finalizer)
128+
def Try(expr: Tree, cases: List[CaseDef], finalizer: Tree): Try = new Try(expr, cases, finalizer)
127129
def Throw(expr: Tree): Throw = new Throw(expr)
128130
def SeqLiteral(elems: List[Tree]): SeqLiteral = new SeqLiteral(elems)
129131
def JavaSeqLiteral(elems: List[Tree]): JavaSeqLiteral = new JavaSeqLiteral(elems)

src/dotty/tools/dotc/core/Contexts.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,10 @@ object Contexts {
472472

473473
/** The standard definitions */
474474
val definitions = new Definitions
475+
476+
def squashed(p: Phase): Phase = {
477+
squashedPhases.find(_.period.containsPhaseId(p.id)).getOrElse(NoPhase)
478+
}
475479
}
476480

477481
/** The essential mutable state of a context base, collected into a common class */

src/dotty/tools/dotc/core/Phases.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Denotations._
99
import config.Printers._
1010
import scala.collection.mutable.{ListBuffer, ArrayBuffer}
1111
import dotty.tools.dotc.transform.TreeTransforms.{TreeTransformer, MiniPhase, TreeTransform}
12-
import dotty.tools.dotc.transform.{TreeTransforms, ExplicitOuter, Erasure, Flatten, GettersSetters}
12+
import dotty.tools.dotc.transform._
1313
import Periods._
1414
import typer.{FrontEnd, RefChecks}
1515
import ast.tpd
@@ -167,13 +167,15 @@ object Phases {
167167
private val typerCache = new PhaseCache(classOf[FrontEnd])
168168
private val refChecksCache = new PhaseCache(classOf[RefChecks])
169169
private val erasureCache = new PhaseCache(classOf[Erasure])
170+
private val patmatCache = new PhaseCache(classOf[PatternMatcher])
170171
private val flattenCache = new PhaseCache(classOf[Flatten])
171172
private val explicitOuterCache = new PhaseCache(classOf[ExplicitOuter])
172173
private val gettersSettersCache = new PhaseCache(classOf[GettersSetters])
173174

174175
def typerPhase = typerCache.phase
175176
def refchecksPhase = refChecksCache.phase
176177
def erasurePhase = erasureCache.phase
178+
def patmatPhase = patmatCache.phase
177179
def flattenPhase = flattenCache.phase
178180
def explicitOuterPhase = explicitOuterCache.phase
179181
def gettersSettersPhase = gettersSettersCache.phase

src/dotty/tools/dotc/core/StdNames.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ object StdNames {
121121
val SUPER_PREFIX: N = "super$"
122122
val TRAIT_SETTER_PREFIX: N = "_setter_$"
123123
val WHILE_PREFIX: N = "while$"
124+
val DEFAULT_EXCEPTION_NAME: N = "ex$"
124125

125126
// value types (and AnyRef) are all used as terms as well
126127
// as (at least) arguments to the @specialize annotation.

src/dotty/tools/dotc/core/pickling/UnPickler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ class UnPickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClassRoot:
10351035
val block = readTreeRef()
10361036
val finalizer = readTreeRef()
10371037
val catches = until(end, readCaseDefRef)
1038-
Try(block, Match(EmptyTree, catches), finalizer)
1038+
Try(block, catches, finalizer)
10391039

10401040
case THROWtree =>
10411041
Throw(readTreeRef())

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ object Parsers {
914914
val finalizer =
915915
if (handler.isEmpty || in.token == FINALLY) { accept(FINALLY); expr() }
916916
else EmptyTree
917-
Try(body, handler, finalizer)
917+
ParsedTry(body, handler, finalizer)
918918
}
919919
case THROW =>
920920
atPos(in.skipToken()) { Throw(expr()) }

0 commit comments

Comments
 (0)