]> 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 collectFreeVariables 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 import gnu.trove.map.hash.TObjectIntHashMap;
16 import gnu.trove.set.hash.TIntHashSet;
17
18 public class EAsPattern extends Expression {
19
20     public Variable var;
21     public EVar eVar;
22     public Expression pattern;
23
24     public EAsPattern(EVar eVar, Expression pattern) {
25         this.eVar = eVar;
26         this.pattern = pattern;
27     }
28     
29     public EAsPattern(Variable var, Expression pattern) {
30         this.var = var;
31         this.pattern = pattern;
32     }
33     
34     public Variable getVariable() {
35         return var;
36     }
37     
38     public Expression getPattern() {
39         return pattern;
40     }
41
42     @Override
43     public void collectVars(TObjectIntHashMap<Variable> allVars,
44             TIntHashSet vars) {
45         int id = allVars.get(var);
46         if(id >= 0)
47             vars.add(id);
48         pattern.collectVars(allVars, vars);
49     }
50     
51     @Override
52     public Expression simplify(SimplificationContext context) {
53         pattern = pattern.simplify(context);
54         return this;
55     }
56
57     @Override
58     public Expression resolve(TranslationContext context) {
59         context.getErrorLog().log(location, "As binding (@) can be used only in patterns.");
60         return this;
61     }
62     
63     @Override
64     public Expression resolveAsPattern(TranslationContext context) {
65         var = context.newVariable(eVar.name);
66         pattern = pattern.resolveAsPattern(context);
67         return this;
68     }
69     
70     @Override
71     protected void updateType() throws MatchException {
72         setType(pattern.getType());
73     }
74
75     @Override
76     public IVal toVal(CompilationContext context, CodeWriter w) {
77         throw new InternalCompilerError("EAsPattern allowed only in patterns.");
78     }
79     
80     @Override
81     public Expression inferType(TypingContext context) {
82         pattern = pattern.inferType(context);
83         var.setType(pattern.getType());
84         return this;
85     }
86     
87     @Override
88     public Expression checkBasicType(TypingContext context, Type requiredType) {
89         pattern = pattern.checkBasicType(context, requiredType);
90         var.setType(pattern.getType());
91         return this;
92     }
93     
94     @Override
95     public Expression replace(ReplaceContext context) {
96         if(!context.inPattern) 
97             throw new IllegalStateException();
98         
99         Variable newVariable = new Variable(var.name);
100         newVariable.setType(var.getType().replace(context.tvarMap));
101         context.varMap.put(var, new EVariable(newVariable));
102         
103         EAsPattern result = new EAsPattern(eVar, pattern.replace(context));
104         result.var = newVariable;
105         
106         return result;
107     }
108     
109     @Override
110     public void setLocationDeep(long loc) {
111         if(location == Locations.NO_LOCATION) {
112             location = loc;
113             pattern.setLocationDeep(loc);
114             if(eVar != null)
115                 eVar.setLocationDeep(loc);
116         }
117     }
118     
119     @Override
120     public void accept(ExpressionVisitor visitor) {
121         visitor.visit(this);
122     }
123     
124     @Override
125     public Expression accept(ExpressionTransformer transformer) {
126         return transformer.transform(this);
127     }
128
129 }