X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fchr%2FCHRLiteral.java;h=7b4a5bc26b1c7afb59addb97fa91d93985d7cc39;hp=597ee9d9c9dda82f7ab4fbedb31b751d5d3c00a7;hb=1ec0193a5a5b8f368b03adb24acd762838ddf8ea;hpb=cb5fc8d606d8b322563e9345c441eecfa7f01753 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 597ee9d9c..7b4a5bc26 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 @@ -1,138 +1,190 @@ -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.TypingContext; -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.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 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 { - Type[] parameterTypes = new Type[parameters.length]; - for(int i=0;i allRefs, TIntHashSet refs) { - for(Expression parameter : parameters) - 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); - } - 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); - } - - public void forVariables(VariableProcedure procedure) { - for(Expression parameter : parameters) - parameter.forVariables(procedure); - } - - public void collectFreeVariables(THashSet vars) { - for(Expression parameter : parameters) - 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) { - } -} +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) { + } +}