1 package org.simantics.scl.compiler.elaboration.chr;
\r
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
\r
4 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
\r
5 import org.simantics.scl.compiler.elaboration.chr.relations.ExternalCHRRelation;
\r
6 import org.simantics.scl.compiler.elaboration.chr.relations.SpecialCHRRelation;
\r
7 import org.simantics.scl.compiler.elaboration.chr.relations.UnresolvedCHRRelation;
\r
8 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
\r
9 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
\r
10 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
\r
11 import org.simantics.scl.compiler.elaboration.expressions.Expression;
\r
12 import org.simantics.scl.compiler.elaboration.expressions.Variable;
\r
13 import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
\r
14 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
\r
15 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
\r
16 import org.simantics.scl.compiler.errors.Locations;
\r
17 import org.simantics.scl.compiler.internal.parsing.Symbol;
\r
18 import org.simantics.scl.compiler.types.TVar;
\r
19 import org.simantics.scl.compiler.types.Type;
\r
20 import org.simantics.scl.compiler.types.Types;
\r
21 import org.simantics.scl.compiler.types.kinds.Kinds;
\r
23 import gnu.trove.map.hash.TObjectIntHashMap;
\r
24 import gnu.trove.set.hash.THashSet;
\r
25 import gnu.trove.set.hash.TIntHashSet;
\r
27 public class CHRLiteral extends Symbol {
\r
29 public CHRRelation relation;
\r
30 public Type[] typeParameters;
\r
31 public Expression[] parameters;
\r
32 public boolean killAfterMatch;
\r
33 public boolean negated;
\r
34 public boolean passive = true;
\r
36 public CHRLiteral(long location, CHRRelation relation, Expression[] parameters, boolean remove, boolean negated) {
\r
37 this.location = location;
\r
38 this.relation = relation;
\r
39 this.parameters = parameters;
\r
40 this.killAfterMatch = remove;
\r
41 this.negated = negated;
\r
44 public void resolve(TranslationContext context) {
\r
45 if(relation instanceof UnresolvedCHRRelation) {
\r
46 UnresolvedCHRRelation unresolved = (UnresolvedCHRRelation)relation;
\r
47 CHRConstraint constraint = context.resolveCHRConstraint(unresolved.name);
\r
48 if(constraint != null) {
\r
49 relation = constraint;
\r
53 SCLRelation sclRelation = context.resolveRelation(unresolved.location, unresolved.name);
\r
54 if(sclRelation != null)
\r
55 relation = new ExternalCHRRelation(sclRelation);
\r
57 Type[] parameterTypes = new Type[parameters.length];
\r
58 for(int i=0;i<parameterTypes.length;++i)
\r
59 parameterTypes[i] = Types.metaVar(Kinds.STAR);
\r
60 constraint = new CHRConstraint(location, unresolved.name, parameterTypes);
\r
61 constraint.implicitlyDeclared = true;
\r
62 context.newCHRConstraint(constraint.name, constraint);
\r
63 relation = constraint;
\r
65 //context.getErrorLog().log(unresolved.location, "Couldn't resolve constraint " + unresolved.name + ".");
\r
69 for(int i=0;i<parameters.length;++i)
\r
70 parameters[i] = parameters[i].resolve(context);
\r
73 public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
\r
74 for(Expression parameter : parameters)
\r
75 parameter.collectRefs(allRefs, refs);
\r
78 public void checkType(TypingContext context) {
\r
79 if(relation == SpecialCHRRelation.EXECUTE) {
\r
80 if(parameters.length != 1)
\r
81 throw new InternalCompilerError("Wrong number of parameters for EXECUTE constraint.");
\r
82 parameters[0] = parameters[0].checkIgnoredType(context);
\r
85 TVar[] typeVariables = relation.getTypeVariables();
\r
86 typeParameters = typeVariables.length == 0 ? Type.EMPTY_ARRAY : new Type[typeVariables.length];
\r
87 for(int i=0;i<typeVariables.length;++i)
\r
88 typeParameters[i] = Types.metaVar(typeVariables[i].getKind());
\r
89 Type[] parameterTypes = Types.replace(relation.getParameterTypes(), typeVariables, typeParameters);
\r
90 if(parameterTypes.length != parameters.length)
\r
91 context.getErrorLog().log(location, "Constraint is applied with wrong number of parameters");
\r
93 for(int i=0;i<parameters.length;++i)
\r
94 parameters[i] = parameters[i].checkType(context, parameterTypes[i]);
\r
98 public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
\r
99 for(Expression parameter : parameters)
\r
100 parameter.collectVars(allVars, vars);
\r
103 public void forVariables(VariableProcedure procedure) {
\r
104 for(Expression parameter : parameters)
\r
105 parameter.forVariables(procedure);
\r
108 public void collectFreeVariables(THashSet<Variable> vars) {
\r
109 for(Expression parameter : parameters)
\r
110 parameter.collectFreeVariables(vars);
\r
113 public void setLocationDeep(long loc) {
\r
114 if(location == Locations.NO_LOCATION) {
\r
115 this.location = loc;
\r
116 for(Expression parameter : parameters)
\r
117 parameter.setLocationDeep(loc);
\r
121 public void simplify(SimplificationContext context) {
\r
122 for(int i=0;i<parameters.length;++i)
\r
123 parameters[i] = parameters[i].simplify(context);
\r
126 public String toString() {
\r
127 StringBuilder b = new StringBuilder();
\r
128 ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
\r
129 visitor.visit(this);
\r
130 return b.toString();
\r
133 public void collectQueryEffects(THashSet<Type> effects) {
\r
136 public void collectEnforceEffects(THashSet<Type> effects) {
\r