]> gerrit.simantics Code Review - simantics/platform.git/blob
4899f88ba66e898f281c0156d527a43f773c7fa9
[simantics/platform.git] /
1 package org.simantics.scl.compiler.source.repository;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.List;
6
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
20 public abstract class ProceduralModuleSourceRepository implements ModuleSourceRepository {
21
22     public static final String PREFIX = "procedural:";
23     
24     protected abstract ModuleRepository getModuleRepository(UpdateListener listener);
25     
26     @Override
27     public Collection<String> getModuleNames() {
28         return Collections.emptyList();
29     }
30
31     @Override
32     public ModuleSource getModuleSource(String moduleName, UpdateListener listener) {
33         if(!moduleName.startsWith(PREFIX))
34             return null;
35         
36         String sourceModuleName = moduleName.substring(PREFIX.length());
37         Failable<RuntimeModule> sourceModuleF = getModuleRepository(listener)
38                 .getRuntimeModule(sourceModuleName, listener);
39         if(!sourceModuleF.didSucceed())
40             return null;
41         
42         RuntimeModule sourceModule = sourceModuleF.getResult();
43         Object values;
44         try {
45             values = sourceModule.getValue("values");
46         } catch (ValueNotFound e) {
47             return null;
48         }
49         
50         if(!(values instanceof List))
51             return null;
52         
53         ConcreteModule module = new ConcreteModule(moduleName);
54         for(Object item : (List)values) {
55             if(!(item instanceof ProceduralValueDefinition))
56                 return null;
57             ProceduralValueDefinition def = (ProceduralValueDefinition)item;
58
59             SCLValue value = new SCLValue(Name.create(moduleName, def.name));
60             value.setType(def.type);
61             value.setExpression(new EExternalConstant(def.value, def.type));
62             value.setInlineInSimplification(true);
63             module.addValue(value);
64         }
65         module.setParentClassLoader(getClass().getClassLoader());
66         return new PrecompiledModuleSource(module);
67     }
68
69 }