1 package org.simantics.scl.compiler.elaboration.expressions;
\r
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
\r
4 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
\r
5 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
\r
6 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
\r
7 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
\r
8 import org.simantics.scl.compiler.environment.Environment;
\r
9 import org.simantics.scl.compiler.errors.Locations;
\r
10 import org.simantics.scl.compiler.internal.codegen.references.IVal;
\r
11 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
\r
12 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;
\r
13 import org.simantics.scl.compiler.types.Type;
\r
14 import org.simantics.scl.compiler.types.exceptions.MatchException;
\r
16 import gnu.trove.map.hash.TObjectIntHashMap;
\r
17 import gnu.trove.set.hash.THashSet;
\r
18 import gnu.trove.set.hash.TIntHashSet;
\r
20 public class EAsPattern extends Expression {
\r
26 public EAsPattern(EVar eVar, Expression pattern) {
\r
28 this.pattern = pattern;
\r
31 public EAsPattern(Variable var, Expression pattern) {
\r
33 this.pattern = pattern;
\r
36 public Variable getVariable() {
\r
40 public Expression getPattern() {
\r
45 public void collectRefs(TObjectIntHashMap<Object> allRefs,
\r
47 pattern.collectRefs(allRefs, refs);
\r
51 public void collectVars(TObjectIntHashMap<Variable> allVars,
\r
53 int id = allVars.get(var);
\r
56 pattern.collectVars(allVars, vars);
\r
60 public void collectFreeVariables(THashSet<Variable> vars) {
\r
61 throw new InternalCompilerError(location, "Cannot collect free variables for a pattern.");
\r
65 public void removeFreeVariables(THashSet<Variable> vars) {
\r
67 pattern.removeFreeVariables(vars);
\r
71 public Expression simplify(SimplificationContext context) {
\r
72 pattern = pattern.simplify(context);
\r
77 public Expression resolve(TranslationContext context) {
\r
78 context.getErrorLog().log(location, "As binding (@) can be used only in patterns.");
\r
83 public Expression resolveAsPattern(TranslationContext context) {
\r
84 var = context.newVariable(eVar.name);
\r
85 pattern = pattern.resolveAsPattern(context);
\r
90 protected void updateType() throws MatchException {
\r
91 setType(pattern.getType());
\r
95 public IVal toVal(Environment env, CodeWriter w) {
\r
96 throw new InternalCompilerError("EAsPattern allowed only in patterns.");
\r
100 public Expression inferType(TypingContext context) {
\r
101 pattern = pattern.inferType(context);
\r
102 var.setType(pattern.getType());
\r
107 public Expression checkBasicType(TypingContext context, Type requiredType) {
\r
108 pattern = pattern.checkBasicType(context, requiredType);
\r
109 var.setType(pattern.getType());
\r
114 public Expression decorate(ExpressionDecorator decorator) {
\r
115 pattern = pattern.decorate(decorator);
\r
116 return decorator.decorate(this);
\r
120 public Expression replace(ReplaceContext context) {
\r
121 if(!context.inPattern)
\r
122 throw new IllegalStateException();
\r
124 Variable newVariable = new Variable(var.name);
\r
125 newVariable.setType(var.getType().replace(context.tvarMap));
\r
126 context.varMap.put(var, new EVariable(newVariable));
\r
128 EAsPattern result = new EAsPattern(eVar, pattern.replace(context));
\r
129 result.var = newVariable;
\r
135 public void collectEffects(THashSet<Type> effects) {
\r
136 pattern.collectEffects(effects);
\r
140 public void setLocationDeep(long loc) {
\r
141 if(location == Locations.NO_LOCATION) {
\r
143 pattern.setLocationDeep(loc);
\r
145 eVar.setLocationDeep(loc);
\r
150 public void accept(ExpressionVisitor visitor) {
\r
151 visitor.visit(this);
\r
155 public void forVariables(VariableProcedure procedure) {
\r
156 procedure.execute(eVar.location, var);
\r
157 pattern.forVariables(procedure);
\r
161 public Expression accept(ExpressionTransformer transformer) {
\r
162 return transformer.transform(this);
\r