summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2003-07-04 12:16:52 +0000
committerburaq <buraq@epfl.ch>2003-07-04 12:16:52 +0000
commit94cc5fb3985236c6a7a1ef7af7450c49648e06a9 (patch)
treea9a7419b6311ee5667ff320a3896ef012c73377f /sources
parent05d7f7c3b53dbd18251f64037ecbc5b49a762ff6 (diff)
downloadscala-94cc5fb3985236c6a7a1ef7af7450c49648e06a9.tar.gz
scala-94cc5fb3985236c6a7a1ef7af7450c49648e06a9.tar.bz2
scala-94cc5fb3985236c6a7a1ef7af7450c49648e06a9.zip
collect variables from patterns
Diffstat (limited to 'sources')
-rw-r--r--sources/scalac/transformer/matching/CollectVariableTraverser.java35
-rw-r--r--sources/scalac/transformer/matching/VariableTraverser.java61
2 files changed, 96 insertions, 0 deletions
diff --git a/sources/scalac/transformer/matching/CollectVariableTraverser.java b/sources/scalac/transformer/matching/CollectVariableTraverser.java
new file mode 100644
index 0000000000..5223bdee46
--- /dev/null
+++ b/sources/scalac/transformer/matching/CollectVariableTraverser.java
@@ -0,0 +1,35 @@
+package scalac.transformer.matching ;
+
+import scalac.util.Name ;
+import scalac.ast.Tree ;
+import scalac.symtab.Symbol ;
+
+import java.util.Vector;
+
+class CollectVariableTraverser extends VariableTraverser {
+
+ Vector vars;
+
+ boolean isVariableName( Name name ) {
+ return ( name.toString().indexOf("$") == -1 )
+ && super.isVariableName( name );
+ }
+
+
+ void handleVariableSymbol( Symbol sym ) {
+ vars.add( sym );
+ }
+
+ public CollectVariableTraverser() {
+ this.vars = new Vector();
+ }
+
+ static boolean containsBinding( Tree pat ) {
+
+ CollectVariableTraverser cvt = new CollectVariableTraverser();
+ cvt.traverse( pat );
+ return !cvt.vars.isEmpty();
+
+ }
+
+}
diff --git a/sources/scalac/transformer/matching/VariableTraverser.java b/sources/scalac/transformer/matching/VariableTraverser.java
new file mode 100644
index 0000000000..d03e2a05e2
--- /dev/null
+++ b/sources/scalac/transformer/matching/VariableTraverser.java
@@ -0,0 +1,61 @@
+package scalac.transformer.matching ;
+
+
+import scalac.ast.Tree;
+import scalac.util.Name;
+import scalac.symtab.Symbol ;
+import scalac.ast.Traverser ;
+
+import Tree.Ident;
+import Tree.Bind;
+
+
+abstract class VariableTraverser extends Traverser {
+
+ boolean isVariableName( Name name ) {
+ return ( name.isVariable() ) && ( name != Name.fromString("_") ) ;
+
+ }
+
+ boolean isVariableSymbol( Symbol sym ) {
+ return ( sym != null )&&( !sym.isPrimaryConstructor() );
+ }
+
+ abstract void handleVariableSymbol( Symbol sym ) ;
+
+ public VariableTraverser() {
+ super();
+ }
+
+
+ public void traverse(Tree tree) {
+ switch (tree) {
+ case Ident(Name name):
+ Symbol sym;
+
+ if( isVariableName( name )
+ && isVariableSymbol( sym = tree.symbol() ) )
+ handleVariableSymbol( sym );
+
+ return;
+
+ case Bind(Name name, Tree subtree):
+ Symbol sym;
+
+ if( isVariableName( name )
+ && isVariableSymbol( sym = tree.symbol() ))
+ handleVariableSymbol( sym );
+
+ traverse( subtree );
+
+ return;
+
+ case Select(_,_):
+ return;
+ default:
+ super.traverse( tree );
+ }
+ }
+
+
+}