]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EApply.java
migrated to svn revision 33108
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EApply.java
index fb27b9198afbf00ef9b6ae9b08eac1585eabbe97..8df327362560bc8574eefc96542d9e6f4da4de4a 100755 (executable)
@@ -1,12 +1,9 @@
 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.names.Name;\r
+import org.simantics.scl.compiler.constants.NoRepConstant;\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
@@ -26,6 +23,8 @@ import org.simantics.scl.compiler.internal.interpreted.IApply;
 import org.simantics.scl.compiler.internal.interpreted.IExpression;\r
 import org.simantics.scl.compiler.internal.interpreted.IListLiteral;\r
 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;\r
+import org.simantics.scl.compiler.types.Skeletons;\r
+import org.simantics.scl.compiler.types.TFun;\r
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
@@ -33,6 +32,10 @@ import org.simantics.scl.compiler.types.exceptions.UnificationException;
 import org.simantics.scl.compiler.types.kinds.Kinds;\r
 import org.simantics.scl.compiler.types.util.MultiFunction;\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 class EApply extends Expression {\r
     Expression function;\r
     Expression[] parameters;\r
@@ -248,8 +251,7 @@ public class EApply extends Expression {
         return new IApply(function.toIExpression(target), parametersI);\r
     }\r
     \r
-    @Override\r
-    public Expression inferType(TypingContext context) {\r
+    private void inferType(TypingContext context, boolean ignoreResult) {\r
         function = function.inferType(context);\r
         function = context.instantiate(function);\r
         MultiFunction mfun;\r
@@ -265,7 +267,12 @@ public class EApply extends Expression {
             setType(Types.metaVar(Kinds.STAR));\r
             for(int i=0;i<parameters.length;++i)\r
                 parameters[i] = parameters[i].inferType(context);\r
-            return this;\r
+            return;\r
+        }\r
+        if((ignoreResult && Skeletons.canonicalSkeleton(mfun.returnType) instanceof TFun &&\r
+                Types.canonical(mfun.effect) == Types.NO_EFFECTS) ||\r
+                (context.isInPattern() && Skeletons.canonicalSkeleton(mfun.returnType) instanceof TFun)) {\r
+            context.getErrorLog().log(location, "The function is applied with too few parameters.");\r
         }\r
         \r
         // Check parameter types\r
@@ -276,7 +283,19 @@ public class EApply extends Expression {
         \r
         context.declareEffect(location, mfun.effect);\r
         setType(mfun.returnType);\r
-\r
+    }\r
+    \r
+    @Override\r
+    public Expression inferType(TypingContext context) {\r
+        inferType(context, false);\r
+        return this;\r
+    }\r
+    \r
+    @Override\r
+    public Expression checkIgnoredType(TypingContext context) {\r
+        inferType(context, true);\r
+        if(Types.canonical(getType()) != Types.UNIT)\r
+            return new ESimpleLet(location, null, this, new ELiteral(NoRepConstant.PUNIT));\r
         return this;\r
     }\r
 \r