package org.simantics.scl.compiler.internal.elaboration.constraints; 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(); 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