diff options
author | buraq <buraq@epfl.ch> | 2003-10-29 14:24:49 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2003-10-29 14:24:49 +0000 |
commit | f381bdba78f74f5baa41c597bc5f1cffef4c290c (patch) | |
tree | 54302ce655fe23146302efcd927ec4493be4ed6b /sources/scalac | |
parent | 05e2b718cd6ec1a375df4c51107f06c1d6dd74b6 (diff) | |
download | scala-f381bdba78f74f5baa41c597bc5f1cffef4c290c.tar.gz scala-f381bdba78f74f5baa41c597bc5f1cffef4c290c.tar.bz2 scala-f381bdba78f74f5baa41c597bc5f1cffef4c290c.zip |
fixed bug196 with a wild hack
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/transformer/TransMatch.java | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/sources/scalac/transformer/TransMatch.java b/sources/scalac/transformer/TransMatch.java index 814a52ac19..4cea1d9770 100644 --- a/sources/scalac/transformer/TransMatch.java +++ b/sources/scalac/transformer/TransMatch.java @@ -89,11 +89,27 @@ public class TransMatch extends OwnerTransformer { protected Tree transform(Tree root, CaseDef[] cases, Type restpe) { boolean containsReg = false; int i = 0; - while(!containsReg && (i < cases.length)) - containsReg = TestRegTraverser.apply(cases[i++]); + while (i < cases.length) { + containsReg = TestRegTraverser.apply(cases[i]) || containsReg; + Set nilvars = TestRegTraverser.getNilVariables(); + if(!nilvars.isEmpty()) { + //System.err.println("nilvars present"); + Tree[] newBody = new Tree[ nilvars.size() + 1 ]; + int j=0; + for( Iterator it = nilvars.iterator(); it.hasNext(); ) { + Symbol v = (Symbol) it.next(); + newBody[ j++ ] = unit.global.treeGen.ValDef(v, + unit.global.treeGen.Nil(cases[i].pos)); + } + newBody[ newBody.length - 1 ] = cases[i].body; + cases[i].body = unit.global.treeGen.mkBlock( newBody ); + } + i++; + } + if (containsReg) { - AlgebraicMatcher am = new AlgebraicMatcher( unit ); - Matcher matcher = new Matcher( currentOwner, root, restpe ); + AlgebraicMatcher am = new AlgebraicMatcher( unit ); + Matcher matcher = new Matcher( currentOwner, root, restpe ); am.construct( matcher, cases ); return matcher.tree; } else { |