]> gerrit.simantics Code Review - simantics/platform.git/commitdiff
(refs #7375) Replaced ExpressionDecorator by ExpressionTransformer 37/737/1
authorHannu Niemistö <hannu.niemisto@semantum.fi>
Fri, 21 Jul 2017 08:00:46 +0000 (11:00 +0300)
committerHannu Niemistö <hannu.niemisto@semantum.fi>
Fri, 21 Jul 2017 08:00:46 +0000 (11:00 +0300)
Change-Id: I4396a632a63902afd38065834d9c96c159bba9c1

57 files changed:
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/equation/EqBasic.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/equation/EqGuard.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/equation/Equation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ASTExpression.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Assignment.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Case.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/DecoratingExpression.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EAmbiguous.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApply.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApplyType.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EAsPattern.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBind.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ECHRRuleset.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ECHRRulesetConstructor.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ECHRSelect.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EConstant.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EEnforce.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EEquations.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EError.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EExternalConstant.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EFieldAccess.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EGetConstraint.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EIf.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EIntegerLiteral.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELambda.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELambdaType.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELet.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EListComprehension.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EListLiteral.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ELiteral.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EMatch.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EPlaceholder.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERealLiteral.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERuleset.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESelect.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLambda.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ESimpleLet.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETransformation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ETypeAnnotation.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EVariable.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EViewPattern.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EWhen.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Expression.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/GuardedExpression.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/GuardedExpressionGroup.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/StandardExpressionTransformer.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/ExpressionAccessor.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/accessor/FieldAccessor.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListAssignment.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGenerator.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListGuard.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListQualifier.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListThen.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/utils/ExpressionDecorator.java [deleted file]
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionEvaluator.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ToplevelEffectDecorator.java

index 80d2a7578f216e9a364c3491d3476f9ac49566e2..121166f6b893ad1d1c84198681de0d2c552a81ac 100644 (file)
@@ -7,7 +7,6 @@ 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;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
@@ -49,12 +48,6 @@ public class EqBasic extends Equation {
         right.collectFreeVariables(vars);
     }
 
-    @Override
-    public void decorate(ExpressionDecorator decorator) {
-        left = left.decorate(decorator);
-        right = right.decorate(decorator);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         left.collectEffects(effects);
index c8bf5c12024ff43219f93447dd52b04039f5c95e..bbd46413974827c683c7b3591db3b4382a78dfa2 100644 (file)
@@ -7,7 +7,6 @@ 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;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
@@ -44,11 +43,6 @@ public class EqGuard extends Equation {
         guard.collectFreeVariables(vars);
     }
 
-    @Override
-    public void decorate(ExpressionDecorator decorator) {
-        guard = guard.decorate(decorator);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         guard.collectEffects(effects);
index dbd22037ff8425f7685996ff67d6cac4500c3af5..34ef7539515dafdbacb5b0a9d459d117fc822359 100644 (file)
@@ -5,7 +5,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
 import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.parsing.Symbol;
 import org.simantics.scl.compiler.types.Type;
 
@@ -20,7 +19,6 @@ public abstract class Equation extends Symbol {
 
     public abstract void forVariables(VariableProcedure procedure);
     public abstract void collectFreeVariables(THashSet<Variable> vars);
-    public abstract void decorate(ExpressionDecorator decorator);
     public abstract void collectEffects(THashSet<Type> effects);
     public abstract void checkType(TypingContext context);
     public abstract void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs);
index 02db9bdec3356e18d151a92bc342acefa8cc8831..a853dfff6731f9309699b822fce6fec5d3d5999a 100644 (file)
@@ -4,7 +4,6 @@ import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
 
@@ -43,11 +42,6 @@ public abstract class ASTExpression extends SimplifiableExpression {
         throw new InternalCompilerError(getClass().getSimpleName() + " does not support updateType.");
     }
     
-    @Override
-    final public Expression decorate(ExpressionDecorator decorator) {
-        throw new InternalCompilerError(getClass().getSimpleName() + " does not support decorate.");
-    }
-    
     @Override
     final public void collectEffects(THashSet<Type> effects) {
         throw new InternalCompilerError(getClass().getSimpleName() + " does not support collectEffects.");
index 7cc70aaa77bed69f6328ce0a5055f884301f201b..04b70deb0ac47042e38732a7e831afd16a418555 100644 (file)
@@ -1,7 +1,6 @@
 package org.simantics.scl.compiler.elaboration.expressions;
 
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 
 public class Assignment {
@@ -25,11 +24,6 @@ public class Assignment {
         return new Assignment(newPattern, newValue);
     }
 
-    public void decorate(ExpressionDecorator decorator) {
-        pattern = pattern.decorate(decorator);
-        value = value.decorate(decorator);
-    }
-
     public void setLocationDeep(long loc) {
         pattern.setLocationDeep(loc);
         value.setLocationDeep(loc);
index 4a34cebcf4b283dbc146b111f6c7e9d5474e097a..3765fbefc1a78bfc7be8e23f811619b6cbfa3eea 100644 (file)
@@ -5,7 +5,6 @@ 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.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.parsing.Symbol;
 import org.simantics.scl.compiler.types.Type;
 
@@ -110,12 +109,6 @@ public class Case extends Symbol {
             patterns[i] = patterns[i].checkTypeAsPattern(context, parameterTypes[i]);
         value = value.checkIgnoredType(context);
     }
-        
-    public void decorate(ExpressionDecorator decorator) {
-        for(int i=0;i<patterns.length;++i)
-            patterns[i] = patterns[i].decorate(decorator);
-        value = value.decorate(decorator);
-    }
 
     public void forVariables(VariableProcedure procedure) {
         value.forVariables(procedure);
index 3d2031ee5af6154cb9a1f89b071358a4c91410b3..5d91fbc3c63c474882ef371d4f1776b9a4c16fae 100644 (file)
@@ -12,7 +12,6 @@ import org.simantics.scl.compiler.elaboration.expressions.lhstype.LhsType;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
 
@@ -88,12 +87,6 @@ public abstract class DecoratingExpression extends SimplifiableExpression {
         return expression.getFunctionDefinitionPatternArity();
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        expression = expression.decorate(decorator);
-        return this;
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         expression.collectEffects(effects);
index 6121a57b19d66d4480bc5eec74b1da13bff55b33..09cbcf25bf2557e5f48d82a04ae494455684008a 100644 (file)
@@ -6,7 +6,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.ErrorLog;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Skeletons;
 import org.simantics.scl.compiler.types.TMetaVar;
 import org.simantics.scl.compiler.types.Type;
@@ -189,11 +188,6 @@ public class EAmbiguous extends SimplifiableExpression {
             location = loc;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return this;
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         // TODO Auto-generated method stub
index c7bce466759d62eaf154c4a0a415b634249903cf..2b488068d547108d0341950bd71968463cd6ce75 100644 (file)
@@ -19,7 +19,6 @@ import org.simantics.scl.compiler.elaboration.modules.SCLValue;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IApply;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.internal.interpreted.IListLiteral;
@@ -303,16 +302,6 @@ public class EApply extends Expression {
             return new ESimpleLet(location, null, this, new ELiteral(NoRepConstant.PUNIT));
         return this;
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        if(decorator.decorateSubstructure(this)) {
-            function = function.decorate(decorator);
-            for(int i=0;i<parameters.length;++i)
-                parameters[i] = parameters[i].decorate(decorator);
-        }
-        return decorator.decorate(this);
-    }
     
     public Type getLocalEffect() {
         return effect;
index d07b6d13bc17d6f6702c2ca7050f9e0916c69272..e7a9d42468bc19f8068128e2d93a5ed9f8084c25 100644 (file)
@@ -9,7 +9,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
 import org.simantics.scl.compiler.types.Type;
@@ -111,12 +110,6 @@ public class EApplyType extends Expression {
     public Expression inferType(TypingContext context) {
         throw new InternalCompilerError("Should not type check " + getClass().getSimpleName() + ".");
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        expression = expression.decorate(decorator);
-        return decorator.decorate(this);
-    }
     
     @Override
     public boolean isEffectful() {
index 62cea76d8fbcfc8e7d8b3591f1d529fc7c0e010b..305d5309307bb059ef8dcb11eb5efce69ba3a547 100644 (file)
@@ -9,7 +9,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
 
@@ -109,12 +108,6 @@ public class EAsPattern extends Expression {
         var.setType(pattern.getType());
         return this;
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        pattern = pattern.decorate(decorator);
-        return decorator.decorate(this);
-    }
     
     @Override
     public Expression replace(ReplaceContext context) {
index d950e7b738eb07124ae4e6549437c7b9ffb7dfb1..196ddc90fbc2423d72f22b8c675db70972e5c680 100644 (file)
@@ -9,7 +9,6 @@ import org.simantics.scl.compiler.elaboration.modules.SCLValue;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -138,14 +137,6 @@ public class EBind extends SimplifiableExpression {
         return this; 
     }
     
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        pattern = pattern.decorate(decorator);
-        value = value.decorate(decorator);
-        in = in.decorate(decorator);
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         pattern.collectEffects(effects);
index 65ce2e2df974ab28587a537eb75bb7657652e4c9..2f87719306901bde69636d1206a33efdea077acd 100644 (file)
@@ -8,7 +8,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
 import org.simantics.scl.compiler.types.Type;
@@ -84,11 +83,6 @@ public class ECHRRuleset extends Expression {
         }
     }
     @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        in = in.decorate(decorator);
-        return this;
-    }
-    @Override
     public void collectEffects(THashSet<Type> effects) {
         ruleset.collectEffects(effects);
         in.collectEffects(effects);
index 7965b50114c7b9f31a6f0c625f6ed7fdadab4abf..ce0385f815623760edf9a276c6a69e10da7f697a 100644 (file)
@@ -9,7 +9,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
 import org.simantics.scl.compiler.types.Type;
@@ -67,10 +66,6 @@ public class ECHRRulesetConstructor extends Expression {
         }
     }
     @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return this;
-    }
-    @Override
     public void collectEffects(THashSet<Type> effects) {
         ruleset.collectEffects(effects);
     }
index 47c007d7f7446fc45a04467feb67c56beec3fa5d..aa232cdb59ab7e10e29f01e14f72e7c2e7abeef6 100644 (file)
@@ -17,7 +17,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -127,12 +126,6 @@ public class ECHRSelect extends Expression {
         }
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        this.expression = decorator.decorate(expression);
-        return this;
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         expression.collectEffects(effects);
index 6b99e6d37f4ad320077cd91a4735103ff9e86b7b..c5b4681a86d233e4ee87fa8fe5b152ae6aa7baeb 100644 (file)
@@ -17,7 +17,6 @@ import org.simantics.scl.compiler.elaboration.modules.SCLValue;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IConstant;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
@@ -234,11 +233,6 @@ public class EConstant extends Expression {
         else
             return applyPUnit(context);
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return decorator.decorate(this);
-    }
     
     @Override
     public boolean isEffectful() {
index 53d9037e28fde54d67afbb45935d24bb397504ff..ea657f8b1459d3fb64bbf58b8147e336ebae49a3 100644 (file)
@@ -9,7 +9,6 @@ import org.simantics.scl.compiler.elaboration.query.QExists;
 import org.simantics.scl.compiler.elaboration.query.Query;
 import org.simantics.scl.compiler.elaboration.query.compilation.EnforcingContext;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -84,11 +83,6 @@ public class EEnforce extends SimplifiableExpression {
             query = new QExists(variables, query);
         return this;
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {     
-        return decorator.decorate(this);
-    }
     
     @Override
     public void setLocationDeep(long loc) {
index 3d3132cf9db7d29b07aabca403556c2c1aaa5ef1..eec5a5888d24f24491cbd5ba52d34834d6031bb7 100644 (file)
@@ -6,7 +6,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.elaboration.equation.Equation;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -79,15 +78,6 @@ public class EEquations extends SimplifiableExpression {
             equation.collectFreeVariables(vars);
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        if(decorator.decorateSubstructure(this)) {
-            for(Equation equation : equations)
-                 equation.decorate(decorator);
-        }
-        return this;
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         for(Equation equation : equations)
index b329beb1937e636a2d0f44dc445b1a5317fd3d63..fbe8cde2ab646a5bc745e3bb0de558dfb2954f4b 100644 (file)
@@ -8,7 +8,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -69,11 +68,6 @@ public class EError extends Expression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return this;
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
     }
index 4777b2dfb670650ecff46e9b258a3c271ab419b1..1e8341e66cbd4a7f408c8cd05ef6fe4d70bbd30e 100644 (file)
@@ -8,12 +8,10 @@ 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.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
 import org.simantics.scl.compiler.internal.codegen.writer.ModuleWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IConstant;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
@@ -99,11 +97,6 @@ public class EExternalConstant extends Expression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
     }
index a8d117f5df94d93d265c140355ebc8ea417fd65e..da9a7b38be68463ce404b20a1e87adbf0d9d59fc 100644 (file)
@@ -11,7 +11,6 @@ import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous.Alternative
 import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessor;
 import org.simantics.scl.compiler.elaboration.expressions.accessor.IdAccessor;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.header.ModuleHeader;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
@@ -167,11 +166,6 @@ public class EFieldAccess extends SimplifiableExpression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         // FIXME
index cd34db4b597de5ae6d3ff9caf909ef4ff651ec2d..fc437cfd8c8d68be07fc997cd0b3a22063f1286c 100644 (file)
@@ -4,7 +4,6 @@ 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.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.TPred;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -65,11 +64,6 @@ public class EGetConstraint extends SimplifiableExpression {
         return this;
     }
     
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {     
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
     }
index 661de4261e260c09b1cd543f3ac5e2dc97df7339..1f3dccc3e9b848aa29a407c6c2cfb3743a2faf1e 100644 (file)
@@ -8,7 +8,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IConstant;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.internal.interpreted.IIf;
@@ -136,15 +135,6 @@ public class EIf extends Expression {
         return this;
     }
     
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        condition = condition.decorate(decorator);
-        then_ = then_.decorate(decorator);
-        if(else_ != null)
-            else_ = else_.decorate(decorator);        
-        return decorator.decorate(this);
-    }
-    
     @Override
     public boolean isEffectful() {
        return condition.isEffectful() || then_.isEffectful() || (else_ != null && else_.isEffectful());
index 0fbb6a506ac54780279f50b02444480d5d6f5e9e..17cf6e58edb59a23b6601f087595dd8d1df8b725 100644 (file)
@@ -12,7 +12,6 @@ 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.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -118,11 +117,6 @@ public class EIntegerLiteral extends SimplifiableExpression {
         copy.constraint = (EVariable)constraint.replace(context);
         return copy;
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {     
-        return decorator.decorate(this);
-    }
     
     @Override
     public boolean isEffectful() {
index 67a7e147653ef9ce916858e60ab8554a27b57767..573abfbb86055f081f57f49aba4d54db3cb08287 100644 (file)
@@ -5,7 +5,6 @@ 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.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -173,14 +172,6 @@ public class ELambda extends SimplifiableExpression {
         context.popEffectUpperBound();
         return this;
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        if(decorator.decorateSubstructure(this))
-            for(Case case_ : cases)
-                case_.decorate(decorator);
-        return decorator.decorate(this);
-    }
     
     @Override
     public boolean isEffectful() {
index 23733bac61165c31e178d2e960af9dcc92e38d3d..34464fae41a7e7986fd88e72d5916cf4a089839e 100644 (file)
@@ -9,7 +9,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
 import org.simantics.scl.compiler.types.TVar;
@@ -92,12 +91,6 @@ public class ELambdaType extends Expression {
     public Expression inferType(TypingContext context) {
         throw new InternalCompilerError("Should not type check " + getClass().getSimpleName() + ".");
     }
-    
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        value = value.decorate(decorator);
-        return decorator.decorate(this);
-    }
 
     @Override
     public void collectEffects(THashSet<Type> effects) {
index a90c6186d78f8e1e2690d5dab745d56cde171de7..de72c0c1cdc0ebe63bb7e9cf5740ab79f393ec39 100644 (file)
@@ -14,7 +14,6 @@ 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;
@@ -213,14 +212,6 @@ public class ELet extends Expression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        in = in.decorate(decorator);
-        for(Assignment assignment : assignments)
-            assignment.decorate(decorator);
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         for(Assignment assignment : assignments) {
index 860bc7f8cda677281df58b13baa01f18d8d96ebe..7a8b71ebb7b2758c7c01d87673a8c8a7b41a5470 100644 (file)
@@ -6,7 +6,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.elaboration.expressions.list.CompiledQualifier;
 import org.simantics.scl.compiler.elaboration.expressions.list.ListQualifier;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -101,13 +100,6 @@ public class EListComprehension extends SimplifiableExpression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        head = head.decorate(decorator);
-        qualifier.decorate(decorator);
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         head.collectEffects(effects);
index b1075a949af456d30caf21c2e95610d9f6456729..d8d5f76658e4c6947edb11a6302bf974ba763987 100644 (file)
@@ -8,7 +8,6 @@ import org.simantics.scl.compiler.elaboration.java.Builtins;
 import org.simantics.scl.compiler.elaboration.java.ListConstructor;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.utils.Constants;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.internal.interpreted.IListLiteral;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
@@ -114,13 +113,6 @@ public class EListLiteral extends SimplifiableExpression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        for(int i=0;i<components.length;++i)
-            components[i] = components[i].decorate(decorator);
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         for(Expression component : components)
index b11c0d66746ffd328d095cc0ae763de7fbc701d9..0d9d844b6f1c06f55ff61d72c5fce23b2eddd4bd 100644 (file)
@@ -11,7 +11,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IConstant;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
@@ -106,11 +105,6 @@ public class ELiteral extends Expression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
     }
index eef72f9de4f192f4ca44725a519024fb3add2bda..a7a726879f566e114653316d546ff8ff00ee6046 100644 (file)
@@ -13,7 +13,6 @@ import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
 import org.simantics.scl.compiler.internal.elaboration.matching.PatternMatchingCompiler;
 import org.simantics.scl.compiler.internal.elaboration.matching.Row;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.kinds.Kinds;
@@ -164,15 +163,6 @@ public class EMatch extends Expression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        for(int i=0;i<scrutinee.length;++i)
-            scrutinee[i] = scrutinee[i].decorate(decorator);
-        for(Case case_ : cases)
-            case_.decorate(decorator);
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         for(Expression s : scrutinee)
index bd03b30b9799a750c7f8a5f4b8b517fa104d7e46..feecc905c372a50ba64478db7adf2a67c446b0d2 100644 (file)
@@ -2,7 +2,6 @@ package org.simantics.scl.compiler.elaboration.expressions;
 
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 
 public class EPlaceholder extends DecoratingExpression {
     public EPlaceholder(long loc, Expression expression) {
@@ -33,9 +32,4 @@ public class EPlaceholder extends DecoratingExpression {
     public Expression resolveAsPattern(TranslationContext context) {
         return expression.resolveAsPattern(context);
     }
-    
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return expression.decorate(decorator);
-    }
 }
index 2f85269ac30c2b8d0613a455e2e56d71c284af80..4860055c19d3fecc0ae04d9d0202383951c73175 100644 (file)
@@ -11,7 +11,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.ErrorLog;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -107,11 +106,6 @@ public class ERealLiteral extends SimplifiableExpression {
         copy.setType(getType().replace(context.tvarMap));
         return copy;
     }
-    
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {     
-        return decorator.decorate(this);
-    }
 
     @Override
     public void collectEffects(THashSet<Type> effects) {
index e784813d69fec37c9793ccae98a5ccd38fcc2756..b9e55d8497c90a7fb13bf6000fe72e4a9e6dd0cb 100644 (file)
@@ -32,7 +32,6 @@ import org.simantics.scl.compiler.elaboration.query.compilation.DerivateExceptio
 import org.simantics.scl.compiler.elaboration.relations.LocalRelation;
 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.elaboration.utils.ForcedClosure;
 import org.simantics.scl.compiler.internal.elaboration.utils.StronglyConnectedComponents;
 import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
@@ -176,11 +175,6 @@ public class ERuleset extends SimplifiableExpression {
         throw new InternalCompilerError(location, getClass().getSimpleName() + " does not support collectEffects.");
     }
     
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return decorator.decorate(this);
-    }
-    
     @Override
     public Expression resolve(TranslationContext context) {
         throw new InternalCompilerError();
index 7316fe307798a2d1467d013e21d9a7088dc888ac..34aca4adcaccb8512ed29a0e39d2cdbb032a8650 100644 (file)
@@ -20,7 +20,6 @@ import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilation
 import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilationMode;
 import org.simantics.scl.compiler.elaboration.query.compilation.UnsolvableQueryException;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.parsing.parser.SCLTerminals;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
@@ -157,11 +156,6 @@ public class ESelect extends SimplifiableExpression {
         variables = context.popExistentialFrame();
         return this;
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return decorator.decorate(this);
-    }
     
     @Override
     public void setLocationDeep(long loc) {
index 2e5d4c364c743ab24345141e8752a5227e11f990..91de49eb2e3d455d0f93f777675f1d2df0daebb4 100644 (file)
@@ -11,7 +11,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.internal.interpreted.ILambda;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
@@ -198,13 +197,6 @@ public class ESimpleLambda extends Expression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        if(decorator.decorateSubstructure(this))
-            value = value.decorate(decorator);
-        return decorator.decorate(this);
-    }
-
     @Override
     public boolean isEffectful() {
        return false;
index e8fd9cf940b1b3f41dfa34cfc6cf800de3c887e9..0a5d67651cc92ca4055e84984d7692844a4018d6 100644 (file)
@@ -8,7 +8,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.internal.interpreted.ILet;
 import org.simantics.scl.compiler.internal.interpreted.ISeq;
@@ -176,13 +175,6 @@ public class ESimpleLet extends Expression {
         return this;
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        value = value.decorate(decorator);
-        in = in.decorate(decorator);
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         value.collectEffects(effects);
index 65b3f9b2f74b4e971808d6fe93c6384dfa437f7e..e00514151f335c6772b6c761da66a51a4dbecefb 100644 (file)
@@ -10,7 +10,6 @@ import org.simantics.scl.compiler.elaboration.query.Query;
 import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.elaboration.transformations.TransformationBuilder;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
@@ -102,11 +101,6 @@ public class ETransformation extends SimplifiableExpression {
         }
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         effects.add(Types.PROC);
index 654b4ef1f47555395924b0ac3f7db94a22417cbc..568b3c10818ea47740e3492b202c9b55e4e3f263 100644 (file)
@@ -4,7 +4,6 @@ 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.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.parsing.types.TypeAst;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -72,13 +71,7 @@ public class ETypeAnnotation extends SimplifiableExpression {
     public Expression inferType(TypingContext context) {
         return value.checkType(context, type);
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        value = value.decorate(decorator);
-        return decorator.decorate(this);
-    }
-
+    
     @Override
     public void collectEffects(THashSet<Type> effects) {
         value.collectEffects(effects);
index 5311de2f17b4dcc7c9edf2c5ed68e0f2346c0593..761ed0f2f23da45b7cdac5b39bffdb6d22d43c2b 100644 (file)
@@ -11,7 +11,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.internal.interpreted.IVariable;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
@@ -162,11 +161,6 @@ public class EVariable extends Expression {
             return context.subsume(this, requiredType);
     }
     
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {     
-        return decorator.decorate(this);
-    }
-    
     @Override
     public boolean isEffectful() {
        return false;
index a08ed3923570719faccb76eb06690d8d1dec24a7..4997fa592e49e84c2fe6bc82d9cca2208e19406c 100644 (file)
@@ -8,7 +8,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -106,12 +105,6 @@ public class EViewPattern extends Expression {
         }
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        expression = expression.decorate(decorator);
-        return this;
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         expression.collectEffects(effects);
index bf47759de8569cc5596664e0cb1f94edfb5d5deb..d8b42fca47e921bc26759442b77f41c7218e46b5 100644 (file)
@@ -11,7 +11,6 @@ import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilation
 import org.simantics.scl.compiler.elaboration.query.compilation.QueryCompilationMode;
 import org.simantics.scl.compiler.elaboration.query.compilation.UnsolvableQueryException;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -113,11 +112,6 @@ public class EWhen extends SimplifiableExpression {
         variables = context.popExistentialFrame();
         return this;
     }
-
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {     
-        return decorator.decorate(this);
-    }
     
     @Override
     public Expression replace(ReplaceContext context) {
index 02590273d453b889e489a5a2070b909da911db96..0d48c4a153492e47307e7521831fc1dc0f7cc1db 100644 (file)
@@ -19,7 +19,6 @@ import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
 import org.simantics.scl.compiler.internal.elaboration.decomposed.DecomposedExpression;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.internal.parsing.Symbol;
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;
@@ -331,8 +330,6 @@ public abstract class Expression extends Symbol implements Typed {
     public Expression applyType(Type type) {
         return new EApplyType(location, this, type);
     }
-    
-    public abstract Expression decorate(ExpressionDecorator decorator);
 
        public boolean isEffectful() {
                return true;
index 9791b068a5cc4791154da76a6c726f574e2627d1..fa67162d5620df596630bde077ae49bc031ea751 100644 (file)
@@ -2,7 +2,6 @@ package org.simantics.scl.compiler.elaboration.expressions;
 
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.parsing.Symbol;
 
 public class GuardedExpression extends Symbol {
@@ -20,12 +19,6 @@ public class GuardedExpression extends Symbol {
                 value.replace(context));
     }
 
-    public void decorate(ExpressionDecorator decorator) {
-        for(int i=0;i<guards.length;++i)
-            guards[i] = guards[i].decorate(decorator);
-        value = value.decorate(decorator);
-    }
-
     public void setLocationDeep(long loc) {
         if(location == Locations.NO_LOCATION) {
             location = loc;
index 23b2f62246478fe44758d65cc0bf8c5301031c00..992a9939e89de06706fc49aaa7803f37b6d94def 100644 (file)
@@ -10,7 +10,6 @@ import org.simantics.scl.compiler.internal.codegen.continuations.ICont;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw;
 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -138,13 +137,6 @@ public class GuardedExpressionGroup extends Expression {
         return new GuardedExpressionGroup(newExpressions);            
     }
 
-    @Override
-    public Expression decorate(ExpressionDecorator decorator) {
-        for(GuardedExpression expression : expressions)
-            expression.decorate(decorator);
-        return decorator.decorate(this);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         for(GuardedExpression ge : expressions) {
index 97d409f153837e7bda7090811f71c74400ca26c4..948f7c645380b03ace647558546579ef09ceba68 100644 (file)
@@ -45,6 +45,8 @@ EquationVisitor {
 
     @Override
     public Expression transform(EAmbiguous expression) {
+        if(expression.resolvedExpression != null)
+            expression.resolvedExpression = expression.resolvedExpression.accept(this);
         return expression;
     }
 
index e3a1333c08de375b92397972273ea15ba2e6c10d..793bd006531a4bdc87135691360a00ba405eb52d 100644 (file)
@@ -7,7 +7,6 @@ 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.Types;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
@@ -39,11 +38,6 @@ public class ExpressionAccessor extends FieldAccessor {
         fieldName.collectVars(allVars, vars);
     }
     
-    @Override
-    public void decorate(ExpressionDecorator decorator) {
-        fieldName = fieldName.decorate(decorator);
-    }
-    
     @Override
     public void resolve(TranslationContext context) {
         fieldName = fieldName.resolve(context);
index ce56da39f4c827819f66ae673e581dbc35590ef8..0f0d8417f3cbead247f8b11dc3b83550d89803e2 100644 (file)
@@ -6,7 +6,6 @@ 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.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.parsing.Symbol;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
@@ -37,9 +36,6 @@ public abstract class FieldAccessor extends Symbol {
     public void resolve(TranslationContext context) {
     }
 
-    public void decorate(ExpressionDecorator decorator) {
-    }
-
     public void checkType(TypingContext context) {        
     }
 
index 89de0ebc399e05a9cd27f4d8cb1ca495f13c0100..b1efd2ca95d965802528feab0381fe4978f68268 100644 (file)
@@ -9,7 +9,6 @@ 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;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
@@ -80,12 +79,6 @@ public class ListAssignment extends ListQualifier {
         pattern = pattern.resolveAsPattern(context);
     }
 
-    @Override
-    public void decorate(ExpressionDecorator decorator) {
-        value = value.decorate(decorator);
-        pattern = pattern.decorate(decorator);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         pattern.collectEffects(effects);
index 7f480d8df889dbd7973ac160aab17f729482b70d..90b68c5dd3dffec03aca7fe474ff0ad30e807f01 100644 (file)
@@ -9,7 +9,6 @@ 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.TMetaVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
@@ -86,12 +85,6 @@ public class ListGenerator extends ListQualifier {
         pattern = pattern.resolveAsPattern(context);
     }
     
-    @Override
-    public void decorate(ExpressionDecorator decorator) {
-        value = value.decorate(decorator);
-        pattern = pattern.decorate(decorator);
-    }
-    
     @Override
     public void collectEffects(THashSet<Type> effects) {
         pattern.collectEffects(effects);
index fdd1592351e82de0b7d6681d5c9f1da1d7d8a972..626bd48cb75e50d3a8585e30e05559dd1d8d76ff 100644 (file)
@@ -7,7 +7,6 @@ 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;
 import org.simantics.scl.compiler.types.Types;
 
@@ -55,11 +54,6 @@ public class ListGuard extends ListQualifier {
     public void resolve(TranslationContext context) {
         condition = condition.resolve(context);        
     }
-
-    @Override
-    public void decorate(ExpressionDecorator decorator) {
-        condition = condition.decorate(decorator);
-    }
     
     @Override
     public void collectEffects(THashSet<Type> effects) {
index 22e0c6b76cbb571245e5b3b57d21aeb0ba093844..939e6fd66a4f238e7ca239685fb2684b791bde21 100644 (file)
@@ -5,7 +5,6 @@ import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
 import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.parsing.Symbol;
 import org.simantics.scl.compiler.types.Type;
 
@@ -24,7 +23,6 @@ public abstract class ListQualifier extends Symbol {
      */
     public abstract CompiledQualifier compile(SimplificationContext context);
     public abstract void resolve(TranslationContext context);
-    public abstract void decorate(ExpressionDecorator decorator);
     public abstract void collectEffects(THashSet<Type> effects);
     public abstract void setLocationDeep(long loc);
     public abstract void accept(ListQualifierVisitor visitor);
index 16fc84f892582db8337ff6e271248efc8c4ab548..f56820d2a3e9496af3cdb5b6b67c85d1b92401f7 100644 (file)
@@ -7,7 +7,6 @@ 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;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
@@ -76,12 +75,6 @@ public class ListSeq extends ListQualifier {
         b.resolve(context);
     }
     
-    @Override
-    public void decorate(ExpressionDecorator decorator) {
-        a.decorate(decorator);
-        b.decorate(decorator);
-    }
-    
     @Override
     public void collectEffects(THashSet<Type> effects) {
         a.collectEffects(effects);
index f8f3c3dd9db0aabeada7612326b362bcf246e235..fbc153226926a8aa64d1cf429c46f5a2ab74949a 100644 (file)
@@ -7,7 +7,6 @@ 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.TMetaVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
@@ -100,14 +99,6 @@ public class ListThen extends ListQualifier {
             by = by.resolve(context);
     }
 
-    @Override
-    public void decorate(ExpressionDecorator decorator) {
-        transformer = transformer.decorate(decorator);
-        if(by != null)
-            by = by.decorate(decorator);
-        left.decorate(decorator);
-    }
-
     @Override
     public void collectEffects(THashSet<Type> effects) {
         left.collectEffects(effects);
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/utils/ExpressionDecorator.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/utils/ExpressionDecorator.java
deleted file mode 100644 (file)
index 77e47d1..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.simantics.scl.compiler.internal.elaboration.utils;
-
-import org.simantics.scl.compiler.elaboration.expressions.Expression;
-
-public interface ExpressionDecorator {
-
-    Expression decorate(Expression expression);
-    boolean decorateSubstructure(Expression expression);
-    
-}
index 67f43838d837ff897d8a0f8c9a3d1e97df13ecee..899ee0418efef4af964fa01d69ddf06edfcb6520 100644 (file)
@@ -42,7 +42,6 @@ import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
 import org.simantics.scl.compiler.internal.codegen.writer.ExternalConstant;
 import org.simantics.scl.compiler.internal.codegen.writer.ModuleWriter;
 import org.simantics.scl.compiler.internal.elaboration.decomposed.DecomposedExpression;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;
 import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;
 import org.simantics.scl.compiler.internal.parsing.parser.SCLBlockParser;
@@ -300,9 +299,9 @@ public class ExpressionEvaluator {
             if(!errorLog.hasNoErrors())
                 throw new SCLExpressionCompilationException(errorLog.getErrors());
             if(decorateExpression && Types.canonical(expectedEffect) != Types.NO_EFFECTS) {
-                ExpressionDecorator decorator =
+                ToplevelEffectDecorator decorator =
                         new ToplevelEffectDecorator(errorLog, environment);
-                expression = expression.decorate(decorator);
+                expression = expression.accept(decorator);
             }
             expression = context.solveConstraints(environment, expression);
             expressionType = expression.getType();
index 5a3c39e60a3fcecd9f56bf68cc6a2a8f32cf85d1..da4ce4febc22363f8ba3dd02d5b6a54893433d97 100644 (file)
@@ -4,7 +4,9 @@ import java.util.ArrayList;
 
 import org.simantics.scl.compiler.common.names.Name;
 import org.simantics.scl.compiler.common.names.Names;
+import org.simantics.scl.compiler.elaboration.expressions.Case;
 import org.simantics.scl.compiler.elaboration.expressions.EApply;
+import org.simantics.scl.compiler.elaboration.expressions.ECHRRuleset;
 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
 import org.simantics.scl.compiler.elaboration.expressions.EEnforce;
 import org.simantics.scl.compiler.elaboration.expressions.EFieldAccess;
@@ -14,17 +16,19 @@ import org.simantics.scl.compiler.elaboration.expressions.ESelect;
 import org.simantics.scl.compiler.elaboration.expressions.ESimpleLambda;
 import org.simantics.scl.compiler.elaboration.expressions.EWhen;
 import org.simantics.scl.compiler.elaboration.expressions.Expression;
+import org.simantics.scl.compiler.elaboration.expressions.StandardExpressionTransformer;
 import org.simantics.scl.compiler.elaboration.expressions.Variable;
 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
 import org.simantics.scl.compiler.environment.Environment;
 import org.simantics.scl.compiler.errors.ErrorLog;
 import org.simantics.scl.compiler.errors.Locations;
-import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
 import org.simantics.scl.compiler.types.TCon;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 
-public class ToplevelEffectDecorator implements ExpressionDecorator {
+import gnu.trove.map.hash.THashMap;
+
+public class ToplevelEffectDecorator extends StandardExpressionTransformer {
 
     ErrorLog errorLog;
     Environment environment;
@@ -34,92 +38,101 @@ public class ToplevelEffectDecorator implements ExpressionDecorator {
         this.environment = environment;
     }
 
-    private static Expression decorate(SCLValue transactionFunction, Type effect, Expression expression) {
-        Variable var = new Variable("_");
-        var.setType(Types.UNIT);
-        Expression trans = new EApply(expression.getLocation(), Types.PROC,
-                new EConstant(transactionFunction,
-                        expression.getType()),
-                        new ESimpleLambda(Locations.NO_LOCATION, var, effect, expression)
-                );
-        if(expression instanceof EApply) {
-            EApply apply = (EApply)expression;
-            trans = apply.toANormalForm(trans);
-        }
-        return trans;
+    @Override
+    public Expression transform(EEnforce expression) {
+        return decorateByEffect(expression, expression.getEffect());
+    }
+    
+    @Override
+    public Expression transform(EWhen expression) {
+        return decorateByEffect(expression, expression.getEffect());
+    }
+    
+    @Override
+    public Expression transform(ERuleset expression) {
+        return decorateByEffect(expression, expression.getEffect());
+    }
+    
+    @Override
+    public Expression transform(ECHRRuleset expression) {
+        return decorateByEffect(expression, expression.getEffect());
+    }
+    
+    @Override
+    public Expression transform(EFieldAccess expression) {
+        // Can we encounter EFieldAccess in this transformer?
+        return decorateByEffect(expression, expression.getEffect());
+    }
+    
+    @Override
+    public Expression transform(ESelect expression) {
+        return decorateByEffect(expression, expression.getEffect());
     }
 
-    private static final TCon R = Types.con("R/R", "R");
+    @Override
+    public Expression transform(EApply expression) {
+        return decorateByEffect(super.transform(expression), expression.getLocalEffect());
+    }
 
     @Override
-    public Expression decorate(Expression expression) {
-        if(expression instanceof EApply)
-            return decorateByEffect(expression, ((EApply)expression).getLocalEffect());
-        else if(expression instanceof ESelect 
-                || expression instanceof EEnforce
-                || expression instanceof EWhen
-                || expression instanceof EFieldAccess
-                || expression instanceof ERuleset)
-            return decorateByEffect(expression, expression.getEffect());
+    public Expression transform(ESimpleLambda expression) {
+        // Never has side effects
         return expression;
     }
 
+    @Override
+    public Expression transform(ELambda expression) {
+        // Never has side effects
+        return expression;
+    }
+
+    @Override
+    protected void transformCases(Case[] cases) {
+        for(Case case_ : cases)
+            case_.value = case_.value.accept(this);
+    }
+    
+    private static final THashMap<TCon, Name> DECORATION_MAP = new THashMap<TCon, Name>();
+
+    static {
+        DECORATION_MAP.put(Types.WRITE_GRAPH,     Names.Simantics_DB_syncWrite);
+        DECORATION_MAP.put(Types.READ_GRAPH,      Names.Simantics_DB_syncRead);
+        DECORATION_MAP.put(Types.con("R/R", "R"), Names.R_R_runR);
+        DECORATION_MAP.put(Types.RANDOM,          Names.Random_runRandom);
+    }
+
     private Expression decorateByEffect(Expression expression, Type effect) {
         if(effect == Types.NO_EFFECTS) 
             return expression;
 
-        //System.out.println("decorateByEffect(" + expression + ", " + effect + ")");
-        
         ArrayList<TCon> concreteEffects = new ArrayList<TCon>();
         effect.collectConcreteEffects(concreteEffects);
-        if(concreteEffects.contains(Types.WRITE_GRAPH)) {
-            Name name = Names.Simantics_DB_syncWrite;
-            SCLValue transactionFunction = environment.getValue(name);
+        for(TCon ce : concreteEffects) {
+            Name transactionFunctionName = DECORATION_MAP.get(ce);
+            if(transactionFunctionName == null)
+                continue;
+            SCLValue transactionFunction = environment.getValue(transactionFunctionName);
             if(transactionFunction == null) {
-                errorLog.log(expression.location, "Cannot locate " + name);
-                return expression;
+                errorLog.log(expression.location, "Cannot locate " + transactionFunctionName);
+                continue;
             }
-
-            expression = decorate(transactionFunction, Types.WRITE_GRAPH, expression);
+            expression = decorate(transactionFunction, ce, expression);
         }
-        else if(concreteEffects.contains(Types.READ_GRAPH)) {
-            Name name = Names.Simantics_DB_syncRead;
-            SCLValue transactionFunction = environment.getValue(name);
-            if(transactionFunction == null) {
-                errorLog.log(expression.location, "Cannot locate " + name);
-                return expression;
-            }                   
-
-            expression = decorate(transactionFunction, Types.READ_GRAPH, expression);
-        }
-        if(concreteEffects.contains(R)) {
-            Name name = Names.R_R_runR;
-            SCLValue transactionFunction = environment.getValue(name);
-            if(transactionFunction == null) {
-                errorLog.log(expression.location, "Cannot locate " + name);
-                return expression;
-            }                   
-
-            expression = decorate(transactionFunction, R, expression);
-        }
-        if(concreteEffects.contains(Types.RANDOM)) {
-            Name name = Names.Random_runRandom;
-            SCLValue transactionFunction = environment.getValue(name);
-            if(transactionFunction == null) {
-                errorLog.log(expression.location, "Cannot locate " + name);
-                return expression;
-            }                   
 
-            expression = decorate(transactionFunction, Types.RANDOM, expression);
-        }
         return expression;
     }
 
-    @Override
-    public boolean decorateSubstructure(Expression expression) {
-        if(expression instanceof ELambda || expression instanceof ESimpleLambda)
-            return false;
-        return true;
+    private static Expression decorate(SCLValue transactionFunction, Type effect, Expression expression) {
+        Variable var = new Variable("_");
+        var.setType(effect == Types.RANDOM ? Types.PUNIT : Types.UNIT);
+        Expression trans = new EApply(expression.getLocation(), Types.PROC,
+                effect == Types.RANDOM ? new EConstant(transactionFunction, Types.PROC, expression.getType()) : new EConstant(transactionFunction, expression.getType()),
+                new ESimpleLambda(Locations.NO_LOCATION, var, effect, expression)
+                );
+        if(expression instanceof EApply) {
+            EApply apply = (EApply)expression;
+            trans = apply.toANormalForm(trans);
+        }
+        return trans;
     }
-
 }