import org.simantics.scl.compiler.elaboration.expressions.ERecord;
import org.simantics.scl.compiler.elaboration.expressions.Expression;
import org.simantics.scl.compiler.elaboration.expressions.Variable;
-import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
import org.simantics.scl.compiler.elaboration.expressions.records.FieldAssignment;
import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
}
public void resolve(TranslationContext context) {
+ if(relation == SpecialCHRRelation.ASSIGN) {
+ parameters[1] = parameters[1].resolve(context);
+ parameters[0] = parameters[0].resolveAsPattern(context);
+ return;
+ }
+ if(parameters != null) {
+ for(int i=0;i<parameters.length;++i)
+ parameters[i] = parameters[i].resolve(context);
+ }
if(relation instanceof UnresolvedCHRRelation) {
UnresolvedCHRRelation unresolved = (UnresolvedCHRRelation)relation;
CHRConstraint constraint = context.resolveCHRConstraint(unresolved.name);
if(sclRelation != null)
relation = new ExternalCHRRelation(sclRelation);
else {
+ if(unresolved.name.contains(".")) {
+ context.getErrorLog().log(unresolved.location, "Couldn't resolve relation " + unresolved.name + ".");
+ return;
+ }
if(parameters == null) {
context.getErrorLog().log(location, "Relation must be declared if record syntax is used.");
return;
}
fields = null;
}
- else {
- for(int i=0;i<parameters.length;++i)
- parameters[i] = parameters[i].resolve(context);
- }
- }
-
- public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
- for(Expression parameter : parameters)
- parameter.collectRefs(allRefs, refs);
- if(typeConstraintEvidenceParameters != null)
- for(Expression parameter : typeConstraintEvidenceParameters)
- parameter.collectRefs(allRefs, refs);
}
public void checkType(TypingContext context) {
parameters[0] = parameters[0].checkIgnoredType(context);
typeConstraintEvidenceParameters = Expression.EMPTY_ARRAY;
}
+ else if(relation == SpecialCHRRelation.ASSIGN) {
+ parameters[1] = parameters[1].inferType(context);
+ parameters[0] = parameters[0].checkTypeAsPattern(context, parameters[1].getType());
+ typeConstraintEvidenceParameters = Expression.EMPTY_ARRAY;
+ }
else {
TVar[] typeVariables = relation.getTypeVariables();
typeParameters = typeVariables.length == 0 ? Type.EMPTY_ARRAY : new Type[typeVariables.length];
parameter.collectVars(allVars, vars);
}
- public void forVariables(VariableProcedure procedure) {
- for(Expression parameter : parameters)
- parameter.forVariables(procedure);
- if(typeConstraintEvidenceParameters != null)
- for(Expression parameter : typeConstraintEvidenceParameters)
- parameter.forVariables(procedure);
- }
-
public void collectFreeVariables(THashSet<Variable> vars) {
- for(Expression parameter : parameters)
- parameter.collectFreeVariables(vars);
- if(typeConstraintEvidenceParameters != null)
- for(Expression parameter : typeConstraintEvidenceParameters)
+ if(relation == SpecialCHRRelation.ASSIGN) {
+ parameters[1].collectFreeVariables(vars);
+ }
+ else {
+ for(Expression parameter : parameters)
parameter.collectFreeVariables(vars);
+ if(typeConstraintEvidenceParameters != null)
+ for(Expression parameter : typeConstraintEvidenceParameters)
+ parameter.collectFreeVariables(vars);
+ }
}
public void setLocationDeep(long loc) {
}
public void collectQueryEffects(THashSet<Type> effects) {
+ // TODO
}
public void collectEnforceEffects(THashSet<Type> effects) {
+ // TODO
}
}