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%2Ftypes%2Fkinds%2FKinds.java;h=4707110f8d9f374af01c761fb1200038d7a5f1ce;hp=edf63df740a4d871910eddde4be0708341f09ab9;hb=9a175feb652b2b7bba7afa540831b9076be3c10e;hpb=0b72d3e4ec886838314ffeba0fa201e32c0aae3e diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/kinds/Kinds.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/kinds/Kinds.java index edf63df74..4707110f8 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/kinds/Kinds.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/types/kinds/Kinds.java @@ -1,5 +1,6 @@ package org.simantics.scl.compiler.types.kinds; +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.types.exceptions.KindUnificationException; public class Kinds { @@ -77,5 +78,24 @@ public class Kinds { public static boolean equals(Kind a, Kind b) { return equalsCanonical(canonical(a), canonical(b)); + } + + public static Kind rangeOfArrow(Kind kind) { + kind = canonical(kind); + if(kind instanceof KArrow) + return ((KArrow)kind).range; + else if(kind instanceof KMetaVar) { + Kind domain = Kinds.metaVar(); + Kind range = Kinds.metaVar(); + try { + ((KMetaVar)kind).setRef(arrow(domain, range)); + } catch (KindUnificationException e) { + // Should not fail because kind is canonical + e.printStackTrace(); + } + return range; + } + else + throw new InternalCompilerError("Assumed arrow kind but encountered " + kind + "."); } }