]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EAsPattern.java
(refs #7375) Replaced collectVars method by a visitor
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EAsPattern.java
1 package org.simantics.scl.compiler.elaboration.expressions;
2
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
4 import org.simantics.scl.compiler.compilation.CompilationContext;
5 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
6 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
7 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
8 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
9 import org.simantics.scl.compiler.errors.Locations;
10 import org.simantics.scl.compiler.internal.codegen.references.IVal;
11 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
12 import org.simantics.scl.compiler.types.Type;
13 import org.simantics.scl.compiler.types.exceptions.MatchException;
14
15 public class EAsPattern extends Expression {
16
17     public Variable var;
18     public EVar eVar;
19     public Expression pattern;
20
21     public EAsPattern(EVar eVar, Expression pattern) {
22         this.eVar = eVar;
23         this.pattern = pattern;
24     }
25     
26     public EAsPattern(Variable var, Expression pattern) {
27         this.var = var;
28         this.pattern = pattern;
29     }
30     
31     public Variable getVariable() {
32         return var;
33     }
34     
35     public Expression getPattern() {
36         return pattern;
37     }
38     
39     @Override
40     public Expression simplify(SimplificationContext context) {
41         pattern = pattern.simplify(context);
42         return this;
43     }
44
45     @Override
46     public Expression resolve(TranslationContext context) {
47         context.getErrorLog().log(location, "As binding (@) can be used only in patterns.");
48         return this;
49     }
50     
51     @Override
52     public Expression resolveAsPattern(TranslationContext context) {
53         var = context.newVariable(eVar.name);
54         pattern = pattern.resolveAsPattern(context);
55         return this;
56     }
57     
58     @Override
59     protected void updateType() throws MatchException {
60         setType(pattern.getType());
61     }
62
63     @Override
64     public IVal toVal(CompilationContext context, CodeWriter w) {
65         throw new InternalCompilerError("EAsPattern allowed only in patterns.");
66     }
67     
68     @Override
69     public Expression inferType(TypingContext context) {
70         pattern = pattern.inferType(context);
71         var.setType(pattern.getType());
72         return this;
73     }
74     
75     @Override
76     public Expression checkBasicType(TypingContext context, Type requiredType) {
77         pattern = pattern.checkBasicType(context, requiredType);
78         var.setType(pattern.getType());
79         return this;
80     }
81     
82     @Override
83     public Expression replace(ReplaceContext context) {
84         if(!context.inPattern) 
85             throw new IllegalStateException();
86         
87         Variable newVariable = new Variable(var.name);
88         newVariable.setType(var.getType().replace(context.tvarMap));
89         context.varMap.put(var, new EVariable(newVariable));
90         
91         EAsPattern result = new EAsPattern(eVar, pattern.replace(context));
92         result.var = newVariable;
93         
94         return result;
95     }
96     
97     @Override
98     public void setLocationDeep(long loc) {
99         if(location == Locations.NO_LOCATION) {
100             location = loc;
101             pattern.setLocationDeep(loc);
102             if(eVar != null)
103                 eVar.setLocationDeep(loc);
104         }
105     }
106     
107     @Override
108     public void accept(ExpressionVisitor visitor) {
109         visitor.visit(this);
110     }
111     
112     @Override
113     public Expression accept(ExpressionTransformer transformer) {
114         return transformer.transform(this);
115     }
116
117 }