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; import gnu.trove.map.hash.TObjectIntHashMap; import gnu.trove.set.hash.TIntHashSet; 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 public void collectVars(TObjectIntHashMap allVars, TIntHashSet vars) { for(Expression s : scrutinee) s.collectVars(allVars, vars); for(Case case_ : cases) case_.collectVars(allVars, vars); } @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