1 package org.simantics.scl.compiler.environment;
3 import java.util.ArrayList;
4 import java.util.function.Consumer;
6 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
7 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
8 import org.simantics.scl.compiler.elaboration.modules.TypeClass;
9 import org.simantics.scl.compiler.elaboration.modules.TypeDescriptor;
10 import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;
11 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
12 import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
13 import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
14 import org.simantics.scl.compiler.environment.filter.NamespaceFilter;
15 import org.simantics.scl.compiler.environment.filter.NamespaceFilters;
16 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
17 import org.simantics.scl.compiler.module.Module;
18 import org.simantics.scl.compiler.types.TCon;
20 import gnu.trove.map.hash.THashMap;
21 import gnu.trove.procedure.TObjectProcedure;
23 public class NamespaceImpl implements Namespace {
25 private final THashMap<String, Namespace> namespaceMap;
26 private final ModuleImport[] moduleImports;
28 public static class ModuleImport {
29 public final Module module;
30 public NamespaceFilter filter;
32 public ModuleImport(Module module, NamespaceFilter filter) {
38 public NamespaceImpl(THashMap<String, Namespace> namespaceMap,
39 ModuleImport[] moduleImports) {
40 this.namespaceMap = namespaceMap;
41 this.moduleImports = moduleImports;
45 public Namespace getNamespace(String name) {
46 return namespaceMap.get(name);
50 public SCLValue getValue(String name) throws AmbiguousNameException {
51 SCLValue result = null, temp;
52 Module resultModule = null;
53 ArrayList<String> conflictingModules = null;
54 for(ModuleImport moduleImport : moduleImports) {
55 Module module = moduleImport.module;
56 temp = module.getValue(name);
59 && moduleImport.filter.isValueIncluded(name)) {
61 if(conflictingModules == null) {
62 conflictingModules = new ArrayList<String>(2);
63 conflictingModules.add(resultModule.getName());
65 conflictingModules.add(module.getName());
69 resultModule = module;
73 if(conflictingModules != null)
74 throw new AmbiguousNameException(conflictingModules, name);
79 public SCLRelation getRelation(String name) throws AmbiguousNameException {
80 SCLRelation result = null, temp;
81 Module resultModule = null;
82 ArrayList<String> conflictingModules = null;
83 for(ModuleImport moduleImport : moduleImports) {
84 Module module = moduleImport.module;
85 temp = module.getRelation(name);
88 if(conflictingModules == null) {
89 conflictingModules = new ArrayList<String>(2);
90 conflictingModules.add(resultModule.getName());
92 conflictingModules.add(module.getName());
96 resultModule = module;
100 if(conflictingModules != null)
101 throw new AmbiguousNameException(conflictingModules, name);
106 public SCLEntityType getEntityType(String name)
107 throws AmbiguousNameException {
108 SCLEntityType result = null, temp;
109 Module resultModule = null;
110 ArrayList<String> conflictingModules = null;
111 for(ModuleImport moduleImport : moduleImports) {
112 Module module = moduleImport.module;
113 temp = module.getEntityType(name);
116 if(conflictingModules == null) {
117 conflictingModules = new ArrayList<String>(2);
118 conflictingModules.add(resultModule.getName());
120 conflictingModules.add(module.getName());
124 resultModule = module;
128 if(conflictingModules != null)
129 throw new AmbiguousNameException(conflictingModules, name);
134 public TypeDescriptor getTypeDescriptor(String name)
135 throws AmbiguousNameException {
136 TypeDescriptor result = null, temp;
137 Module resultModule = null;
138 ArrayList<String> conflictingModules = null;
139 for(ModuleImport moduleImport : moduleImports) {
140 Module module = moduleImport.module;
141 temp = module.getTypeDescriptor(name);
144 if(conflictingModules == null) {
145 conflictingModules = new ArrayList<String>(2);
146 conflictingModules.add(resultModule.getName());
148 conflictingModules.add(module.getName());
152 resultModule = module;
156 if(conflictingModules != null)
157 throw new AmbiguousNameException(conflictingModules, name);
162 public EffectConstructor getEffectConstructor(String name)
163 throws AmbiguousNameException {
164 EffectConstructor result = null, temp;
165 Module resultModule = null;
166 ArrayList<String> conflictingModules = null;
167 for(ModuleImport moduleImport : moduleImports) {
168 Module module = moduleImport.module;
169 temp = module.getEffectConstructor(name);
172 if(conflictingModules == null) {
173 conflictingModules = new ArrayList<String>(2);
174 conflictingModules.add(resultModule.getName());
176 conflictingModules.add(module.getName());
180 resultModule = module;
184 if(conflictingModules != null)
185 throw new AmbiguousNameException(conflictingModules, name);
190 public TypeClass getTypeClass(String name) throws AmbiguousNameException {
191 TypeClass result = null, temp;
192 Module resultModule = null;
193 ArrayList<String> conflictingModules = null;
194 for(ModuleImport moduleImport : moduleImports) {
195 Module module = moduleImport.module;
196 temp = module.getTypeClass(name);
199 if(conflictingModules == null) {
200 conflictingModules = new ArrayList<String>(2);
201 conflictingModules.add(resultModule.getName());
203 conflictingModules.add(module.getName());
207 resultModule = module;
211 if(conflictingModules != null)
212 throw new AmbiguousNameException(conflictingModules, name);
217 public MappingRelation getMappingRelation(String name) throws AmbiguousNameException {
218 MappingRelation result = null, temp;
219 Module resultModule = null;
220 ArrayList<String> conflictingModules = null;
221 for(ModuleImport moduleImport : moduleImports) {
222 Module module = moduleImport.module;
223 temp = module.getMappingRelation(name);
226 if(conflictingModules == null) {
227 conflictingModules = new ArrayList<String>(2);
228 conflictingModules.add(resultModule.getName());
230 conflictingModules.add(module.getName());
234 resultModule = module;
238 if(conflictingModules != null)
239 throw new AmbiguousNameException(conflictingModules, name);
244 public TransformationRule getRule(String name) throws AmbiguousNameException {
245 TransformationRule result = null, temp;
246 Module resultModule = null;
247 ArrayList<String> conflictingModules = null;
248 for(ModuleImport moduleImport : moduleImports) {
249 Module module = moduleImport.module;
250 temp = module.getRule(name);
253 if(conflictingModules == null) {
254 conflictingModules = new ArrayList<String>(2);
255 conflictingModules.add(resultModule.getName());
257 conflictingModules.add(module.getName());
261 resultModule = module;
265 if(conflictingModules != null)
266 throw new AmbiguousNameException(conflictingModules, name);
271 public CHRRuleset getRuleset(String name) throws AmbiguousNameException {
272 CHRRuleset result = null, temp;
273 Module resultModule = null;
274 ArrayList<String> conflictingModules = null;
275 for(ModuleImport moduleImport : moduleImports) {
276 Module module = moduleImport.module;
277 temp = module.getRuleset(name);
280 if(conflictingModules == null) {
281 conflictingModules = new ArrayList<String>(2);
282 conflictingModules.add(resultModule.getName());
284 conflictingModules.add(module.getName());
288 resultModule = module;
292 if(conflictingModules != null)
293 throw new AmbiguousNameException(conflictingModules, name);
298 public void findValuesForPrefix(String prefix, NamespaceFilter filter, TObjectProcedure<SCLValue> proc) {
299 for(ModuleImport moduleImport : moduleImports)
300 moduleImport.module.findValuesForPrefix(prefix,
301 NamespaceFilters.intersection(filter, moduleImport.filter),
306 public void findTypesForPrefix(String prefix, NamespaceFilter filter, Consumer<TCon> consumer) {
307 for(ModuleImport moduleImport : moduleImports)
308 moduleImport.module.findTypesForPrefix(prefix,
309 NamespaceFilters.intersection(filter, moduleImport.filter),