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