summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Typers.scala
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2011-10-20 22:29:09 +0000
committerAdriaan Moors <adriaan.moors@epfl.ch>2011-10-20 22:29:09 +0000
commit8394676c1e47838922a1c99850592c5c86510a65 (patch)
tree93bf15862718ab385150653f0b3ce6ce48fa675d /src/compiler/scala/tools/nsc/typechecker/Typers.scala
parentd5b81b6cb1f3880a791118609c2d308c34c075f2 (diff)
downloadscala-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/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala44
1 files changed, 24 insertions, 20 deletions
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)