]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/LazyModule.java
Fixed race condition in getValues/Relations/EntityTypes
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / module / LazyModule.java
1 package org.simantics.scl.compiler.module;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.List;
6 import java.util.concurrent.ConcurrentHashMap;
7 import java.util.function.Function;
8
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;
25
26 import gnu.trove.map.hash.THashMap;
27
28 public abstract class LazyModule implements Module {
29
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>();
34     
35     protected abstract SCLValue createValue(String name);
36     
37     protected SCLRelation createRelation(String name) {
38         return null;
39     }
40     
41     protected SCLEntityType createEntityType(String name) {
42         return null;
43     }
44     
45     @Override
46     public MappingRelation getMappingRelation(String name) {
47         return null;
48     }
49     
50     @Override
51     public TransformationRule getRule(String name) {
52         return null;
53     }
54     
55     public LazyModule(String moduleName) {
56         this.moduleName = moduleName;
57     }
58         
59     @Override
60     public String getName() {
61         return moduleName;
62     }
63     
64     public void findValuesForPrefix(final Collection<SCLValue> values, final String prefix) {           
65     }
66
67     private final Function<String, SCLValue> createValue = this::createValue;
68     
69     @Override
70     public SCLValue getValue(String name) {
71         return values.computeIfAbsent(name, createValue);
72     }
73     
74     @Override
75     public List<Constant> getFieldAccessors(String name) {
76         return null;
77     }
78     
79     private final Function<String, SCLRelation> createRelation = this::createRelation;
80     
81     public SCLRelation getRelation(String name) {
82         return relations.computeIfAbsent(name, createRelation);
83     }
84     
85     private final Function<String, SCLEntityType> createEntityType = this::createEntityType;
86     
87     public SCLEntityType getEntityType(String name) {
88         return entityTypes.computeIfAbsent(name, createEntityType);
89     } 
90
91     @Override
92     public TypeClass getTypeClass(String name) {
93         return null;
94     }
95    
96     @Override
97     public Collection<TypeClassInstance> getInstances(TCon typeClass) {
98         return Collections.emptyList();
99     }
100
101     @Override
102     public TypeDescriptor getTypeDescriptor(String name) {
103         return null;
104     }
105
106     @Override
107     public Documentation getDocumentation() {
108         return null;
109     }
110     
111     @Override
112     public byte[] getClass(String name) {
113         return null;
114     }
115     
116     @Override
117     public ModuleInitializer getModuleInitializer() {
118         return null;
119     }
120     
121     @Override
122     public EffectConstructor getEffectConstructor(String name) {
123         return null;
124     }
125     
126     @Override
127     public Collection<TransformationRule> getRules() {
128         return Collections.emptyList();
129     }
130     
131     @Override
132     public THashMap<String, BranchPoint[]> getBranchPoints() {
133         return null;
134     }
135     
136     @Override
137     public CompilationError[] getWarnings() {
138         return CompilationError.EMPTY_ARRAY;
139     }
140     
141     @Override
142     public CHRRuleset getRuleset(String name) {
143         return null;
144     }
145     
146     @Override
147     public String getDeprecation() {
148         return null;
149     }
150 }