Verified Commit 12512076 authored by Amin Bandali's avatar Amin Bandali
Browse files

Don’t add built-in signatures

parent 7fa1cc14
...@@ -2,6 +2,10 @@ package org.aminb.alloy.catalyst; ...@@ -2,6 +2,10 @@ package org.aminb.alloy.catalyst;
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Optional;
import edu.mit.csail.sdg.alloy4.Pos; import edu.mit.csail.sdg.alloy4.Pos;
import edu.mit.csail.sdg.ast.Decl; import edu.mit.csail.sdg.ast.Decl;
...@@ -29,22 +33,27 @@ import edu.mit.csail.sdg.ast.VisitReturn; ...@@ -29,22 +33,27 @@ import edu.mit.csail.sdg.ast.VisitReturn;
*/ */
public class SSRVisitor extends VisitReturn { public class SSRVisitor extends VisitReturn {
// if come to var that's not used in a join field access, toss out its sig?
Set<PrimSig> builtins =
/** new HashSet<>(Arrays.asList(Sig.UNIV, Sig.SIGINT, Sig.SEQIDX,
* new plan: Sig.STRING, Sig.NONE, Sig.GHOST));
*
* - gather list of candidate sigs in visit(Sig)
* - all but those who a field of their own or another sig refers to them
* - if in visit(ExprBinary) we detect a "field access" dot join involving
* a sig, let it remain on the list if it is
* - how about ExprQt? when to disallow those that are quantified over?
* - any other cases where it should be allowed?
* - otherwise, remove sig from candidates
*/
Map<PrimSig, Boolean> candidates = new HashMap<>(); Map<PrimSig, Boolean> candidates = new HashMap<>();
Optional<Boolean> putCandidate(PrimSig sig, Boolean viable) {
if (!builtins.contains(sig))
return Optional.of(candidates.put(sig, viable));
else
return Optional.empty();
}
Optional<Boolean> putCandidateIfAbsent(PrimSig sig, Boolean viable) {
if (!builtins.contains(sig))
return Optional.of(candidates.putIfAbsent(sig, viable));
else
return Optional.empty();
}
PrimSig getFirstPrimSig(Expr e) { PrimSig getFirstPrimSig(Expr e) {
return return
e.type() // :: Type e.type() // :: Type
...@@ -73,7 +82,7 @@ public class SSRVisitor extends VisitReturn { ...@@ -73,7 +82,7 @@ public class SSRVisitor extends VisitReturn {
if (x.op == ExprBinary.Op.JOIN) if (x.op == ExprBinary.Op.JOIN)
if (x.left instanceof ExprUnary && x.right instanceof ExprUnary) if (x.left instanceof ExprUnary && x.right instanceof ExprUnary)
if (!isFieldAccess(x)) if (!isFieldAccess(x))
candidates.put(getFirstPrimSig(x.left), false); putCandidate(getFirstPrimSig(x.left), false);
visitThis(x.left); visitThis(x.left);
visitThis(x.right); visitThis(x.right);
return null; return null;
...@@ -133,7 +142,7 @@ public class SSRVisitor extends VisitReturn { ...@@ -133,7 +142,7 @@ public class SSRVisitor extends VisitReturn {
Expr subsub = getUnarySub(getUnarySub(s)); Expr subsub = getUnarySub(getUnarySub(s));
if (subsub instanceof PrimSig) if (subsub instanceof PrimSig)
if (((PrimSig)subsub).getFieldDecls().size() > 1) if (((PrimSig)subsub).getFieldDecls().size() > 1)
candidates.put((PrimSig)subsub, false); putCandidate((PrimSig)subsub, false);
} }
} }
else if (s instanceof PrimSig) else if (s instanceof PrimSig)
...@@ -190,7 +199,7 @@ public class SSRVisitor extends VisitReturn { ...@@ -190,7 +199,7 @@ public class SSRVisitor extends VisitReturn {
public Object visit(Sig x) { public Object visit(Sig x) {
// add the sig as a candidate if we haven't seen it before // add the sig as a candidate if we haven't seen it before
if (x instanceof PrimSig) if (x instanceof PrimSig)
candidates.putIfAbsent((PrimSig)x, true); putCandidateIfAbsent((PrimSig)x, true);
return null; return null;
} }
...@@ -204,7 +213,7 @@ public class SSRVisitor extends VisitReturn { ...@@ -204,7 +213,7 @@ public class SSRVisitor extends VisitReturn {
// after first column // after first column
for (ProductType t : x.type()) for (ProductType t : x.type())
for (int i = 1; i < t.arity(); i++) for (int i = 1; i < t.arity(); i++)
candidates.put(t.get(i), false); putCandidate(t.get(i), false);
// TODO: if type of field refers to another field, in this sig // TODO: if type of field refers to another field, in this sig
// or elsewhere, if there are no multiplicity constraints then // or elsewhere, if there are no multiplicity constraints then
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment