diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2011-10-20 22:29:09 +0000 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2011-10-20 22:29:09 +0000 |
commit | 8394676c1e47838922a1c99850592c5c86510a65 (patch) | |
tree | 93bf15862718ab385150653f0b3ce6ce48fa675d /src | |
parent | d5b81b6cb1f3880a791118609c2d308c34c075f2 (diff) | |
download | scala-8394676c1e47838922a1c99850592c5c86510a65.tar.gz scala-8394676c1e47838922a1c99850592c5c86510a65.tar.bz2 scala-8394676c1e47838922a1c99850592c5c86510a65.zip |
setting the stage for the virtualizing pattern ...
setting the stage for the virtualizing pattern matcher no actual changes
though
no review
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/UnCurry.scala | 19 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 44 |
2 files changed, 34 insertions, 29 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index b15f73887a..ad95adea92 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -266,21 +266,22 @@ abstract class UnCurry extends InfoTransform val m = anonClass.newMethod(fun.pos, nme.isDefinedAt) setFlag FINAL m setInfo MethodType(m newSyntheticValueParams formals, BooleanClass.tpe) anonClass.info.decls enter m - - val Match(selector, cases) = fun.body val vparam = fun.vparams.head.symbol val idparam = m.paramss.head.head val substParam = new TreeSymSubstituter(List(vparam), List(idparam)) def substTree[T <: Tree](t: T): T = substParam(resetLocalAttrs(t)) - def transformCase(cdef: CaseDef): CaseDef = - substTree(CaseDef(cdef.pat.duplicate, cdef.guard.duplicate, Literal(Constant(true)))) - def defaultCase = CaseDef(Ident(nme.WILDCARD), EmptyTree, Literal(Constant(false))) + DefDef(m, (fun.body: @unchecked) match { + case Match(selector, cases) => + def transformCase(cdef: CaseDef): CaseDef = + substTree(CaseDef(cdef.pat.duplicate, cdef.guard.duplicate, Literal(Constant(true)))) + def defaultCase = CaseDef(Ident(nme.WILDCARD), EmptyTree, Literal(Constant(false))) - DefDef(m, gen.mkUncheckedMatch( - if (cases exists treeInfo.isDefaultCase) Literal(Constant(true)) - else Match(substTree(selector.duplicate), (cases map transformCase) :+ defaultCase) - )) + gen.mkUncheckedMatch( + if (cases exists treeInfo.isDefaultCase) Literal(Constant(true)) + else Match(substTree(selector.duplicate), (cases map transformCase) :+ defaultCase) + ) + }) } val members = diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index b68b4d708e..c2dd1ba6a2 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -3265,6 +3265,29 @@ trait Typers extends Modes with Adaptations { } } + def typedMatch(tree: Tree, selector: Tree, cases: List[CaseDef]): Tree = { + if (selector == EmptyTree) { + val arity = if (isFunctionType(pt)) pt.normalize.typeArgs.length - 1 else 1 + val params = for (i <- List.range(0, arity)) yield + atPos(tree.pos.focusStart) { + ValDef(Modifiers(PARAM | SYNTHETIC), + unit.freshTermName("x" + i + "$"), TypeTree(), EmptyTree) + } + val ids = for (p <- params) yield Ident(p.name) + val selector1 = atPos(tree.pos.focusStart) { if (arity == 1) ids.head else gen.mkTuple(ids) } + val body = treeCopy.Match(tree, selector1, cases) + typed1(atPos(tree.pos) { Function(params, body) }, mode, pt) + } else { + val selector1 = checkDead(typed(selector, EXPRmode | BYVALmode, WildcardType)) + var cases1 = typedCases(tree, cases, selector1.tpe.widen, pt) + val (owntype, needAdapt) = ptOrLub(cases1 map (_.tpe)) + if (needAdapt) { + cases1 = cases1 map (adaptCase(_, owntype)) + } + treeCopy.Match(tree, selector1, cases1) setType owntype + } + } + def typedReturn(expr: Tree) = { val enclMethod = context.enclMethod if (enclMethod == NoContext || @@ -4097,26 +4120,7 @@ trait Typers extends Modes with Adaptations { typedIf(cond, thenp, elsep) case tree @ Match(selector, cases) => - if (selector == EmptyTree) { - val arity = if (isFunctionType(pt)) pt.normalize.typeArgs.length - 1 else 1 - val params = for (i <- List.range(0, arity)) yield - atPos(tree.pos.focusStart) { - ValDef(Modifiers(PARAM | SYNTHETIC), - unit.freshTermName("x" + i + "$"), TypeTree(), EmptyTree) - } - val ids = for (p <- params) yield Ident(p.name) - val selector1 = atPos(tree.pos.focusStart) { if (arity == 1) ids.head else gen.mkTuple(ids) } - val body = treeCopy.Match(tree, selector1, cases) - typed1(atPos(tree.pos) { Function(params, body) }, mode, pt) - } else { - val selector1 = checkDead(typed(selector, EXPRmode | BYVALmode, WildcardType)) - var cases1 = typedCases(tree, cases, selector1.tpe.widen, pt) - val (owntype, needAdapt) = ptOrLub(cases1 map (_.tpe)) - if (needAdapt) { - cases1 = cases1 map (adaptCase(_, owntype)) - } - treeCopy.Match(tree, selector1, cases1) setType owntype - } + typedMatch(tree, selector, cases) case Return(expr) => typedReturn(expr) |