--- /dev/null
+package org.simantics.scl.compiler.elaboration.expressions;\r
+\r
+import java.util.ArrayList;\r
+\r
+import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
+import org.simantics.scl.compiler.elaboration.errors.NotPatternException;\r
+import org.simantics.scl.compiler.elaboration.expressions.lhstype.FunctionDefinitionLhs;\r
+import org.simantics.scl.compiler.elaboration.expressions.lhstype.LhsType;\r
+import org.simantics.scl.compiler.elaboration.expressions.lhstype.PatternMatchingLhs;\r
+import org.simantics.scl.compiler.errors.Locations;\r
+\r
+public class EVar extends ASTExpression {\r
+ public final String name;\r
+\r
+ public EVar(long location, String name) {\r
+ this.location = location;\r
+ this.name = name;\r
+ }\r
+ \r
+ public EVar(String name) {\r
+ this(Locations.NO_LOCATION, name);\r
+ }\r
+ \r
+ @Override\r
+ public EVar getPatternHead() {\r
+ return this;\r
+ }\r
+ \r
+ @Override\r
+ public LhsType getLhsType() throws NotPatternException {\r
+ if(TranslationContext.isConstructorName(name))\r
+ return new PatternMatchingLhs();\r
+ else\r
+ return new FunctionDefinitionLhs(name);\r
+ }\r
+ \r
+ @Override\r
+ protected void collectVariableNames(PatternMatchingLhs lhsType)\r
+ throws NotPatternException {\r
+ if(!TranslationContext.isConstructorName(name))\r
+ lhsType.variableNames.add(name);\r
+ }\r
+\r
+ @Override\r
+ public Expression resolve(TranslationContext context) {\r
+ return context.resolveExpression(location, name);\r
+ }\r
+ \r
+ @Override\r
+ public void getParameters(TranslationContext translationContext,\r
+ ArrayList<Expression> parameters) {\r
+ }\r
+ \r
+ @Override\r
+ public Expression resolveAsPattern(TranslationContext context) {\r
+ return context.resolvePattern(this);\r
+ }\r
+ \r
+ @Override\r
+ public int getFunctionDefinitionArity() throws NotPatternException {\r
+ if(TranslationContext.isConstructorName(name))\r
+ throw new NotPatternException(this);\r
+ else\r
+ return 0;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isConstructorApplication() {\r
+ return TranslationContext.isConstructorName(name);\r
+ }\r
+ \r
+ @Override\r
+ public void setLocationDeep(long loc) {\r
+ if(location == Locations.NO_LOCATION)\r
+ location = loc;\r
+ }\r
+ \r
+ @Override\r
+ public Expression accept(ExpressionTransformer transformer) {\r
+ return transformer.transform(this);\r
+ }\r
+}\r