1 package org.simantics.scl.compiler.module;
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Collections;
8 import java.util.function.Consumer;
10 import org.simantics.scl.compiler.common.names.Name;
11 import org.simantics.scl.compiler.constants.Constant;
12 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
13 import org.simantics.scl.compiler.elaboration.modules.Documentation;
14 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
15 import org.simantics.scl.compiler.elaboration.modules.TypeAlias;
16 import org.simantics.scl.compiler.elaboration.modules.TypeClass;
17 import org.simantics.scl.compiler.elaboration.modules.TypeClassInstance;
18 import org.simantics.scl.compiler.elaboration.modules.TypeDescriptor;
19 import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;
20 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
21 import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
22 import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
23 import org.simantics.scl.compiler.environment.filter.NamespaceFilter;
24 import org.simantics.scl.compiler.errors.CompilationError;
25 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
26 import org.simantics.scl.compiler.module.debug.ModuleDebugInfo;
27 import org.simantics.scl.compiler.top.ModuleInitializer;
28 import org.simantics.scl.compiler.types.TCon;
29 import org.simantics.scl.compiler.types.TVar;
30 import org.simantics.scl.compiler.types.Type;
31 import org.simantics.scl.compiler.types.Types;
32 import org.simantics.scl.runtime.profiling.BranchPoint;
34 import gnu.trove.map.hash.THashMap;
35 import gnu.trove.procedure.TObjectObjectProcedure;
36 import gnu.trove.procedure.TObjectProcedure;
38 public class ConcreteModule implements Module {
40 String defaultLocalName;
42 THashMap<String, TypeDescriptor> typeDescriptors = new THashMap<String, TypeDescriptor>();
43 THashMap<String, EffectConstructor> effectConstructors = new THashMap<String, EffectConstructor>();
44 THashMap<String, TypeClass> typeClasses = new THashMap<String, TypeClass>();
45 THashMap<TCon, ArrayList<TypeClassInstance>> typeClassInstances = new THashMap<TCon, ArrayList<TypeClassInstance>>();
46 THashMap<String, SCLValue> values = new THashMap<String, SCLValue>();
47 THashMap<String, List<Constant>> fieldAccessors = new THashMap<String, List<Constant>>();
48 THashMap<String, SCLRelation> relations = new THashMap<String, SCLRelation>(2);
49 THashMap<String, SCLEntityType> entityTypes = new THashMap<String, SCLEntityType>(2);
50 THashMap<String, TransformationRule> rules = new THashMap<String, TransformationRule>(2);
51 THashMap<String, MappingRelation> mappingRelations = new THashMap<String, MappingRelation>(2);
52 THashMap<String, CHRRuleset> rulesets = new THashMap<String, CHRRuleset>(2);
53 ArrayList<ImportDeclaration> dependencies = new ArrayList<ImportDeclaration>();
54 THashMap<String, BranchPoint[]> branchPoints;
55 CompilationError[] warnings = CompilationError.EMPTY_ARRAY;
57 Map<String, byte[]> classes = Collections.emptyMap();
58 ClassLoader parentClassLoader;
59 ModuleInitializer moduleInitializer;
61 protected Documentation documentation;
63 public ModuleDebugInfo moduleDebugInfo;
65 public ConcreteModule(String moduleName) {
66 this.moduleName = moduleName;
70 public String getDefaultLocalName() {
71 return defaultLocalName;
74 public void setDefaultLocalName(String defaultLocalName) {
75 this.defaultLocalName = defaultLocalName;
78 public boolean addTypeDescriptor(String name, TypeDescriptor typeConstructor) {
79 return typeDescriptors.put(name, typeConstructor) != null;
82 public boolean addEffectConstructor(String name, EffectConstructor effectConstructor) {
83 return effectConstructors.put(name, effectConstructor) != null;
86 public void addTypeAlias(String name, TVar[] parameters, Type body) {
87 typeDescriptors.put(name, new TypeAlias(Types.con(moduleName, name), parameters, body));
90 public boolean addTypeClass(String name, TypeClass typeClass) {
91 return typeClasses.put(name, typeClass) != null;
94 public void addTypeClassInstance(TCon typeClass, TypeClassInstance typeClassInstance) {
95 ArrayList<TypeClassInstance> instances = typeClassInstances.get(typeClass);
96 if(instances == null) {
97 instances = new ArrayList<TypeClassInstance>();
98 typeClassInstances.put(typeClass, instances);
100 instances.add(typeClassInstance);
103 public boolean addRule(TransformationRule rule) {
104 return rules.put(rule.name.name, rule) != null;
107 public boolean addMappingRelation(MappingRelation relation) {
108 return mappingRelations.put(relation.name.name, relation) != null;
111 public Collection<TCon> getTypeClassesWithInstances() {
112 return typeClassInstances.keySet();
115 public boolean addValue(SCLValue value) {
116 return values.put(value.getName().name, value) != null;
119 public SCLValue addValue(String name, Constant constant) {
120 SCLValue value = new SCLValue(Name.create(moduleName, name), constant);
126 public List<Constant> getFieldAccessors(String name) {
127 return fieldAccessors.get(name);
130 public void addRelation(String name, SCLRelation relation) {
131 relations.put(name, relation);
134 public void addEntityType(String name, SCLEntityType entityType) {
135 entityTypes.put(name, entityType);
138 public void addDependency(ImportDeclaration module) {
139 if(!dependencies.contains(module))
140 dependencies.add(module);
143 public Collection<SCLValue> getValues() {
144 return values.values();
147 public Collection<TransformationRule> getRules() {
148 return rules.values();
151 public Collection<MappingRelation> getMappingRelations() {
152 return mappingRelations.values();
156 public String getName() {
161 public SCLValue getValue(String name) {
162 return values.get(name);
166 public SCLRelation getRelation(String name) {
167 return relations.get(name);
171 public MappingRelation getMappingRelation(String name) {
172 return mappingRelations.get(name);
176 public TransformationRule getRule(String name) {
177 return rules.get(name);
181 public SCLEntityType getEntityType(String name) {
182 return entityTypes.get(name);
185 public TypeClass getTypeClass(String name) {
186 return typeClasses.get(name);
190 public Collection<TypeClassInstance> getInstances(TCon typeClass) {
191 Collection<TypeClassInstance> result = typeClassInstances.get(typeClass);
193 return Collections.emptyList();
199 public TypeDescriptor getTypeDescriptor(String name) {
200 return typeDescriptors.get(name);
204 public EffectConstructor getEffectConstructor(String name) {
205 return effectConstructors.get(name);
209 public CHRRuleset getRuleset(String name) {
210 return rulesets.get(name);
213 public Collection<TypeClass> getTypeClasses() {
214 return typeClasses.values();
217 public THashMap<TCon, ArrayList<TypeClassInstance>> getTypeInstances() {
218 return typeClassInstances;
222 public List<ImportDeclaration> getDependencies() {
226 public void setDocumentation(Documentation documentation) {
227 this.documentation = documentation;
230 public Documentation getDocumentation() {
231 return documentation;
234 public void setClasses(Map<String, byte[]> classes) {
235 this.classes = classes;
239 public byte[] getClass(String name) {
240 return classes.get(name);
243 public void setModuleInitializer(ModuleInitializer moduleInitializer) {
244 this.moduleInitializer = moduleInitializer;
248 public ModuleInitializer getModuleInitializer() {
249 return moduleInitializer;
253 public String toString() {
258 public void findValuesForPrefix(final String prefix, final NamespaceFilter filter,
259 final TObjectProcedure<SCLValue> proc) {
260 this.values.forEachEntry(new TObjectObjectProcedure<String,SCLValue>() {
262 public boolean execute(String name, SCLValue value) {
263 if(value.isPrivateOrDerived())
265 String lowerPrefix = prefix.toLowerCase();
266 String lowerName = name.toLowerCase();
267 if(lowerName.startsWith(lowerPrefix) && filter.isValueIncluded(name))
275 public void findValuesForPrefix(String prefix, NamespaceFilter filter, Consumer<SCLValue> consumer) {
276 values.values().forEach((Consumer<SCLValue>) (value) -> {
277 String lowerPrefix = prefix.toLowerCase();
278 String lowerName = value.getName().name.toLowerCase();
279 if(lowerName.startsWith(lowerPrefix) && filter.isValueIncluded(value.getName().name))
280 consumer.accept(value);
285 public List<String> getValueNames() {
286 return new ArrayList<String>(values.keySet());
289 public Collection<SCLRelation> getRelations() {
290 return relations.values();
294 public void findTypesForPrefix(String prefix, NamespaceFilter filter, Consumer<TCon> consumer) {
295 typeDescriptors.values().forEach(type -> {
296 TCon tcon = type.name;
297 if (tcon.name.toLowerCase().startsWith(prefix.toLowerCase()) && filter.isValueIncluded(tcon.name))
298 consumer.accept(tcon);
302 public void setBranchPoints(THashMap<String, BranchPoint[]> branchPoints) {
303 this.branchPoints = branchPoints;
307 public THashMap<String, BranchPoint[]> getBranchPoints() {
312 public void dispose() {
315 public void setWarnings(CompilationError[] warnings) {
316 this.warnings = warnings;
319 public CompilationError[] getWarnings() {
324 public ClassLoader getParentClassLoader() {
325 return parentClassLoader;
328 public void setParentClassLoader(ClassLoader parentClassLoader) {
329 if(parentClassLoader == null)
330 throw new NullPointerException();
331 this.parentClassLoader = parentClassLoader;
334 public void addFieldAccessor(String name, Constant accessor) {
335 List<Constant> list = fieldAccessors.get(name);
337 list = new ArrayList<Constant>(2);
338 fieldAccessors.put(name, list);
343 public void addRuleset(String name, CHRRuleset ruleset) {
344 rulesets.put(name, ruleset);
348 public String getDeprecation() {
352 public void setDeprecation(String deprecation) {
353 this.deprecation = deprecation;
357 public ModuleDebugInfo getModuleDebugInfo() {
358 return moduleDebugInfo;