X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fexpressions%2Flist%2FListSeq.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fexpressions%2Flist%2FListSeq.java;h=c5affbf96fbdf97fb699ca9ae42aa35479598727;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java new file mode 100755 index 000000000..c5affbf96 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java @@ -0,0 +1,115 @@ +package org.simantics.scl.compiler.elaboration.expressions.list; + +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; +import gnu.trove.set.hash.TIntHashSet; + +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.errors.Locations; +import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator; +import org.simantics.scl.compiler.types.Type; + +public class ListSeq extends ListQualifier { + public ListQualifier a; + public ListQualifier b; + + public ListSeq(ListQualifier a, ListQualifier b) { + this.a = a; + this.b = b; + } + + @Override + public void checkType(TypingContext context) { + a.checkType(context); + b.checkType(context); + } + + @Override + public void collectRefs(TObjectIntHashMap allRefs, + TIntHashSet refs) { + a.collectRefs(allRefs, refs); + b.collectRefs(allRefs, refs); + } + + @Override + public void collectVars(TObjectIntHashMap allVars, + TIntHashSet vars) { + a.collectVars(allVars, vars); + b.collectVars(allVars, vars); + } + + @Override + public void collectFreeVariables(THashSet vars) { + b.collectFreeVariables(vars); + a.collectFreeVariables(vars); + } + + @Override + public CompiledQualifier compile(SimplificationContext context) { + CompiledQualifier cA = a.compile(context); + CompiledQualifier cB = b.compile(context); + + Variable x = new Variable("xTemp", cA.pattern.getType()); + Variable y = new Variable("yTemp", cB.pattern.getType()); + + Expression value = context.concatMap( + context.lambda(context.var(x), context.mapList( + context.lambda(context.var(y), context.tuple(context.var(x), context.var(y))), + context.match(context.var(x), cA.pattern, cB.value))), + cA.value); + /*try { + value.validateType(context.getEnvironment()); + } catch (TypeValidationException e) { + e.printStackTrace(); + }*/ + return new CompiledQualifier(value, context.tuple(cA.pattern, cB.pattern)); + } + + @Override + public void resolve(TranslationContext context) { + a.resolve(context); + b.resolve(context); + } + + @Override + public void decorate(ExpressionDecorator decorator) { + a.decorate(decorator); + b.decorate(decorator); + } + + @Override + public void collectEffects(THashSet effects) { + a.collectEffects(effects); + b.collectEffects(effects); + } + + @Override + public void setLocationDeep(long loc) { + if(location == Locations.NO_LOCATION) { + location = loc; + a.setLocationDeep(loc); + b.setLocationDeep(loc); + } + } + + @Override + public void accept(ListQualifierVisitor visitor) { + visitor.visit(this); + } + + @Override + public void forVariables(VariableProcedure procedure) { + a.forVariables(procedure); + b.forVariables(procedure); + } + + @Override + public ListQualifier accept(ListQualifierTransformer transformer) { + return transformer.transform(this); + } +}