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

+5-1
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

+10
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

+8-8
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

+8-8
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

+3-1
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

+4
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

+3-1
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

+1
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

+1-1
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

+1-1
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()) }

src/dotty/tools/dotc/printing/RefinedPrinter.scala

+9-4
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
141141
super.toText(tp)
142142
}
143143

144+
def blockText[T >: Untyped](trees: List[Tree[T]]): Text =
145+
"{" ~ toText(trees, "\n") ~ "}"
146+
144147
override def toText[T >: Untyped](tree: Tree[T]): Text = controlled {
145148

146149
def optDotPrefix(name: Name) = optText(name)(_ ~ ".")
@@ -155,8 +158,7 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
155158
def addVparamssText(txt: Text, vparamss: List[List[ValDef[T]]]): Text =
156159
(txt /: vparamss)((txt, vparams) => txt ~ "(" ~ toText(vparams, ", ") ~ ")")
157160

158-
def blockText(trees: List[Tree[T]]): Text =
159-
"{" ~ toText(trees, "\n") ~ "}"
161+
160162

161163
def caseBlockText(tree: Tree[T]): Text = tree match {
162164
case Block(stats, expr) => toText(stats :+ expr, "\n")
@@ -261,9 +263,9 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
261263
"case " ~ toText(pat) ~ optText(guard)(" if " ~ _) ~ " => " ~ caseBlockText(body)
262264
case Return(expr, from) =>
263265
changePrec(GlobalPrec) { "return" ~ optText(expr)(" " ~ _) }
264-
case Try(expr, handler, finalizer) =>
266+
case Try(expr, cases, finalizer) =>
265267
changePrec(GlobalPrec) {
266-
"try " ~ toText(expr) ~ optText(handler)(" catch " ~ _) ~ optText(finalizer)(" finally " ~ _)
268+
"try " ~ toText(expr) ~ optText(cases)(" catch " ~ _) ~ optText(finalizer)(" finally " ~ _)
267269
}
268270
case Throw(expr) =>
269271
changePrec(GlobalPrec) {
@@ -461,6 +463,9 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
461463
def optText[T >: Untyped](tree: Tree[T])(encl: Text => Text): Text =
462464
if (tree.isEmpty) "" else encl(toText(tree))
463465

466+
def optText[T >: Untyped](tree: List[Tree[T]])(encl: Text => Text): Text =
467+
if (tree.exists(!_.isEmpty)) "" else encl(blockText(tree))
468+
464469
override protected def polyParamName(name: TypeName): TypeName =
465470
name.unexpandedName()
466471

src/dotty/tools/dotc/transform/Erasure.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,10 @@ object Erasure extends TypeTestsCasts{
111111
object Boxing {
112112

113113
def isUnbox(sym: Symbol)(implicit ctx: Context) =
114-
sym.name == nme.unbox && (defn.ScalaBoxedClasses contains sym.owner)
114+
sym.name == nme.unbox && (defn.ScalaBoxedClasses contains sym.owner.linkedClass)
115115

116116
def isBox(sym: Symbol)(implicit ctx: Context) =
117-
sym.name == nme.box && (defn.ScalaValueClasses contains sym.owner)
117+
sym.name == nme.box && (defn.ScalaValueClasses contains sym.owner.linkedClass)
118118

119119
def boxMethod(cls: ClassSymbol)(implicit ctx: Context) =
120120
cls.linkedClass.info.member(nme.box).symbol

src/dotty/tools/dotc/transform/LazyVals.scala

+6-9
Original file line numberDiff line numberDiff line change
@@ -217,18 +217,15 @@ class LazyValsTransform extends MiniPhaseTransform with IdentityDenotTransformer
217217
val compute = {
218218
val handlerSymbol = ctx.newSymbol(methodSymbol, "$anonfun".toTermName, Flags.Synthetic,
219219
MethodType(List("x$1".toTermName), List(defn.ThrowableType), defn.IntType))
220-
221-
val handler = Closure(handlerSymbol, {
222-
args =>
223-
val exception = args.head.head
224-
val complete = setFlagState.appliedTo(thiz, offset, initState, Literal(Constant(ord)))
225-
Block(List(complete), Throw(exception))
226-
})
220+
val caseSymbol = ctx.newSymbol(methodSymbol, nme.DEFAULT_EXCEPTION_NAME, Flags.Synthetic, defn.ThrowableType)
221+
val complete = setFlagState.appliedTo(thiz, offset, initState, Literal(Constant(ord)))
222+
val handler = CaseDef(Bind(caseSymbol, ref(caseSymbol)), EmptyTree,
223+
Block(List(complete), Throw(ref(caseSymbol))
224+
))
227225

228226
val compute = Assign(ref(resultSymbol), rhs)
229-
val tr = Try(compute, handler, EmptyTree)
227+
val tr = Try(compute, List(handler), EmptyTree)
230228
val assign = Assign(ref(target), ref(resultSymbol))
231-
val complete = setFlagState.appliedTo(thiz, offset, computedState, Literal(Constant(ord)))
232229
val noRetry = Assign(ref(retrySymbol), Literal(Constants.Constant(false)))
233230
val body = If(casFlag.appliedTo(thiz, offset, ref(flagSymbol), computeState, Literal(Constant(ord))),
234231
Block(tr :: assign :: complete :: noRetry :: Nil, Literal(Constant(()))),

src/dotty/tools/dotc/transform/PatternMatcher.scala

+10-7
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class PatternMatcher extends MiniPhaseTransform with DenotTransformer {thisTrans
5050

5151
override def transformMatch(tree: Match)(implicit ctx: Context, info: TransformerInfo): Tree = {
5252
val translated = new Translator()(ctx).translator.translateMatch(tree)
53+
5354
translated.ensureConforms(tree.tpe)
5455
}
5556

@@ -778,10 +779,11 @@ class PatternMatcher extends MiniPhaseTransform with DenotTransformer {thisTrans
778779
// is this purely a type test, e.g. no outer check, no equality tests (used in switch emission)
779780
//def isPureTypeTest = renderCondition(pureTypeTestChecker)
780781

781-
def impliesBinderNonNull(binder: Symbol):Boolean =
782+
def impliesBinderNonNull(binder: Symbol): Boolean =
782783
// @odersky: scalac is able to infer in this method that nonNullImpliedByTestChecker.Result,
783784
// dotty instead infers type projection TreeMakers.this.TypeTestTreeMaker.TypeTestCondStrategy#Result
784785
// which in turn doesn't typecheck in this method. Can you please explain why?
786+
// dotty deviation
785787
renderCondition(nonNullImpliedByTestChecker(binder)).asInstanceOf[Boolean]
786788

787789
override def toString = "TT"+((expectedTp, testedBinder.name, nextBinderTp))
@@ -1136,7 +1138,11 @@ class PatternMatcher extends MiniPhaseTransform with DenotTransformer {thisTrans
11361138
* this could probably optimized... (but note that the matchStrategy must be solved for each nested patternmatch)
11371139
*/
11381140
def translateMatch(match_ : Match): Tree = {
1139-
val Match(selector, cases) = match_
1141+
val Match(sel, cases) = match_
1142+
1143+
val selectorTp = elimAnonymousClass(sel.tpe.widen/*withoutAnnotations*/)
1144+
1145+
val selectorSym = freshSym(sel.pos, selectorTp, "selector")
11401146

11411147
val (nonSyntheticCases, defaultOverride) = cases match {
11421148
case init :+ last if isSyntheticDefaultCase(last) => (init, Some(((scrut: Symbol) => last.body)))
@@ -1155,23 +1161,20 @@ class PatternMatcher extends MiniPhaseTransform with DenotTransformer {thisTrans
11551161

11561162
//val start = if (Statistics.canEnable) Statistics.startTimer(patmatNanos) else null
11571163

1158-
val selectorTp = elimAnonymousClass(selector.tpe.widen/*withoutAnnotations*/)
1159-
11601164
// when one of the internal cps-type-state annotations is present, strip all CPS annotations
11611165
///val origPt = removeCPSFromPt(match_.tpe)
11621166
// relevant test cases: pos/existentials-harmful.scala, pos/gadt-gilles.scala, pos/t2683.scala, pos/virtpatmat_exist4.scala
11631167
// pt is the skolemized version
11641168
val pt = match_.tpe.widen //repeatedToSeq(origPt)
11651169

11661170
// val packedPt = repeatedToSeq(typer.packedType(match_, context.owner))
1167-
val selectorSym = freshSym(selector.pos, selectorTp, "selector")
11681171
selectorSym.setFlag(Flags.SyntheticCase)
11691172

11701173
// pt = Any* occurs when compiling test/files/pos/annotDepMethType.scala with -Xexperimental
1171-
val combined = combineCases(selector, selectorSym, nonSyntheticCases map translateCase(selectorSym, pt), pt, ctx.owner, defaultOverride)
1174+
val combined = combineCases(sel, selectorSym, nonSyntheticCases map translateCase(selectorSym, pt), pt, ctx.owner, defaultOverride)
11721175

11731176
// if (Statistics.canEnable) Statistics.stopTimer(patmatNanos, start)
1174-
Block(List(ValDef(selectorSym,selector)), combined)
1177+
Block(List(ValDef(selectorSym, sel)), combined)
11751178
}
11761179

11771180
// return list of typed CaseDefs that are supported by the backend (typed/bind/wildcard)

src/dotty/tools/dotc/transform/TailRec.scala

+4-13
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,8 @@ class TailRec extends MiniPhaseTransform with DenotTransformer with FullParamete
156156
def noTailTransform(tree: Tree)(implicit c: Context): Tree =
157157
transform(tree, noTailContext)
158158

159-
160-
def noTailTransforms(trees: List[Tree])(implicit c: Context) =
161-
trees map (noTailTransform)
159+
def noTailTransforms[Tr <: Tree](trees: List[Tr])(implicit c: Context): List[Tr] =
160+
trees.map(noTailTransform).asInstanceOf[List[Tr]]
162161

163162
override def transform(tree: Tree)(implicit c: Context): Tree = {
164163
/* A possibly polymorphic apply to be considered for tail call transformation. */
@@ -232,26 +231,18 @@ class TailRec extends MiniPhaseTransform with DenotTransformer with FullParamete
232231
}
233232

234233
def rewriteTry(tree: Try): Try = {
235-
def transformHandlers(t: Tree): Tree = {
236-
t match {
237-
case Block(List((d: DefDef)), cl@Closure(Nil, _, EmptyTree)) =>
238-
val newDef = cpy.DefDef(d)(rhs = transform(d.rhs))
239-
Block(List(newDef), cl)
240-
case _ => assert(false, s"failed to deconstruct try handler ${t.show}"); ???
241-
}
242-
}
243234
if (tree.finalizer eq EmptyTree) {
244235
// SI-1672 Catches are in tail position when there is no finalizer
245236
tpd.cpy.Try(tree)(
246237
noTailTransform(tree.expr),
247-
transformHandlers(tree.handler),
238+
transformSub(tree.cases),
248239
EmptyTree
249240
)
250241
}
251242
else {
252243
tpd.cpy.Try(tree)(
253244
noTailTransform(tree.expr),
254-
noTailTransform(tree.handler),
245+
noTailTransforms(tree.cases),
255246
noTailTransform(tree.finalizer)
256247
)
257248
}

0 commit comments

Comments
 (0)