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
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
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
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
public abstract void collectFreeVariables(THashSet<Variable> vars);\r
\r
public Expression simplify(SimplificationContext context) {\r
- System.out.println("#############################");\r
- System.out.println(this);\r
throw new InternalCompilerError(location, getClass().getSimpleName() + " does not support simplify method.");\r
}\r
\r