]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java
Merge "Remove unused import in DeleteHandler"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / CHRLiteral.java
1 package org.simantics.scl.compiler.elaboration.chr;\r
2 \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
22 \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
26 \r
27 public class CHRLiteral extends Symbol {\r
28     \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
35     \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
42     }\r
43 \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
50                 passive = false;\r
51             }\r
52             else {\r
53                 SCLRelation sclRelation = context.resolveRelation(unresolved.location, unresolved.name);\r
54                 if(sclRelation != null)\r
55                     relation = new ExternalCHRRelation(sclRelation);\r
56                 else {\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
64                     passive = false;\r
65                     //context.getErrorLog().log(unresolved.location, "Couldn't resolve constraint " + unresolved.name + ".");\r
66                 }\r
67             }\r
68         }\r
69         for(int i=0;i<parameters.length;++i)\r
70             parameters[i] = parameters[i].resolve(context);\r
71     }\r
72 \r
73     public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {\r
74         for(Expression parameter : parameters)\r
75             parameter.collectRefs(allRefs, refs);\r
76     }\r
77 \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
83         }\r
84         else {\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
92             else\r
93                 for(int i=0;i<parameters.length;++i)\r
94                     parameters[i] = parameters[i].checkType(context, parameterTypes[i]);\r
95         }\r
96     }\r
97 \r
98     public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {\r
99         for(Expression parameter : parameters)\r
100             parameter.collectVars(allVars, vars);\r
101     }\r
102 \r
103     public void forVariables(VariableProcedure procedure) {\r
104         for(Expression parameter : parameters)\r
105             parameter.forVariables(procedure);\r
106     }\r
107 \r
108     public void collectFreeVariables(THashSet<Variable> vars) {\r
109         for(Expression parameter : parameters)\r
110             parameter.collectFreeVariables(vars);\r
111     }\r
112 \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
118         }\r
119     }\r
120     \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
124     }\r
125     \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
131     }\r
132 \r
133     public void collectQueryEffects(THashSet<Type> effects) {\r
134     }\r
135 \r
136     public void collectEnforceEffects(THashSet<Type> effects) {\r
137     }\r
138 }\r