]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EVar.java
5ad1e31266bc33a1613a6eb251d9c6bd9dc06c85
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EVar.java
1 package org.simantics.scl.compiler.elaboration.expressions;\r
2 \r
3 import java.util.ArrayList;\r
4 \r
5 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
6 import org.simantics.scl.compiler.elaboration.errors.NotPatternException;\r
7 import org.simantics.scl.compiler.elaboration.expressions.lhstype.FunctionDefinitionLhs;\r
8 import org.simantics.scl.compiler.elaboration.expressions.lhstype.LhsType;\r
9 import org.simantics.scl.compiler.elaboration.expressions.lhstype.PatternMatchingLhs;\r
10 import org.simantics.scl.compiler.errors.Locations;\r
11 \r
12 public class EVar extends ASTExpression {\r
13     public final String name;\r
14 \r
15     public EVar(long location, String name) {\r
16         this.location = location;\r
17         this.name = name;\r
18     }\r
19     \r
20     public EVar(String name) {\r
21         this(Locations.NO_LOCATION, name);\r
22     }\r
23    \r
24     @Override\r
25     public EVar getPatternHead() {\r
26         return this;\r
27     }\r
28     \r
29     @Override\r
30     public LhsType getLhsType() throws NotPatternException {\r
31         if(TranslationContext.isConstructorName(name))\r
32             return new PatternMatchingLhs();\r
33         else\r
34             return new FunctionDefinitionLhs(name);\r
35     }\r
36     \r
37     @Override\r
38     protected void collectVariableNames(PatternMatchingLhs lhsType)\r
39             throws NotPatternException {\r
40         if(!TranslationContext.isConstructorName(name))\r
41             lhsType.variableNames.add(name);\r
42     }\r
43 \r
44     @Override\r
45     public Expression resolve(TranslationContext context) {\r
46         return context.resolveExpression(location, name);\r
47     }\r
48     \r
49     @Override\r
50     public void getParameters(TranslationContext translationContext,\r
51             ArrayList<Expression> parameters) {\r
52     }\r
53     \r
54     @Override\r
55     public Expression resolveAsPattern(TranslationContext context) {\r
56         return context.resolvePattern(this);\r
57     }\r
58     \r
59     @Override\r
60     public int getFunctionDefinitionArity() throws NotPatternException {\r
61         if(TranslationContext.isConstructorName(name))\r
62             throw new NotPatternException(this);\r
63         else\r
64             return 0;\r
65     }\r
66     \r
67     @Override\r
68     public boolean isConstructorApplication() {\r
69         return TranslationContext.isConstructorName(name);\r
70     }\r
71     \r
72     @Override\r
73     public void setLocationDeep(long loc) {\r
74         if(location == Locations.NO_LOCATION)\r
75             location = loc;\r
76     }\r
77     \r
78     @Override\r
79     public Expression accept(ExpressionTransformer transformer) {\r
80         return transformer.transform(this);\r
81     }\r
82 }\r