From 92305277cda52cd70b71c1fc55f1d647aacf7d71 Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Tue, 16 Dec 2014 19:04:45 +0100 Subject: Provide a simple implementation of transformTry for backend. Will need to revisit it later in order to generate faster code. --- src/dotty/tools/dotc/transform/PatternMatcher.scala | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'src/dotty/tools/dotc/transform/PatternMatcher.scala') diff --git a/src/dotty/tools/dotc/transform/PatternMatcher.scala b/src/dotty/tools/dotc/transform/PatternMatcher.scala index bebe996b9..763421ea5 100644 --- a/src/dotty/tools/dotc/transform/PatternMatcher.scala +++ b/src/dotty/tools/dotc/transform/PatternMatcher.scala @@ -9,7 +9,7 @@ import core.Symbols._ import core.Types._ import core.Constants._ import core.StdNames._ -import dotty.tools.dotc.ast.{TreeTypeMap, tpd} +import dotty.tools.dotc.ast.{untpd, TreeTypeMap, tpd} import dotty.tools.dotc.core import dotty.tools.dotc.core.DenotTransformers.DenotTransformer import dotty.tools.dotc.core.Phases.Phase @@ -52,6 +52,19 @@ class PatternMatcher extends MiniPhaseTransform with DenotTransformer {thisTrans translated.ensureConforms(tree.tpe) } + + override def transformTry(tree: tpd.Try)(implicit ctx: Context, info: TransformerInfo): tpd.Tree = { + val selector = + ctx.newSymbol(ctx.owner, ctx.freshName("ex").toTermName, Flags.Synthetic, defn.ThrowableType, coord = tree.pos) + val sel = Ident(selector.termRef).withPos(tree.pos) + val rethrow = tpd.CaseDef(sel, EmptyTree, Throw(ref(selector))) + val newCases = tpd.CaseDef( + Bind(selector,untpd.Ident(nme.WILDCARD).withPos(tree.pos).withType(selector.info)), + EmptyTree, + transformMatch(tpd.Match(sel, tree.cases ::: rethrow :: Nil))) + cpy.Try(tree)(tree.expr, newCases :: Nil, tree.finalizer) + } + class Translator(implicit ctx: Context) { def translator = { -- cgit v1.2.3