X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Felaboration%2Fconstraints%2FConstraintEnvironment.java;h=72aa1ea9e09e627c441125cfb16048c91d0d7993;hp=ba982b1c6ab14c8fe886e318e471e42d4af54594;hb=a8758de5bc19e5adb3f618d3038743a164f09912;hpb=12d9af17384d960b75d58c3935d2b7b46d93e87b diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java index ba982b1c6..72aa1ea9e 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java @@ -1,5 +1,7 @@ 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; @@ -92,19 +94,25 @@ public class ConstraintEnvironment { else if(parameter instanceof TUnion) { TUnion union = (TUnion)parameter; - /*TPred[] demands = new TPred[union.effects.length]; - for(int i=0;i substitution = new THashMap(); + THashMap 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]; @@ -118,10 +126,15 @@ public class ConstraintEnvironment { parameter = inst.generatorParameters[i]; // TODO Is this correct? parameters[i] = parameter; } - return new Reduction(new ELiteral(inst.generator), parameters, demands); + reductions.add(new Reduction(new ELiteral(inst.generator), parameters, demands)); } - else - substitution.clear(); + substitution.clear(); + } + //System.out.println(constraint.typeClass + " -> " + 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; }