X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fscl%2FSCLUtil.java;fp=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fscl%2FSCLUtil.java;h=99563462bd666779d13cce0838ba8901a5017995;hb=579836f2cf1d9c60f1f60bc107e1fff869b8c6a0;hp=0000000000000000000000000000000000000000;hpb=8da9a6a979f4513be2e0ab5533acc5e4763cf00e;p=simantics%2F3d.git diff --git a/org.simantics.g3d/src/org/simantics/g3d/scl/SCLUtil.java b/org.simantics.g3d/src/org/simantics/g3d/scl/SCLUtil.java new file mode 100644 index 00000000..99563462 --- /dev/null +++ b/org.simantics.g3d/src/org/simantics/g3d/scl/SCLUtil.java @@ -0,0 +1,79 @@ +package org.simantics.g3d.scl; + +import java.util.HashMap; +import java.util.Map; + +import org.cojen.classfile.TypeDesc; +import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification; +import org.simantics.scl.compiler.errors.Failable; +import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator; +import org.simantics.scl.compiler.module.Module; +import org.simantics.scl.compiler.module.repository.ImportFailureException; +import org.simantics.scl.compiler.runtime.RuntimeEnvironment; +import org.simantics.scl.compiler.types.TCon; +import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.osgi.SCLOsgi; + +public class SCLUtil { + + static Map> typeMap = new HashMap>(); + // copied from org.simantics.scl.db.SCLFunctions + public static Class possibleFromDynamic(Type expectedType, String moduleName) { + + try { + + + Failable failable = SCLOsgi.MODULE_REPOSITORY.getModule(moduleName); + Module module = failable.getResult(); + + RuntimeEnvironment env = SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment( + EnvironmentSpecification.of(moduleName, ""), module.getParentClassLoader()); + + JavaTypeTranslator tr = new JavaTypeTranslator(env.getEnvironment()); + TypeDesc desc = tr.toTypeDesc(expectedType); + String className = desc.getFullName(); + Class clazz = env.getMutableClassLoader().loadClass(className); + return clazz; + } catch (ImportFailureException e) { + return null; + } catch (ClassNotFoundException e) { + return null; + } + } + + public static Class possibleClass(TCon type) { + Class clazz = typeMap.get(type); + if (clazz == null) { + clazz = possibleFromDynamic(type, type.module); + typeMap.put(type, clazz); + } + return clazz; + } + + public static boolean javaIsInstanceOf(org.simantics.scl.compiler.types.Type t, Object o) { + if (t instanceof TCon) { + Class clazz = possibleClass((TCon)t); + if (clazz == null) + return false; + if (!clazz.isAssignableFrom(o.getClass())) + return false; + + return true; + } + return false; + } + + public static Object javaSafeCoerce(org.simantics.scl.compiler.types.Type t, Object o) { + if (t instanceof TCon) { + Class clazz = possibleClass((TCon)t); + if (clazz == null) + return null; + if (!clazz.isAssignableFrom(o.getClass())) + return null; + + return o; + } + return null; + } + +}