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