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%2Fexpressions%2FELet.java;h=7b7338a78e2f07efe17b4731a80b709c7635aa35;hp=bbbc25c4de4ed7e7841172fb44f96834c5a15b85;hb=a9f88c57e622d9ecf2732bd0278e0989dc0dfd5a;hpb=9a175feb652b2b7bba7afa540831b9076be3c10e diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELet.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELet.java old mode 100755 new mode 100644 index bbbc25c4d..7b7338a78 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELet.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELet.java @@ -1,257 +1,242 @@ -package org.simantics.scl.compiler.elaboration.expressions; - -import java.util.ArrayList; - -import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; -import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; -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.environment.Environment; -import org.simantics.scl.compiler.errors.Locations; -import org.simantics.scl.compiler.internal.codegen.references.BoundVar; -import org.simantics.scl.compiler.internal.codegen.references.IVal; -import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter; -import org.simantics.scl.compiler.internal.codegen.writer.RecursiveDefinitionWriter; -import org.simantics.scl.compiler.internal.elaboration.decomposed.DecomposedExpression; -import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator; -import org.simantics.scl.compiler.internal.elaboration.utils.StronglyConnectedComponents; -import org.simantics.scl.compiler.types.Type; -import org.simantics.scl.compiler.types.Types; -import org.simantics.scl.compiler.types.exceptions.MatchException; -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 ELet extends Expression { - public Assignment[] assignments; - public Expression in; - - public ELet(long loc, Assignment[] assignments, Expression in) { - super(loc); - this.assignments = assignments; - this.in = in; - } - - @Override - public void collectRefs(final TObjectIntHashMap allRefs, final TIntHashSet refs) { - for(Assignment assign : assignments) - assign.value.collectRefs(allRefs, refs); - in.collectRefs(allRefs, refs); - } - - @Override - public void collectVars(TObjectIntHashMap allVars, - TIntHashSet vars) { - for(Assignment assign : assignments) - assign.value.collectVars(allVars, vars); - in.collectVars(allVars, vars); - } - - @Override - protected void updateType() throws MatchException { - setType(in.getType()); - } - - /** - * Splits let - */ - @Override - public Expression simplify(SimplificationContext context) { - - // Simplify assignments - for(Assignment assignment : assignments) { - assignment.value = assignment.value.simplify(context); - } - - // Find strongly connected components - final TObjectIntHashMap allVars = new TObjectIntHashMap( - 2*assignments.length, 0.5f, -1); - - for(int i=0;i components = new ArrayList(Math.max(10, assignments.length)); - new StronglyConnectedComponents(assignments.length) { - @Override - protected int[] findDependencies(int u) { - TIntHashSet vars = new TIntHashSet(); - assignments[u].value.collectVars(allVars, vars); - if(vars.contains(u)) - isRecursive[u] = true; - return vars.toArray(); - } - - @Override - protected void reportComponent(int[] component) { - components.add(component); - } - - }.findComponents(); - - // Simplify in - Expression result = in.simplify(context); - - // Handle each component - for(int j=components.size()-1;j>=0;--j) { - int[] component = components.get(j); - boolean recursive = component.length > 1 || isRecursive[component[0]]; - if(recursive) { - Assignment[] cAssignments = new Assignment[component.length]; - for(int i=0;i vars) { - in.collectFreeVariables(vars); - for(Assignment assign : assignments) - assign.value.collectFreeVariables(vars); - for(Assignment assign : assignments) - assign.pattern.removeFreeVariables(vars); - } - - @Override - public Expression resolve(TranslationContext context) { - throw new InternalCompilerError("ELet should be already resolved."); - } - - @Override - public Expression replace(ReplaceContext context) { - Assignment[] newAssignments = new Assignment[assignments.length]; - for(int i=0;i effects) { - for(Assignment assignment : assignments) { - assignment.pattern.collectEffects(effects); - assignment.value.collectEffects(effects); - } - in.collectEffects(effects); - } - - @Override - public void setLocationDeep(long loc) { - if(location == Locations.NO_LOCATION) { - location = loc; - for(Assignment assignment : assignments) - assignment.setLocationDeep(loc); - in.setLocationDeep(loc); - } - } - - @Override - public void accept(ExpressionVisitor visitor) { - visitor.visit(this); - } - - @Override - public void forVariables(VariableProcedure procedure) { - for(Assignment assignment : assignments) - assignment.forVariables(procedure); - in.forVariables(procedure); - } - - @Override - public Expression accept(ExpressionTransformer transformer) { - return transformer.transform(this); - } - -} +package org.simantics.scl.compiler.elaboration.expressions; + +import java.util.ArrayList; + +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; +import org.simantics.scl.compiler.compilation.CompilationContext; +import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; +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.errors.Locations; +import org.simantics.scl.compiler.internal.codegen.references.BoundVar; +import org.simantics.scl.compiler.internal.codegen.references.IVal; +import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter; +import org.simantics.scl.compiler.internal.codegen.writer.RecursiveDefinitionWriter; +import org.simantics.scl.compiler.internal.elaboration.decomposed.DecomposedExpression; +import org.simantics.scl.compiler.internal.elaboration.utils.StronglyConnectedComponents; +import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.compiler.types.Types; +import org.simantics.scl.compiler.types.exceptions.MatchException; +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; + +/** + * Generated maily from EPreLet + */ +public class ELet extends Expression { + public Assignment[] assignments; + public Expression in; + + public ELet(long loc, Assignment[] assignments, Expression in) { + super(loc); + this.assignments = assignments; + this.in = in; + } + + @Override + public void collectVars(TObjectIntHashMap allVars, + TIntHashSet vars) { + for(Assignment assign : assignments) + assign.value.collectVars(allVars, vars); + in.collectVars(allVars, vars); + } + + @Override + protected void updateType() throws MatchException { + setType(in.getType()); + } + + /** + * Splits let + */ + @Override + public Expression simplify(SimplificationContext context) { + + // Simplify assignments + for(Assignment assignment : assignments) { + assignment.value = assignment.value.simplify(context); + } + + // Find strongly connected components + final TObjectIntHashMap allVars = new TObjectIntHashMap( + 2*assignments.length, 0.5f, -1); + + for(int i=0;i components = new ArrayList(Math.max(10, assignments.length)); + new StronglyConnectedComponents(assignments.length) { + @Override + protected int[] findDependencies(int u) { + TIntHashSet vars = new TIntHashSet(); + assignments[u].value.collectVars(allVars, vars); + if(vars.contains(u)) + isRecursive[u] = true; + return vars.toArray(); + } + + @Override + protected void reportComponent(int[] component) { + components.add(component); + } + + }.findComponents(); + + // Simplify in + Expression result = in.simplify(context); + + // Handle each component + for(int j=components.size()-1;j>=0;--j) { + int[] component = components.get(j); + boolean recursive = component.length > 1 || isRecursive[component[0]]; + if(recursive) { + Assignment[] cAssignments = new Assignment[component.length]; + for(int i=0;i vars) { + in.collectFreeVariables(vars); + for(Assignment assign : assignments) + assign.value.collectFreeVariables(vars); + for(Assignment assign : assignments) + assign.pattern.removeFreeVariables(vars); + } + + @Override + public Expression resolve(TranslationContext context) { + throw new InternalCompilerError("ELet should be already resolved."); + } + + @Override + public Expression replace(ReplaceContext context) { + Assignment[] newAssignments = new Assignment[assignments.length]; + for(int i=0;i effects) { + for(Assignment assignment : assignments) { + assignment.pattern.collectEffects(effects); + assignment.value.collectEffects(effects); + } + in.collectEffects(effects); + } + + @Override + public void setLocationDeep(long loc) { + if(location == Locations.NO_LOCATION) { + location = loc; + for(Assignment assignment : assignments) + assignment.setLocationDeep(loc); + in.setLocationDeep(loc); + } + } + + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + } + + @Override + public Expression accept(ExpressionTransformer transformer) { + return transformer.transform(this); + } + + @Override + public int getSyntacticFunctionArity() { + return in.getSyntacticFunctionArity(); + } + +}