package org.simantics.scl.compiler.internal.elaboration.constraints; import java.util.ArrayList; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.constants.ClassConstant; import org.simantics.scl.compiler.constants.StringConstant; import org.simantics.scl.compiler.elaboration.expressions.EApply; import org.simantics.scl.compiler.elaboration.expressions.EConstant; import org.simantics.scl.compiler.elaboration.expressions.ELiteral; import org.simantics.scl.compiler.elaboration.java.Builtins; import org.simantics.scl.compiler.elaboration.modules.TypeClass; import org.simantics.scl.compiler.elaboration.modules.TypeClassInstance; import org.simantics.scl.compiler.environment.Environment; import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.types.TApply; import org.simantics.scl.compiler.types.TCon; import org.simantics.scl.compiler.types.TFun; import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.TUnion; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import gnu.trove.map.hash.THashMap; public class ConstraintEnvironment { Environment environment; public ConstraintEnvironment(Environment environment) { this.environment = environment; } public Superconstraint[] getSuperconstraints(TPred constraint) { TypeClass tc = environment.getTypeClass(constraint.typeClass); if(tc == null) { throw new InternalCompilerError("Didn't find constraint " + constraint + ". Maybe Prelude is not loaded?"); } if(tc.context.length == 0) return Superconstraint.EMPTY_ARRAY; Superconstraint[] result = new Superconstraint[tc.context.length]; for(int i=0;i substitution = new THashMap(); ArrayList reductions = new ArrayList(1); for(TypeClassInstance inst : environment.getInstances(constraint.typeClass)) { if(Types.match(inst.instance, constraint, substitution)) { TPred[] demands = new TPred[inst.context.length]; for(int i=0;i " + reductions.size()); if(reductions.size() == 1) return reductions.get(0); else if(reductions.size() > 1) { throw new InternalCompilerError("Found more than one matching instances for " + constraint.typeClass + "."); } return null; } }