summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2003-11-28 11:55:49 +0000
committerburaq <buraq@epfl.ch>2003-11-28 11:55:49 +0000
commit79c146cc2aa213f637158623705c2ee178dfa2ea (patch)
treefbd95fbb2675eff30bbca35cd4436ae43dd1522c
parent30dae675757e61142c796c8dea7b3f9ea19fb9c0 (diff)
downloadscala-79c146cc2aa213f637158623705c2ee178dfa2ea.tar.gz
scala-79c146cc2aa213f637158623705c2ee178dfa2ea.tar.bz2
scala-79c146cc2aa213f637158623705c2ee178dfa2ea.zip
moved some methods from PatternMatcher
-rw-r--r--sources/scalac/transformer/matching/PatternNode.java75
1 files changed, 74 insertions, 1 deletions
diff --git a/sources/scalac/transformer/matching/PatternNode.java b/sources/scalac/transformer/matching/PatternNode.java
index 03e73fda97..bace7d9ed9 100644
--- a/sources/scalac/transformer/matching/PatternNode.java
+++ b/sources/scalac/transformer/matching/PatternNode.java
@@ -23,7 +23,7 @@ public class PatternNode {
public PatternNode or;
public PatternNode and;
- public case Header(Tree selector, Header next);
+ public case Header(Tree selector, Header next) ;
public case Body(Tree.ValDef[][] bound, Tree[] guard, Tree[] body);
public case DefaultPat();
public case ConstrPat(Symbol casted);
@@ -95,6 +95,79 @@ public class PatternNode {
}
}
+ public final boolean isDefaultPat() {
+ switch( this ) {
+ case DefaultPat():
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /** returns true if
+ * p and q are equal (constructor | sequence) type tests, or
+ * "q matches" => "p matches"
+ */
+ public final boolean isSameAs( PatternNode q ) {
+ switch( this ) {
+ case ConstrPat(_):
+ switch (q) {
+ case ConstrPat(_):
+ return q.type.isSameAs( this.type );
+ }
+ return false;
+ case SequencePat(_, int plen):
+ switch (q) {
+ case SequencePat(_, int qlen):
+ return (plen == qlen) && q.type.isSameAs( this.type );
+ }
+ return false;
+ default:
+ return subsumes( q );
+ }
+ }
+
+ /** returns true if "q matches" => "p matches"
+ */
+ public final boolean subsumes( PatternNode q ) {
+ switch (this) {
+ case DefaultPat():
+ switch (q) {
+ case DefaultPat():
+ return true;
+ }
+ return false;
+ case ConstrPat(_):
+ switch (q) {
+ case ConstrPat(_):
+ return q.type.isSubType(this.type);
+ }
+ return false;
+ case SequencePat(_, int plen):
+ switch (q) {
+ case SequencePat(_, int qlen):
+ return (plen == qlen) && q.type.isSubType(this.type);
+ }
+ return false;
+ case ConstantPat(Object pval):
+ switch (q) {
+ case ConstantPat(Object qval):
+ return pval.equals(qval);
+ }
+ return false;
+ case VariablePat(Tree tree):
+ switch (q) {
+ case VariablePat(Tree other):
+ return (tree.symbol() != null) &&
+ (tree.symbol().kind != Kinds.NONE) &&
+ (tree.symbol().kind != Kinds.ERROR) &&
+ (tree.symbol() == other.symbol());
+ }
+ return false;
+ }
+ return false;
+ }
+
public String toString() {
switch (this) {
case Header(Tree selector, Header next):