1 package org.simantics.scl.compiler.source.repository;
3 import java.util.Collection;
4 import java.util.Collections;
7 import org.simantics.scl.compiler.common.names.Name;
8 import org.simantics.scl.compiler.elaboration.expressions.EExternalConstant;
9 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
10 import org.simantics.scl.compiler.errors.Failable;
11 import org.simantics.scl.compiler.module.ConcreteModule;
12 import org.simantics.scl.compiler.module.repository.ModuleRepository;
13 import org.simantics.scl.compiler.module.repository.UpdateListener;
14 import org.simantics.scl.compiler.runtime.RuntimeModule;
15 import org.simantics.scl.compiler.source.ModuleSource;
16 import org.simantics.scl.compiler.source.PrecompiledModuleSource;
17 import org.simantics.scl.compiler.source.repository.procedural.ProceduralValueDefinition;
18 import org.simantics.scl.compiler.top.ValueNotFound;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
22 public abstract class ProceduralModuleSourceRepository implements ModuleSourceRepository {
24 private static final Logger LOGGER = LoggerFactory.getLogger(ProceduralModuleSourceRepository.class);
26 public static final String PREFIX = "procedural:";
28 protected abstract ModuleRepository getModuleRepository(UpdateListener listener);
31 public Collection<String> getModuleNames() {
32 return Collections.emptyList();
36 public ModuleSource getModuleSource(String moduleName, UpdateListener listener) {
37 if(!moduleName.startsWith(PREFIX))
40 String sourceModuleName = moduleName.substring(PREFIX.length());
41 Failable<RuntimeModule> sourceModuleF = getModuleRepository(listener)
42 .getRuntimeModule(sourceModuleName, listener);
43 if(!sourceModuleF.didSucceed())
46 RuntimeModule sourceModule = sourceModuleF.getResult();
49 values = sourceModule.getValue("values");
50 } catch (ValueNotFound e) {
51 return null; // normal
52 } catch (Throwable e) {
54 LOGGER.error("Failed to find value " + moduleName + "/values", e);
58 if(!(values instanceof List))
61 ConcreteModule module = new ConcreteModule(moduleName);
62 for(Object item : (List)values) {
63 if(!(item instanceof ProceduralValueDefinition))
65 ProceduralValueDefinition def = (ProceduralValueDefinition)item;
67 SCLValue value = new SCLValue(Name.create(moduleName, def.name));
68 value.setType(def.type);
69 value.setExpression(new EExternalConstant(def.value, def.type));
70 value.setInlineInSimplification(true);
71 module.addValue(value);
73 module.setParentClassLoader(getClass().getClassLoader());
74 return new PrecompiledModuleSource(module);