diff options
-rw-r--r-- | sources/scalac/transformer/matching/TestRegTraverser.java | 60 |
1 files changed, 39 insertions, 21 deletions
diff --git a/sources/scalac/transformer/matching/TestRegTraverser.java b/sources/scalac/transformer/matching/TestRegTraverser.java index d7c5a6239f..6df9c486e2 100644 --- a/sources/scalac/transformer/matching/TestRegTraverser.java +++ b/sources/scalac/transformer/matching/TestRegTraverser.java @@ -17,30 +17,44 @@ import java.util.*; public class TestRegTraverser extends Traverser { boolean result = false; - Set variables = new HashSet(); + Set variables = new HashSet(); + static Set nilVariables = new HashSet(); public void traverse(Tree tree) { if (!result) - switch (tree) { - case Alternative(_): - result = true; - break; - case Bind(_, Tree pat): - variables.add(tree.symbol()); - traverse(pat); - break; - case Ident(_): - Symbol symbol = tree.symbol(); - if ((symbol != Global.instance.definitions.PATTERN_WILDCARD) && - variables.contains(symbol)) - result = true; - break; - case CaseDef(Tree pat, _, _): - traverse(pat); - break; - default: - super.traverse( tree ); - } + switch (tree) { + case Alternative(_): + result = true; + break; + case Bind(_, Tree pat): + if( TreeInfo.isEmptySequence( pat ) ) { + // annoying special case: b@() [or b@(()|()) after normalization] + //System.err.println("bindin empty "+tree.symbol()); + nilVariables.add(tree.symbol()); + } else { + variables.add(tree.symbol()); + } + traverse(pat); + break; + case Ident(_): + Symbol symbol = tree.symbol(); + if ((symbol != Global.instance.definitions.PATTERN_WILDCARD) && + variables.contains(symbol)) + result = true; + break; + case CaseDef(Tree pat, _, _): + traverse(pat); + break; + + case Sequence( Tree[] trees): + //result = true; + traverse( trees ); + result = true; + break; + + default: + super.traverse( tree ); + } } public static boolean apply(Tree t) { @@ -49,4 +63,8 @@ public class TestRegTraverser extends Traverser { //System.err.println("TestRegTraverser says "+t+" -> "+trt.result); return trt.result; } + + public static Set getNilVariables() { + return nilVariables; + } } |