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.THashSet;
-import gnu.trove.set.hash.TIntHashSet;
-
public class EMatch extends Expression {
public Expression[] scrutinee;
this.cases = cases;
}
- @Override
- public void collectVars(TObjectIntHashMap<Variable> 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());
CodeWriter joinPoint = w.createBlock(getType());
CodeWriter failurePoint = w.createBlock(); // TODO generate only one failurePoint per function
- PatternMatchingCompiler.split(w, context, scrutineeVals, joinPoint.getContinuation(), failurePoint.getContinuation(), rows);
+ PatternMatchingCompiler.split(location, w, context, scrutineeVals, joinPoint.getContinuation(), failurePoint.getContinuation(), rows);
failurePoint.throw_(location, Throw.MatchingException, "Matching failure at: " + toString());
w.continueAs(joinPoint);
return w.getParameters()[0];
}
-
- @Override
- public void collectFreeVariables(THashSet<Variable> vars) {
- for(Expression s : scrutinee)
- s.collectFreeVariables(vars);
- for(Case case_ : cases)
- case_.collectFreeVariables(vars);
- }
@Override
public Expression simplify(SimplificationContext context) {
setType(Types.UNIT);
return this;
}
-
- @Override
- public void collectEffects(THashSet<Type> effects) {
- for(Expression s : scrutinee)
- s.collectEffects(effects);
- for(Case case_ : cases) {
- for(Expression pattern : case_.patterns)
- pattern.collectEffects(effects);
- case_.value.collectEffects(effects);
- }
- }
@Override
public void accept(ExpressionVisitor visitor) {