diff options
author | buraq <buraq@epfl.ch> | 2003-11-28 11:55:49 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2003-11-28 11:55:49 +0000 |
commit | 79c146cc2aa213f637158623705c2ee178dfa2ea (patch) | |
tree | fbd95fbb2675eff30bbca35cd4436ae43dd1522c | |
parent | 30dae675757e61142c796c8dea7b3f9ea19fb9c0 (diff) | |
download | scala-79c146cc2aa213f637158623705c2ee178dfa2ea.tar.gz scala-79c146cc2aa213f637158623705c2ee178dfa2ea.tar.bz2 scala-79c146cc2aa213f637158623705c2ee178dfa2ea.zip |
moved some methods from PatternMatcher
-rw-r--r-- | sources/scalac/transformer/matching/PatternNode.java | 75 |
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): |