1 package org.simantics.scl.compiler.environment;
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.function.Consumer;
7 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
8 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
9 import org.simantics.scl.compiler.elaboration.modules.TypeClass;
10 import org.simantics.scl.compiler.elaboration.modules.TypeDescriptor;
11 import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;
12 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
13 import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
14 import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
15 import org.simantics.scl.compiler.environment.filter.NamespaceFilter;
16 import org.simantics.scl.compiler.environment.filter.NamespaceFilters;
17 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
18 import org.simantics.scl.compiler.module.Module;
19 import org.simantics.scl.compiler.types.TCon;
21 import gnu.trove.map.hash.THashMap;
22 import gnu.trove.procedure.TObjectProcedure;
24 public class NamespaceImpl implements Namespace {
26 private final THashMap<String, Namespace> namespaceMap;
27 private final ModuleImport[] moduleImports;
29 public static class ModuleImport {
30 public final Module module;
31 public NamespaceFilter filter;
33 public ModuleImport(Module module, NamespaceFilter filter) {
39 public NamespaceImpl(THashMap<String, Namespace> namespaceMap,
40 ModuleImport[] moduleImports) {
41 this.namespaceMap = namespaceMap;
42 this.moduleImports = moduleImports;
46 public Namespace getNamespace(String name) {
47 return namespaceMap.get(name);
51 public Collection<String> getNamespaces() {
52 return namespaceMap.keySet();
56 public SCLValue getValue(String name) throws AmbiguousNameException {
57 SCLValue result = null, temp;
58 Module resultModule = null;
59 ArrayList<String> conflictingModules = null;
60 for(ModuleImport moduleImport : moduleImports) {
61 Module module = moduleImport.module;
62 temp = module.getValue(name);
65 && moduleImport.filter.isValueIncluded(name)) {
67 if(conflictingModules == null) {
68 conflictingModules = new ArrayList<String>(2);
69 conflictingModules.add(resultModule.getName());
71 conflictingModules.add(module.getName());
75 resultModule = module;
79 if(conflictingModules != null)
80 throw new AmbiguousNameException(conflictingModules, name);
85 public SCLRelation getRelation(String name) throws AmbiguousNameException {
86 SCLRelation result = null, temp;
87 Module resultModule = null;
88 ArrayList<String> conflictingModules = null;
89 for(ModuleImport moduleImport : moduleImports) {
90 Module module = moduleImport.module;
91 temp = module.getRelation(name);
94 if(conflictingModules == null) {
95 conflictingModules = new ArrayList<String>(2);
96 conflictingModules.add(resultModule.getName());
98 conflictingModules.add(module.getName());
102 resultModule = module;
106 if(conflictingModules != null)
107 throw new AmbiguousNameException(conflictingModules, name);
112 public SCLEntityType getEntityType(String name)
113 throws AmbiguousNameException {
114 SCLEntityType result = null, temp;
115 Module resultModule = null;
116 ArrayList<String> conflictingModules = null;
117 for(ModuleImport moduleImport : moduleImports) {
118 Module module = moduleImport.module;
119 temp = module.getEntityType(name);
122 if(conflictingModules == null) {
123 conflictingModules = new ArrayList<String>(2);
124 conflictingModules.add(resultModule.getName());
126 conflictingModules.add(module.getName());
130 resultModule = module;
134 if(conflictingModules != null)
135 throw new AmbiguousNameException(conflictingModules, name);
140 public TypeDescriptor getTypeDescriptor(String name)
141 throws AmbiguousNameException {
142 TypeDescriptor result = null, temp;
143 Module resultModule = null;
144 ArrayList<String> conflictingModules = null;
145 for(ModuleImport moduleImport : moduleImports) {
146 Module module = moduleImport.module;
147 temp = module.getTypeDescriptor(name);
150 if(conflictingModules == null) {
151 conflictingModules = new ArrayList<String>(2);
152 conflictingModules.add(resultModule.getName());
154 conflictingModules.add(module.getName());
158 resultModule = module;
162 if(conflictingModules != null)
163 throw new AmbiguousNameException(conflictingModules, name);
168 public EffectConstructor getEffectConstructor(String name)
169 throws AmbiguousNameException {
170 EffectConstructor result = null, temp;
171 Module resultModule = null;
172 ArrayList<String> conflictingModules = null;
173 for(ModuleImport moduleImport : moduleImports) {
174 Module module = moduleImport.module;
175 temp = module.getEffectConstructor(name);
178 if(conflictingModules == null) {
179 conflictingModules = new ArrayList<String>(2);
180 conflictingModules.add(resultModule.getName());
182 conflictingModules.add(module.getName());
186 resultModule = module;
190 if(conflictingModules != null)
191 throw new AmbiguousNameException(conflictingModules, name);
196 public TypeClass getTypeClass(String name) throws AmbiguousNameException {
197 TypeClass result = null, temp;
198 Module resultModule = null;
199 ArrayList<String> conflictingModules = null;
200 for(ModuleImport moduleImport : moduleImports) {
201 Module module = moduleImport.module;
202 temp = module.getTypeClass(name);
205 if(conflictingModules == null) {
206 conflictingModules = new ArrayList<String>(2);
207 conflictingModules.add(resultModule.getName());
209 conflictingModules.add(module.getName());
213 resultModule = module;
217 if(conflictingModules != null)
218 throw new AmbiguousNameException(conflictingModules, name);
223 public MappingRelation getMappingRelation(String name) throws AmbiguousNameException {
224 MappingRelation result = null, temp;
225 Module resultModule = null;
226 ArrayList<String> conflictingModules = null;
227 for(ModuleImport moduleImport : moduleImports) {
228 Module module = moduleImport.module;
229 temp = module.getMappingRelation(name);
232 if(conflictingModules == null) {
233 conflictingModules = new ArrayList<String>(2);
234 conflictingModules.add(resultModule.getName());
236 conflictingModules.add(module.getName());
240 resultModule = module;
244 if(conflictingModules != null)
245 throw new AmbiguousNameException(conflictingModules, name);
250 public TransformationRule getRule(String name) throws AmbiguousNameException {
251 TransformationRule result = null, temp;
252 Module resultModule = null;
253 ArrayList<String> conflictingModules = null;
254 for(ModuleImport moduleImport : moduleImports) {
255 Module module = moduleImport.module;
256 temp = module.getRule(name);
259 if(conflictingModules == null) {
260 conflictingModules = new ArrayList<String>(2);
261 conflictingModules.add(resultModule.getName());
263 conflictingModules.add(module.getName());
267 resultModule = module;
271 if(conflictingModules != null)
272 throw new AmbiguousNameException(conflictingModules, name);
277 public CHRRuleset getRuleset(String name) throws AmbiguousNameException {
278 CHRRuleset result = null, temp;
279 Module resultModule = null;
280 ArrayList<String> conflictingModules = null;
281 for(ModuleImport moduleImport : moduleImports) {
282 Module module = moduleImport.module;
283 temp = module.getRuleset(name);
286 if(conflictingModules == null) {
287 conflictingModules = new ArrayList<String>(2);
288 conflictingModules.add(resultModule.getName());
290 conflictingModules.add(module.getName());
294 resultModule = module;
298 if(conflictingModules != null)
299 throw new AmbiguousNameException(conflictingModules, name);
304 public void findValuesForPrefix(String prefix, NamespaceFilter filter, TObjectProcedure<SCLValue> proc) {
305 for(ModuleImport moduleImport : moduleImports)
306 moduleImport.module.findValuesForPrefix(prefix,
307 NamespaceFilters.intersection(filter, moduleImport.filter),
312 public void findTypesForPrefix(String prefix, NamespaceFilter filter, Consumer<TCon> consumer) {
313 for(ModuleImport moduleImport : moduleImports)
314 moduleImport.module.findTypesForPrefix(prefix,
315 NamespaceFilters.intersection(filter, moduleImport.filter),