]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Expression.java
migrated to svn revision 33108
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / Expression.java
index 83d7ec4e7bb5290a407df6dc3d79dff8b7fed328..edf93841b5c9ba1adf7420238ee7c24451ed81c6 100755 (executable)
@@ -1,13 +1,11 @@
 package org.simantics.scl.compiler.elaboration.expressions;\r
 \r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
 import java.util.ArrayList;\r
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.common.precedence.Precedence;\r
+import org.simantics.scl.compiler.constants.NoRepConstant;\r
+import org.simantics.scl.compiler.elaboration.contexts.EnvironmentalContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
@@ -36,6 +34,10 @@ import org.simantics.scl.compiler.types.exceptions.MatchException;
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 import org.simantics.scl.compiler.types.util.Typed;\r
 \r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.THashSet;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
 public abstract class Expression extends Symbol implements Typed {\r
     public static final Expression[] EMPTY_ARRAY = new Expression[0];\r
     \r
@@ -77,10 +79,30 @@ public abstract class Expression extends Symbol implements Typed {
     public Expression inferType(TypingContext context) {\r
         return checkBasicType(context, Types.metaVar(Kinds.STAR));\r
     }\r
-       \r
-       public Expression checkBasicType(TypingContext context, Type requiredType) {\r
-           return context.subsume(inferType(context), requiredType);\r
-       }\r
+\r
+    public Expression checkBasicType(TypingContext context, Type requiredType) {\r
+        return context.subsume(inferType(context), requiredType);\r
+    }\r
+    \r
+    protected Expression applyPUnit(EnvironmentalContext context) {\r
+        Type type = Types.canonical(getType());\r
+        if(type instanceof TFun) {\r
+            TFun fun = (TFun)type;\r
+            if(fun.getCanonicalDomain() == Types.PUNIT) {\r
+                EApply result = new EApply(location, this, new ELiteral(NoRepConstant.PUNIT));\r
+                result.effect = fun.getCanonicalEffect();\r
+                return result;\r
+            }\r
+        }\r
+        return this;\r
+    }\r
+\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        Expression expression = inferType(context);\r
+        if(Types.canonical(expression.getType()) != Types.UNIT)\r
+            expression = new ESimpleLet(location, null, expression, new ELiteral(NoRepConstant.PUNIT));\r
+        return expression;\r
+    }\r
        \r
        /**\r
         * Checks the type of the expression against the given type. Adds type\r
@@ -89,7 +111,7 @@ public abstract class Expression extends Symbol implements Typed {
        public final Expression checkType(TypingContext context, Type requiredType) {\r
            //System.out.println("checkType: " + this + " :: " + requiredType);\r
            if(!context.isInPattern()) {\r
-               requiredType = Types.weakCanonical(requiredType);\r
+               requiredType = Types.canonical(requiredType);\r
            if(requiredType instanceof TForAll) {\r
                 TForAll forAll = (TForAll)requiredType;\r
                 TVar var = forAll.var;\r