1 package org.simantics.scl.compiler.elaboration.expressions;
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;
15 public class EAsPattern extends Expression {
19 public Expression pattern;
21 public EAsPattern(EVar eVar, Expression pattern) {
23 this.pattern = pattern;
26 public EAsPattern(Variable var, Expression pattern) {
28 this.pattern = pattern;
31 public Variable getVariable() {
35 public Expression getPattern() {
40 public Expression simplify(SimplificationContext context) {
41 pattern = pattern.simplify(context);
46 public Expression resolve(TranslationContext context) {
47 context.getErrorLog().log(location, "As binding (@) can be used only in patterns.");
52 public Expression resolveAsPattern(TranslationContext context) {
53 var = context.newVariable(eVar.name);
54 pattern = pattern.resolveAsPattern(context);
59 protected void updateType() throws MatchException {
60 setType(pattern.getType());
64 public IVal toVal(CompilationContext context, CodeWriter w) {
65 throw new InternalCompilerError("EAsPattern allowed only in patterns.");
69 public Expression inferType(TypingContext context) {
70 pattern = pattern.inferType(context);
71 var.setType(pattern.getType());
76 public Expression checkBasicType(TypingContext context, Type requiredType) {
77 pattern = pattern.checkBasicType(context, requiredType);
78 var.setType(pattern.getType());
83 public Expression replace(ReplaceContext context) {
84 if(!context.inPattern)
85 throw new IllegalStateException();
87 Variable newVariable = new Variable(var.name);
88 newVariable.setType(var.getType().replace(context.tvarMap));
89 context.varMap.put(var, new EVariable(newVariable));
91 EAsPattern result = new EAsPattern(eVar, pattern.replace(context));
92 result.var = newVariable;
98 public void setLocationDeep(long loc) {
99 if(location == Locations.NO_LOCATION) {
101 pattern.setLocationDeep(loc);
103 eVar.setLocationDeep(loc);
108 public void accept(ExpressionVisitor visitor) {
113 public Expression accept(ExpressionTransformer transformer) {
114 return transformer.transform(this);