Skip to content
Permalink
Browse files

un-cps expected type in translateMatch

... where it belongs, instead of in MatchTransformer
  • Loading branch information
adriaanm committed May 2, 2012
1 parent 9df576d commit 89d069792717c206da21abecf3f825756182f465
Showing with 12 additions and 15 deletions.
  1. +12 −15 src/compiler/scala/tools/nsc/typechecker/PatternMatching.scala
@@ -40,7 +40,6 @@ trait PatternMatching extends Transform with TypingTransformers with ast.TreeDSL
// SymbolTable. If we had DOT this would not be an issue
import global._ // the global environment
import definitions._ // standard classes and methods
import CODE._

val phaseName: String = "patmat"

@@ -60,19 +59,9 @@ trait PatternMatching extends Transform with TypingTransformers with ast.TreeDSL
class MatchTransformer(unit: CompilationUnit) extends TypingTransformer(unit) {
override def transform(tree: Tree): Tree = tree match {
case Match(sel, cases) =>
val selX = transform(sel)
val casesX = transformTrees(cases).asInstanceOf[List[CaseDef]]

val origTp = tree.tpe
val matchX = treeCopy.Match(tree, selX, casesX)

// when one of the internal cps-type-state annotations is present, strip all CPS annotations
// a cps-type-state-annotated type makes no sense as an expected type (matchX.tpe is used as pt in translateMatch)
// (only test availability of MarkerCPSAdaptPlus assuming they are either all available or none of them are)
if (MarkerCPSAdaptPlus != NoSymbol && (stripTriggerCPSAnns exists tree.tpe.hasAnnotation))
matchX modifyType removeCPSAdaptAnnotations

localTyper.typed(translator.translateMatch(matchX)) setType origTp
// setType origTp intended for CPS -- TODO: is it necessary?
localTyper.typed(translator.translateMatch(treeCopy.Match(tree, transform(sel), transformTrees(cases).asInstanceOf[List[CaseDef]]))) setType origTp
case Try(block, catches, finalizer) =>
treeCopy.Try(tree, transform(block), translator.translateTry(transformTrees(catches).asInstanceOf[List[CaseDef]], tree.tpe, tree.pos), transform(finalizer))
case _ => super.transform(tree)
@@ -190,13 +179,21 @@ trait PatternMatching extends Transform with TypingTransformers with ast.TreeDSL
}

val selectorTp = repeatedToSeq(elimAnonymousClass(selector.tpe.widen.withoutAnnotations))
val pt0 = match_.tpe

val origPt = match_.tpe
// when one of the internal cps-type-state annotations is present, strip all CPS annotations
// a cps-type-state-annotated type makes no sense as an expected type (matchX.tpe is used as pt in translateMatch)
// (only test availability of MarkerCPSAdaptPlus assuming they are either all available or none of them are)
val ptUnCPS =
if (MarkerCPSAdaptPlus != NoSymbol && (stripTriggerCPSAnns exists origPt.hasAnnotation))
removeCPSAdaptAnnotations(origPt)
else origPt

// we've packed the type for each case in typedMatch so that if all cases have the same existential case, we get a clean lub
// here, we should open up the existential again
// relevant test cases: pos/existentials-harmful.scala, pos/gadt-gilles.scala, pos/t2683.scala, pos/virtpatmat_exist4.scala
// TODO: fix skolemizeExistential (it should preserve annotations, right?)
val pt = repeatedToSeq(pt0.skolemizeExistential(context.owner, context.tree) withAnnotations pt0.annotations)
val pt = repeatedToSeq(ptUnCPS.skolemizeExistential(context.owner, context.tree) withAnnotations ptUnCPS.annotations)

// the alternative to attaching the default case override would be to simply
// append the default to the list of cases and suppress the unreachable case error that may arise (once we detect that...)

0 comments on commit 89d0697

Please sign in to comment.
You can’t perform that action at this time.