package org.simantics.scl.compiler.elaboration.expressions; import java.util.ArrayList; import org.simantics.scl.compiler.compilation.CompilationContext; import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.contexts.TypingContext; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.codegen.references.IVal; import org.simantics.scl.compiler.internal.codegen.ssa.exits.Throw; import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter; import org.simantics.scl.compiler.internal.elaboration.matching.PatternMatchingCompiler; import org.simantics.scl.compiler.internal.elaboration.matching.Row; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.kinds.Kinds; public class EMatch extends Expression { public Expression[] scrutinee; public Case[] cases; public EMatch(Expression[] scrutinee, Case ... cases) { this.scrutinee = scrutinee; this.cases = cases; } public EMatch(Expression scrutinee, Case ... cases) { this(new Expression[] {scrutinee}, cases); } public EMatch(long loc, Expression[] scrutinee, Case ... cases) { super(loc); this.scrutinee = scrutinee; this.cases = cases; } @Override protected void updateType() { setType(cases[0].value.getType()); } @Override public IVal toVal(CompilationContext context, CodeWriter w) { ArrayList rows = new ArrayList(cases.length); for(Case case_ : cases) rows.add(new Row(case_.patterns, case_.value)); IVal[] scrutineeVals = new IVal[scrutinee.length]; for(int i=0;i