]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBind.java
(refs #7508) Edo and modified mdo under edo feature
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EBind.java
index c72776b35829ea91b6aa90037b4920bf35c39458..84cc220c1a0222e75def8781fe657eaff1a88aa3 100644 (file)
@@ -11,6 +11,7 @@ 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.header.ModuleHeader;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.exceptions.MatchException;
@@ -52,7 +53,11 @@ public class EBind extends SimplifiableExpression {
     
     @Override
     public Expression checkBasicType(TypingContext context, Type requiredType) {
+        ModuleHeader header = context.getCompilationContext().header;
+        boolean edo = header != null && header.edo;
+        
         monadType = Types.metaVar(Kinds.STAR_TO_STAR);
+        
         inContentType = Types.metaVar(Kinds.STAR);
         Type monadContent = Types.apply(monadType, inContentType);
         try {
@@ -71,9 +76,13 @@ public class EBind extends SimplifiableExpression {
         pattern = pattern.checkTypeAsPattern(context, Types.metaVar(Kinds.STAR));
         valueContentType = pattern.getType();
         value = value.checkType(context, Types.apply(monadType, valueContentType));
-        context.pushEffectUpperBound(location, blockType == BlockType.Monad ? Types.NO_EFFECTS : Types.metaVar(Kinds.EFFECT));
+        if(edo)
+            context.pushEffectUpperBound(location, blockType == BlockType.Monad ? Types.NO_EFFECTS : Types.metaVar(Kinds.EFFECT));
         in = in.checkType(context, requiredType);
-        effect = context.popEffectUpperBound();
+        if(edo)
+            effect = context.popEffectUpperBound();
+        else
+            effect = Types.NO_EFFECTS;
         Type inType = in.getType();
         setType(inType);
         return this;
@@ -89,10 +98,6 @@ public class EBind extends SimplifiableExpression {
      */
     @Override
     public Expression simplify(SimplificationContext context) {    
-        value = value.simplify(context);
-        in = in.simplify(context);
-        pattern = pattern.simplify(context);
-        
         long loc = getLocation();
         monadType = Types.canonical(monadType);
         valueContentType = Types.canonical(valueContentType);
@@ -101,11 +106,11 @@ public class EBind extends SimplifiableExpression {
         Type[] types = blockType == BlockType.MonadE 
                 ? new Type[] {monadType, valueContentType, effect, inContentType} 
                 : new Type[] {monadType, valueContentType, inContentType};
-        Expression simplified = new EApply(loc,
+        Expression simplified = new EApply(loc, effect,
                 new EConstant(loc, context.getValue(blockType == BlockType.MonadE ? Names.Prelude_bindE : Names.Prelude_bind), types),
                 monadEvidence, 
                 value,
-                new ELambda(loc, new Case[] {
+                new ELambda(loc, effect, new Case[] {
                     new Case(new Expression[] { pattern }, in)
                 }));
         simplified.setType(getType());