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.SimplificationContext;
6 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
7 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
8 import org.simantics.scl.compiler.errors.Locations;
9 import org.simantics.scl.compiler.internal.codegen.references.IVal;
10 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
11 import org.simantics.scl.compiler.types.Types;
12 import org.simantics.scl.compiler.types.exceptions.MatchException;
13 import org.simantics.scl.compiler.types.util.MultiFunction;
15 public class EViewPattern extends Expression {
16 public Expression expression;
17 public Expression pattern;
19 public EViewPattern(Expression expression, Expression pattern) {
20 this.expression = expression;
21 this.pattern = pattern;
25 public Expression inferType(TypingContext context) {
26 context.setInPattern(false);
27 expression = expression.inferType(context);
28 context.setInPattern(true);
31 mfun = Types.matchFunction(expression.getType(), 1);
32 } catch (MatchException e) {
33 context.getErrorLog().log(expression.location, "Expected a function as a transformation expression.");
34 return new EError(location);
36 setType(mfun.parameterTypes[0]);
37 pattern.checkType(context, mfun.returnType);
42 protected void updateType() throws MatchException {
43 MultiFunction mfun = Types.matchFunction(expression.getType(), 1);
44 setType(mfun.parameterTypes[0]);
48 public IVal toVal(CompilationContext context, CodeWriter w) {
49 throw new InternalCompilerError(location, "EViewPattern.toVal should not be invoked.");
53 public Expression resolve(TranslationContext context) {
54 context.getErrorLog().log("View pattern cannot occur only in patterns. Maybe you are missing '\\' in front of a lambda experssion?");
55 return new EError(location);
59 public Expression resolveAsPattern(TranslationContext context) {
60 expression = expression.resolve(context);
61 pattern = pattern.resolveAsPattern(context);
66 public void setLocationDeep(long loc) {
67 if(location == Locations.NO_LOCATION) {
69 expression.setLocationDeep(loc);
70 pattern.setLocationDeep(loc);
75 public void accept(ExpressionVisitor visitor) {
80 public Expression accept(ExpressionTransformer transformer) {
81 return transformer.transform(this);
85 public Expression simplify(SimplificationContext context) {
86 expression = expression.simplify(context);
87 pattern = pattern.simplify(context);