package org.simantics.scl.compiler.elaboration.chr; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint; import org.simantics.scl.compiler.elaboration.chr.relations.ExternalCHRRelation; import org.simantics.scl.compiler.elaboration.chr.relations.SpecialCHRRelation; import org.simantics.scl.compiler.elaboration.chr.relations.UnresolvedCHRRelation; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext.ExistentialFrame; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; 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; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.parsing.Symbol; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.kinds.Kinds; import gnu.trove.map.hash.TObjectIntHashMap; import gnu.trove.set.hash.THashSet; import gnu.trove.set.hash.TIntHashSet; public class CHRLiteral extends Symbol { public CHRRelation relation; public Type[] typeParameters; public Expression[] parameters; public FieldAssignment[] fields; // optional public Expression[] typeConstraintEvidenceParameters; public boolean killAfterMatch; public boolean negated; public boolean passive = true; public CHRLiteral(long location, CHRRelation relation, Expression[] parameters, boolean remove, boolean negated) { this.location = location; this.relation = relation; this.parameters = parameters; this.killAfterMatch = remove; this.negated = negated; } public void resolve(TranslationContext context) { if(relation instanceof UnresolvedCHRRelation) { UnresolvedCHRRelation unresolved = (UnresolvedCHRRelation)relation; CHRConstraint constraint = context.resolveCHRConstraint(unresolved.name); if(constraint != null) { relation = constraint; passive = false; } else { SCLRelation sclRelation = context.resolveRelation(unresolved.location, unresolved.name); if(sclRelation != null) relation = new ExternalCHRRelation(sclRelation); else { if(parameters == null) { context.getErrorLog().log(location, "Relation must be declared if record syntax is used."); return; } Type[] parameterTypes = new Type[parameters.length]; for(int i=0;i 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) { if(relation == SpecialCHRRelation.EXECUTE) { if(parameters.length != 1) throw new InternalCompilerError("Wrong number of parameters for EXECUTE constraint."); parameters[0] = parameters[0].checkIgnoredType(context); typeConstraintEvidenceParameters = Expression.EMPTY_ARRAY; } else { TVar[] typeVariables = relation.getTypeVariables(); typeParameters = typeVariables.length == 0 ? Type.EMPTY_ARRAY : new Type[typeVariables.length]; for(int i=0;i allVars, TIntHashSet vars) { for(Expression parameter : parameters) parameter.collectVars(allVars, vars); if(typeConstraintEvidenceParameters != null) for(Expression parameter : typeConstraintEvidenceParameters) 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 vars) { for(Expression parameter : parameters) parameter.collectFreeVariables(vars); if(typeConstraintEvidenceParameters != null) for(Expression parameter : typeConstraintEvidenceParameters) parameter.collectFreeVariables(vars); } public void setLocationDeep(long loc) { if(location == Locations.NO_LOCATION) { this.location = loc; for(Expression parameter : parameters) parameter.setLocationDeep(loc); } } public void simplify(SimplificationContext context) { for(int i=0;i effects) { } public void collectEnforceEffects(THashSet effects) { } }