summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2005-02-21 16:50:17 +0000
committerburaq <buraq@epfl.ch>2005-02-21 16:50:17 +0000
commitbd9b58dd62bc03e38f09a0f66fba82fbcb886da5 (patch)
treef1cdda01995ea37e9407a4b473337a6bc6949fbf
parent12b7df185bc916a5193e550c2357d5f93be890c8 (diff)
downloadscala-bd9b58dd62bc03e38f09a0f66fba82fbcb886da5.tar.gz
scala-bd9b58dd62bc03e38f09a0f66fba82fbcb886da5.tar.bz2
scala-bd9b58dd62bc03e38f09a0f66fba82fbcb886da5.zip
fixed bug
-rw-r--r--sources/scala/tools/scalac/transformer/matching/PatternMatcher.scala30
1 files changed, 20 insertions, 10 deletions
diff --git a/sources/scala/tools/scalac/transformer/matching/PatternMatcher.scala b/sources/scala/tools/scalac/transformer/matching/PatternMatcher.scala
index 0c9ec02ae7..f731648124 100644
--- a/sources/scala/tools/scalac/transformer/matching/PatternMatcher.scala
+++ b/sources/scala/tools/scalac/transformer/matching/PatternMatcher.scala
@@ -253,6 +253,7 @@ class PatternMatcher(unit: CompilationUnit) extends PatternTool(unit) {
protected def patternNode(tree:Tree , header:Header , env: CaseEnv ): PatternNode = {
//Console.println("patternNode("+tree+","+header+")");
+ //Console.println("tree.getType()"+tree.getType());
tree.match {
case Bind(name, Typed(Ident(Names.PATTERN_WILDCARD), tpe)) => // x@_:Type
if(header.getTpe().isSubType(tpe.getType())) {
@@ -296,9 +297,14 @@ class PatternMatcher(unit: CompilationUnit) extends PatternTool(unit) {
((fn.symbol().flags & Modifiers.CASE) != 0))) {
mk.VariablePat(tree.pos, tree);
}
- else
+ else {
+ /*
+ Console.println("apply but not seqApply");
+ Console.println("tree.getType()="+tree.getType());
+ Console.println("tree.symbol()="+tree.symbol());
+ */
mk.ConstrPat(tree.pos, tree.getType());
-
+ }
case t @ Typed(ident, tpe) => // variable pattern
val doTest = header.getTpe().isSubType(tpe.getType());
val node = {
@@ -341,6 +347,7 @@ class PatternMatcher(unit: CompilationUnit) extends PatternTool(unit) {
case Sequence(ts) =>
if ( !delegateSequenceMatching ) {
+ //throw new ApplicationError("cannot happen:"+tree);
mk.SequencePat(tree.pos, tree.getType(), ts.length);
} else {
mk.SeqContainerPat(tree.pos, tree.getType(), tree);
@@ -894,14 +901,17 @@ class PatternMatcher(unit: CompilationUnit) extends PatternTool(unit) {
toTree(node.and)),
toTree(node.or, selector.duplicate()));
case SequencePat(casted, len) =>
- return gen.If(cf.And(gen.mkIsInstanceOf(selector.duplicate(), node.getTpe()),
- cf.Equals(gen.mkApply__(gen.Select(gen.mkAsInstanceOf(selector.duplicate(), node.getTpe()),
- defs.SEQ_LENGTH())),
- gen.mkIntLit(selector.pos, len))),
- gen.mkBlock(gen.ValDef(casted,
- gen.mkAsInstanceOf(selector.duplicate(), node.getTpe())),
- toTree(node.and)),
- toTree(node.or, selector.duplicate()));
+ return
+ cf.Or(
+ cf.And(
+ cf.And(gen.mkIsInstanceOf(selector.duplicate(), node.getTpe()),
+ cf.Equals(gen.mkApply__(gen.Select(gen.mkAsInstanceOf(selector.duplicate(), node.getTpe()),
+ defs.SEQ_LENGTH())),
+ gen.mkIntLit(selector.pos, len))),
+ gen.mkBlock(gen.ValDef(casted,
+ gen.mkAsInstanceOf(selector.duplicate(), node.getTpe())),
+ toTree(node.and))),
+ toTree(node.or, selector.duplicate()));
case ConstantPat(value) =>
return gen.If(cf.Equals(selector.duplicate(),
gen.Literal(selector.pos, value)),