X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fsource%2Frepository%2FProceduralModuleSourceRepository.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fsource%2Frepository%2FProceduralModuleSourceRepository.java;h=4899f88ba66e898f281c0156d527a43f773c7fa9;hb=a3eb5a6a3c7732b953c57558cdff8e82ae743227;hp=0000000000000000000000000000000000000000;hpb=bf8a8b92f405dfd96198d5e1b377ce2f1059675b;p=simantics%2Fplatform.git 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 index 000000000..4899f88ba --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ProceduralModuleSourceRepository.java @@ -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 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 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); + } + +}