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.compilation.CompilationContext; 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 { CompilationContext compilationContext; Environment environment; public ConstraintEnvironment(CompilationContext compilationContext) { this.compilationContext = compilationContext; this.environment = compilationContext.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) { StringBuilder b = new StringBuilder(); b.append("Found more than one matching instances for ").append(constraint.typeClass).append(": "); boolean first = true; for(Reduction reduction : reductions) { if(first) first = false; else b.append(", "); b.append(reduction.generator); } compilationContext.errorLog.log(location, b.toString()); } return null; } }