X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fchr%2FCHRLiteral.java;h=eb0f48b20414aa35baa74b4bd0fe743f35a7ba8a;hb=3e457239db8dd214a3a10c74c2ecefa0f0f8dd1a;hp=be34361c24ecdca939c654b9302257648655fd92;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java index be34361c2..eb0f48b20 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java @@ -7,11 +7,13 @@ 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; @@ -21,7 +23,6 @@ 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 { @@ -29,6 +30,8 @@ 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; @@ -42,6 +45,15 @@ public class CHRLiteral extends Symbol { } 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 allRefs, TIntHashSet refs) { - for(Expression parameter : parameters) - parameter.collectRefs(allRefs, refs); + if(parameters == null && fields != null) { + String[] fieldNames = relation.getFieldNames(); + if(fieldNames == null) { + context.getErrorLog().log(location, "Relation " + relation + " does not define field names."); + return; + } + parameters = ERecord.translateFieldsToFunctionParameters(context, fields, fieldNames); + if(parameters == null) + return; + for(int i=0;i allVars, TIntHashSet vars) { for(Expression parameter : parameters) parameter.collectVars(allVars, vars); - } - - public void forVariables(VariableProcedure procedure) { - for(Expression parameter : parameters) - parameter.forVariables(procedure); - } - - public void collectFreeVariables(THashSet vars) { - for(Expression parameter : parameters) - parameter.collectFreeVariables(vars); + if(typeConstraintEvidenceParameters != null) + for(Expression parameter : typeConstraintEvidenceParameters) + parameter.collectVars(allVars, vars); } public void setLocationDeep(long loc) { @@ -121,6 +158,9 @@ public class CHRLiteral extends Symbol { public void simplify(SimplificationContext context) { for(int i=0;i effects) { - } - - public void collectEnforceEffects(THashSet effects) { - } }