From 49c96f1526f41555cdab460975d2e8a22b984f48 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Thu, 3 Jul 2014 19:03:41 +0200 Subject: [PATCH] Better Node API, cleaner code --- reactor/.idea/copyright/profiles_settings.xml | 4 +- .../src/jetbrains/mps/unification/Node.java | 7 ++++ .../src/jetbrains/mps/unification/Term.java | 2 +- .../mps/unification/Unification.java | 22 +++++----- .../jetbrains/mps/unification/MockNode.java | 40 +++++++++++++++++++ 5 files changed, 60 insertions(+), 15 deletions(-) diff --git a/reactor/.idea/copyright/profiles_settings.xml b/reactor/.idea/copyright/profiles_settings.xml index a2c74e8e..4c0f48ac 100644 --- a/reactor/.idea/copyright/profiles_settings.xml +++ b/reactor/.idea/copyright/profiles_settings.xml @@ -1,5 +1,3 @@ - - - + \ No newline at end of file diff --git a/reactor/code/src/jetbrains/mps/unification/Node.java b/reactor/code/src/jetbrains/mps/unification/Node.java index a676d434..a878d1b7 100644 --- a/reactor/code/src/jetbrains/mps/unification/Node.java +++ b/reactor/code/src/jetbrains/mps/unification/Node.java @@ -24,4 +24,11 @@ package jetbrains.mps.unification; */ public interface Node { + boolean isTerm(); + + Term term(); + + boolean isVar(); + + Var var(); } diff --git a/reactor/code/src/jetbrains/mps/unification/Term.java b/reactor/code/src/jetbrains/mps/unification/Term.java index 1c95f0fd..e727eb1f 100644 --- a/reactor/code/src/jetbrains/mps/unification/Term.java +++ b/reactor/code/src/jetbrains/mps/unification/Term.java @@ -27,6 +27,6 @@ public interface Term extends Node { Object symbol(); - Collection children(); + Collection children(); } diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index 6de3ebea..fa92dfd7 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -56,11 +56,11 @@ public class Unification { Node zs = getSchema(s); Node zt = getSchema(t); - if (zs instanceof Term && zt instanceof Term) { - if (eq(((Term)zs).symbol(), ((Term)zt).symbol())) { + if (zs.isTerm() && zt.isTerm()) { + if (eq(zs.term().symbol(), zt.term().symbol())) { union(s, t); - Iterator scit = ((Term) zs).children().iterator(); - Iterator tcit = ((Term) zt).children().iterator(); + Iterator scit = zs.term().children().iterator(); + Iterator tcit = zt.term().children().iterator(); while(scit.hasNext() && tcit.hasNext()) { if (!unifClosure(scit.next(), tcit.next())) return false; } @@ -83,9 +83,9 @@ public class Unification { union(t, s); return; } - if (ssize == tsize && s instanceof Var && t instanceof Var) { + if (ssize == tsize && s.isVar() && t.isVar()) { // ensure proper order of variables in the substitution - if(((Var)s).compareTo((Var)t) < 0) { + if(s.var().compareTo(t.var()) < 0) { union(t, s); return; } @@ -95,7 +95,7 @@ public class Unification { setSize(s, ssize + tsize); appendVars(s, getVars(t)); - if (getSchema(s) instanceof Var) { + if (getSchema(s).isVar()) { setSchema(s, getSchema(t)); } setRepresentative(t, s); @@ -130,10 +130,10 @@ public class Unification { if (isAcyclic(z)) return substitution; // not part of a cycle if (isVisited(z)) return FAILED_SUBSTITUTION; // there exists a cycle - if (z instanceof Term) { + if (z.isTerm()) { setVisited(z, true); - for (Node c : ((Term) z).children()) { + for (Node c : z.term().children()) { substitution = findSolution(c, substitution); if (!substitution.isSuccessful()) return substitution; } @@ -182,7 +182,7 @@ public class Unification { private List getVars(Node n) { if (!hasData(n)) { - return n instanceof Term ? Collections.emptyList() : Collections.singletonList((Var) n); + return n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.var()); } return getData(n).myVars; } @@ -237,7 +237,7 @@ public class Unification { Data(Node n) { myClass = n; mySchema = n; - myVars = n instanceof Term ? Collections.emptyList() : Collections.singletonList((Var) n); + myVars = n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.var()); } } } diff --git a/reactor/tests/src/jetbrains/mps/unification/MockNode.java b/reactor/tests/src/jetbrains/mps/unification/MockNode.java index cc5b966b..82e1ad34 100644 --- a/reactor/tests/src/jetbrains/mps/unification/MockNode.java +++ b/reactor/tests/src/jetbrains/mps/unification/MockNode.java @@ -43,6 +43,26 @@ public abstract class MockNode implements Node { this.myChildren = Arrays.asList(children); } + @Override + public boolean isTerm() { + return true; + } + + @Override + public boolean isVar() { + return false; + } + + @Override + public Term term() { + return this; + } + + @Override + public Var var() { + throw new IllegalStateException(); + } + @Override public Object symbol() { return mySymbol; @@ -93,6 +113,26 @@ public abstract class MockNode implements Node { return myName; } + @Override + public boolean isTerm() { + return false; + } + + @Override + public boolean isVar() { + return true; + } + + @Override + public Term term() { + throw new IllegalStateException(); + } + + @Override + public Var var() { + return this; + } + @Override public String toString() { return String.valueOf(myName);