]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ProceduralModuleSourceRepository.java
(refs #7562) Procedural SCL modules
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / repository / ProceduralModuleSourceRepository.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ProceduralModuleSourceRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ProceduralModuleSourceRepository.java
new file mode 100644 (file)
index 0000000..4899f88
--- /dev/null
@@ -0,0 +1,69 @@
+package org.simantics.scl.compiler.source.repository;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.simantics.scl.compiler.common.names.Name;
+import org.simantics.scl.compiler.elaboration.expressions.EExternalConstant;
+import org.simantics.scl.compiler.elaboration.modules.SCLValue;
+import org.simantics.scl.compiler.errors.Failable;
+import org.simantics.scl.compiler.module.ConcreteModule;
+import org.simantics.scl.compiler.module.repository.ModuleRepository;
+import org.simantics.scl.compiler.module.repository.UpdateListener;
+import org.simantics.scl.compiler.runtime.RuntimeModule;
+import org.simantics.scl.compiler.source.ModuleSource;
+import org.simantics.scl.compiler.source.PrecompiledModuleSource;
+import org.simantics.scl.compiler.source.repository.procedural.ProceduralValueDefinition;
+import org.simantics.scl.compiler.top.ValueNotFound;
+
+public abstract class ProceduralModuleSourceRepository implements ModuleSourceRepository {
+
+    public static final String PREFIX = "procedural:";
+    
+    protected abstract ModuleRepository getModuleRepository(UpdateListener listener);
+    
+    @Override
+    public Collection<String> getModuleNames() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public ModuleSource getModuleSource(String moduleName, UpdateListener listener) {
+        if(!moduleName.startsWith(PREFIX))
+            return null;
+        
+        String sourceModuleName = moduleName.substring(PREFIX.length());
+        Failable<RuntimeModule> sourceModuleF = getModuleRepository(listener)
+                .getRuntimeModule(sourceModuleName, listener);
+        if(!sourceModuleF.didSucceed())
+            return null;
+        
+        RuntimeModule sourceModule = sourceModuleF.getResult();
+        Object values;
+        try {
+            values = sourceModule.getValue("values");
+        } catch (ValueNotFound e) {
+            return null;
+        }
+        
+        if(!(values instanceof List))
+            return null;
+        
+        ConcreteModule module = new ConcreteModule(moduleName);
+        for(Object item : (List)values) {
+            if(!(item instanceof ProceduralValueDefinition))
+                return null;
+            ProceduralValueDefinition def = (ProceduralValueDefinition)item;
+
+            SCLValue value = new SCLValue(Name.create(moduleName, def.name));
+            value.setType(def.type);
+            value.setExpression(new EExternalConstant(def.value, def.type));
+            value.setInlineInSimplification(true);
+            module.addValue(value);
+        }
+        module.setParentClassLoader(getClass().getClassLoader());
+        return new PrecompiledModuleSource(module);
+    }
+
+}