1 package org.simantics.scl.compiler.module;
3 import java.util.Collection;
4 import java.util.Collections;
6 import java.util.concurrent.ConcurrentHashMap;
7 import java.util.function.Function;
9 import org.simantics.scl.compiler.constants.Constant;
10 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
11 import org.simantics.scl.compiler.elaboration.modules.Documentation;
12 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
13 import org.simantics.scl.compiler.elaboration.modules.TypeClass;
14 import org.simantics.scl.compiler.elaboration.modules.TypeClassInstance;
15 import org.simantics.scl.compiler.elaboration.modules.TypeDescriptor;
16 import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;
17 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
18 import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
19 import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
20 import org.simantics.scl.compiler.errors.CompilationError;
21 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
22 import org.simantics.scl.compiler.top.ModuleInitializer;
23 import org.simantics.scl.compiler.types.TCon;
24 import org.simantics.scl.runtime.profiling.BranchPoint;
26 import gnu.trove.map.hash.THashMap;
28 public abstract class LazyModule implements Module {
30 private final String moduleName;
31 private final ConcurrentHashMap<String, SCLValue> values = new ConcurrentHashMap<String, SCLValue>();
32 private final ConcurrentHashMap<String, SCLRelation> relations = new ConcurrentHashMap<String, SCLRelation>();
33 private final ConcurrentHashMap<String, SCLEntityType> entityTypes = new ConcurrentHashMap<String, SCLEntityType>();
35 protected abstract SCLValue createValue(String name);
37 protected SCLRelation createRelation(String name) {
41 protected SCLEntityType createEntityType(String name) {
46 public MappingRelation getMappingRelation(String name) {
51 public TransformationRule getRule(String name) {
55 public LazyModule(String moduleName) {
56 this.moduleName = moduleName;
60 public String getName() {
64 public void findValuesForPrefix(final Collection<SCLValue> values, final String prefix) {
67 private final Function<String, SCLValue> createValue = this::createValue;
70 public SCLValue getValue(String name) {
71 return values.computeIfAbsent(name, createValue);
75 public List<Constant> getFieldAccessors(String name) {
79 private final Function<String, SCLRelation> createRelation = this::createRelation;
81 public SCLRelation getRelation(String name) {
82 return relations.computeIfAbsent(name, createRelation);
85 private final Function<String, SCLEntityType> createEntityType = this::createEntityType;
87 public SCLEntityType getEntityType(String name) {
88 return entityTypes.computeIfAbsent(name, createEntityType);
92 public TypeClass getTypeClass(String name) {
97 public Collection<TypeClassInstance> getInstances(TCon typeClass) {
98 return Collections.emptyList();
102 public TypeDescriptor getTypeDescriptor(String name) {
107 public Documentation getDocumentation() {
112 public byte[] getClass(String name) {
117 public ModuleInitializer getModuleInitializer() {
122 public EffectConstructor getEffectConstructor(String name) {
127 public Collection<TransformationRule> getRules() {
128 return Collections.emptyList();
132 public THashMap<String, BranchPoint[]> getBranchPoints() {
137 public CompilationError[] getWarnings() {
138 return CompilationError.EMPTY_ARRAY;
142 public CHRRuleset getRuleset(String name) {
147 public String getDeprecation() {