X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Felaboration%2Fconstraints%2FConstraintEnvironment.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Felaboration%2Fconstraints%2FConstraintEnvironment.java;h=d19dfeec10f7243e43211d32b8c43c39beaa49d7;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git 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 new file mode 100644 index 000000000..d19dfeec1 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/constraints/ConstraintEnvironment.java @@ -0,0 +1,297 @@ +package org.simantics.scl.compiler.internal.elaboration.constraints; + +import gnu.trove.map.hash.THashMap; + +import org.cojen.classfile.TypeDesc; +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; +import org.simantics.scl.compiler.constants.ClassConstant; +import org.simantics.scl.compiler.constants.JavaConstructor; +import org.simantics.scl.compiler.constants.JavaStaticField; +import org.simantics.scl.compiler.constants.JavaStaticMethod; +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; + +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