diff options
author | Burak Emir <emir@epfl.ch> | 2006-07-12 14:30:47 +0000 |
---|---|---|
committer | Burak Emir <emir@epfl.ch> | 2006-07-12 14:30:47 +0000 |
commit | bafe0251286459b2b2259eba1a7d6dabf1c41f72 (patch) | |
tree | 5a44dc0f6fa2f0d2325c02e1a4b7e70a17b10993 /src | |
parent | 4080a760cb70b131a6e932cb93a75a7bea4c725e (diff) | |
download | scala-bafe0251286459b2b2259eba1a7d6dabf1c41f72.tar.gz scala-bafe0251286459b2b2259eba1a7d6dabf1c41f72.tar.bz2 scala-bafe0251286459b2b2259eba1a7d6dabf1c41f72.zip |
more fix, more optimization
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/matching/PatternMatchers.scala | 23 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/matching/TransMatcher.scala | 46 |
2 files changed, 45 insertions, 24 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala index cee49c7df5..91dcf5d69b 100644 --- a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala +++ b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala @@ -177,29 +177,6 @@ trait PatternMatchers requires (TransMatcher with PatternNodes) extends AnyRef w res } - /** returns true if apply is a "sequence apply". analyzer inserts Sequence nodes if something is a - * - * - last update: discussion with Martin 2005-02-18 - * - * - if true, tree.fn must be ignored. The analyzer ensures that the selector will be a subtype - * of fn; it thus assigns the expected type from the context (which is surely a subtype, - * but may have different flags etc. - * - * - so should be - * (( tree.args.length == 1 ) && tree.args(0).isInstanceOf[Sequence]) - * but fails - */ - protected def isSeqApply( tree: Apply ): Boolean = { - // Console.print("isSeqApply? "+tree.toString()); - // val res = - tree match { - case Apply(_, List(ArrayValue(_,_))) => (tree.tpe.symbol.flags & Flags.CASE) == 0 - case _ => false; - } - //Console.println(res); - //res; - } - /* currently no need for extendedSeqApply, ArrayValue in Elem(... _*) style patterns * handled in the ArrayValue case protected def isExtendedSeqApply( tree: Apply ): Boolean = { // NEW diff --git a/src/compiler/scala/tools/nsc/matching/TransMatcher.scala b/src/compiler/scala/tools/nsc/matching/TransMatcher.scala index 4d85f50772..73a625fe16 100644 --- a/src/compiler/scala/tools/nsc/matching/TransMatcher.scala +++ b/src/compiler/scala/tools/nsc/matching/TransMatcher.scala @@ -30,6 +30,7 @@ with RightTracers { import definitions._ import posAssigner.atPos import typer.typed + import symtab.Flags val phaseName = "transmatcher" @@ -125,6 +126,29 @@ with RightTracers { generatedVars } + /** returns true if apply is a "sequence apply". analyzer inserts Sequence nodes if something is a + * + * - last update: discussion with Martin 2005-02-18 + * + * - if true, tree.fn must be ignored. The analyzer ensures that the selector will be a subtype + * of fn; it thus assigns the expected type from the context (which is surely a subtype, + * but may have different flags etc. + * + * - so should be + * (( tree.args.length == 1 ) && tree.args(0).isInstanceOf[Sequence]) + * but fails + */ + protected def isSeqApply( tree: Apply ): Boolean = { + // Console.print("isSeqApply? "+tree.toString()); + // val res = + tree match { + case Apply(_, List(ArrayValue(_,_))) => (tree.tpe.symbol.flags & Flags.CASE) == 0 + case _ => false; + } + //Console.println(res); + //res; + } + /** a casedef with sequence subpatterns like * * case ..x @ ().. => body @@ -219,7 +243,8 @@ with RightTracers { //case ArrayValue( tt, List(b @ Bind(id, Star(wc @ Ident(nme.WILDCARD))))) => - case Apply(fn, List(pat2@ ArrayValue( tt, List(b @ Bind(id, Star(wc @ Ident(nme.WILDCARD))))))) => + // a pattern of the form List(foo@_*) + case app @ Apply(fn, List(pat2@ ArrayValue( tt, List(b @ Bind(id, Star(wc @ Ident(nme.WILDCARD))))))) if isSeqApply(app) => //Console.println("OPTIMIZING") //Console.println(pat) //Console.println(pat.tpe) @@ -237,6 +262,25 @@ with RightTracers { //Console.println(res) res + // a pattern of the form MyCaseConstructor(foo@_*) + case app @ Apply(fn, List(pat2@ ArrayValue( tt, List(b @ Bind(id, Star(wc @ Ident(nme.WILDCARD))))))) => + //Console.println("OPTIMIZING") + //Console.println(pat) + //Console.println(pat.tpe) + //Console.println(tt.tpe) + //Console.println("b.tpe "+b.tpe+" widened"+b.tpe.widen) + //Console.println("b.symbol.tpe "+b.symbol.tpe+" widened"+b.symbol.tpe.widen) + //Console.println("pat2.tpe "+pat2.tpe+" widened"+pat2.tpe.widen) + val tpe1:Type = pat2.tpe.widen.baseType( definitions.SeqClass ).typeArgs(0) + + val tpe = appliedType(definitions.SeqClass.typeConstructor, List(tpe1)) + b.symbol.setInfo(tpe) + b.setType(tpe) + val res = copy.Apply(pat, fn, List(copy.Bind(b, id, wc))) + //Console.println("====>") + //Console.println(res) + res + case av @ ArrayValue(s, trees) => if (isRightIgnoring(av)) pat else copy.ArrayValue(pat, s, (trees map { isRegular1 })) |