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.modules.SCLValue;
7 import org.simantics.scl.compiler.elaboration.modules.TypeClass;
8 import org.simantics.scl.compiler.elaboration.modules.TypeDescriptor;
9 import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;
10 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
11 import org.simantics.scl.compiler.elaboration.rules.MappingRelation;
12 import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
13 import org.simantics.scl.compiler.environment.filter.NamespaceFilter;
14 import org.simantics.scl.compiler.environment.filter.NamespaceFilters;
15 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
16 import org.simantics.scl.compiler.module.Module;
17 import org.simantics.scl.compiler.types.TCon;
19 import gnu.trove.map.hash.THashMap;
20 import gnu.trove.procedure.TObjectProcedure;
22 public class NamespaceImpl implements Namespace {
24 private final THashMap<String, Namespace> namespaceMap;
25 private final ModuleImport[] moduleImports;
27 public static class ModuleImport {
28 public final Module module;
29 public NamespaceFilter filter;
31 public ModuleImport(Module module, NamespaceFilter filter) {
37 public NamespaceImpl(THashMap<String, Namespace> namespaceMap,
38 ModuleImport[] moduleImports) {
39 this.namespaceMap = namespaceMap;
40 this.moduleImports = moduleImports;
44 public Namespace getNamespace(String name) {
45 return namespaceMap.get(name);
49 public SCLValue getValue(String name) throws AmbiguousNameException {
50 SCLValue result = null, temp;
51 Module resultModule = null;
52 ArrayList<String> conflictingModules = null;
53 for(ModuleImport moduleImport : moduleImports) {
54 Module module = moduleImport.module;
55 temp = module.getValue(name);
58 && moduleImport.filter.isValueIncluded(name)) {
60 if(conflictingModules == null) {
61 conflictingModules = new ArrayList<String>(2);
62 conflictingModules.add(resultModule.getName());
64 conflictingModules.add(module.getName());
68 resultModule = module;
72 if(conflictingModules != null)
73 throw new AmbiguousNameException(conflictingModules, name);
78 public SCLRelation getRelation(String name) throws AmbiguousNameException {
79 SCLRelation result = null, temp;
80 Module resultModule = null;
81 ArrayList<String> conflictingModules = null;
82 for(ModuleImport moduleImport : moduleImports) {
83 Module module = moduleImport.module;
84 temp = module.getRelation(name);
87 if(conflictingModules == null) {
88 conflictingModules = new ArrayList<String>(2);
89 conflictingModules.add(resultModule.getName());
91 conflictingModules.add(module.getName());
95 resultModule = module;
99 if(conflictingModules != null)
100 throw new AmbiguousNameException(conflictingModules, name);
105 public SCLEntityType getEntityType(String name)
106 throws AmbiguousNameException {
107 SCLEntityType result = null, temp;
108 Module resultModule = null;
109 ArrayList<String> conflictingModules = null;
110 for(ModuleImport moduleImport : moduleImports) {
111 Module module = moduleImport.module;
112 temp = module.getEntityType(name);
115 if(conflictingModules == null) {
116 conflictingModules = new ArrayList<String>(2);
117 conflictingModules.add(resultModule.getName());
119 conflictingModules.add(module.getName());
123 resultModule = module;
127 if(conflictingModules != null)
128 throw new AmbiguousNameException(conflictingModules, name);
133 public TypeDescriptor getTypeDescriptor(String name)
134 throws AmbiguousNameException {
135 TypeDescriptor result = null, temp;
136 Module resultModule = null;
137 ArrayList<String> conflictingModules = null;
138 for(ModuleImport moduleImport : moduleImports) {
139 Module module = moduleImport.module;
140 temp = module.getTypeDescriptor(name);
143 if(conflictingModules == null) {
144 conflictingModules = new ArrayList<String>(2);
145 conflictingModules.add(resultModule.getName());
147 conflictingModules.add(module.getName());
151 resultModule = module;
155 if(conflictingModules != null)
156 throw new AmbiguousNameException(conflictingModules, name);
161 public EffectConstructor getEffectConstructor(String name)
162 throws AmbiguousNameException {
163 EffectConstructor result = null, temp;
164 Module resultModule = null;
165 ArrayList<String> conflictingModules = null;
166 for(ModuleImport moduleImport : moduleImports) {
167 Module module = moduleImport.module;
168 temp = module.getEffectConstructor(name);
171 if(conflictingModules == null) {
172 conflictingModules = new ArrayList<String>(2);
173 conflictingModules.add(resultModule.getName());
175 conflictingModules.add(module.getName());
179 resultModule = module;
183 if(conflictingModules != null)
184 throw new AmbiguousNameException(conflictingModules, name);
189 public TypeClass getTypeClass(String name) throws AmbiguousNameException {
190 TypeClass result = null, temp;
191 Module resultModule = null;
192 ArrayList<String> conflictingModules = null;
193 for(ModuleImport moduleImport : moduleImports) {
194 Module module = moduleImport.module;
195 temp = module.getTypeClass(name);
198 if(conflictingModules == null) {
199 conflictingModules = new ArrayList<String>(2);
200 conflictingModules.add(resultModule.getName());
202 conflictingModules.add(module.getName());
206 resultModule = module;
210 if(conflictingModules != null)
211 throw new AmbiguousNameException(conflictingModules, name);
216 public MappingRelation getMappingRelation(String name) throws AmbiguousNameException {
217 MappingRelation result = null, temp;
218 Module resultModule = null;
219 ArrayList<String> conflictingModules = null;
220 for(ModuleImport moduleImport : moduleImports) {
221 Module module = moduleImport.module;
222 temp = module.getMappingRelation(name);
225 if(conflictingModules == null) {
226 conflictingModules = new ArrayList<String>(2);
227 conflictingModules.add(resultModule.getName());
229 conflictingModules.add(module.getName());
233 resultModule = module;
237 if(conflictingModules != null)
238 throw new AmbiguousNameException(conflictingModules, name);
243 public TransformationRule getRule(String name) throws AmbiguousNameException {
244 TransformationRule result = null, temp;
245 Module resultModule = null;
246 ArrayList<String> conflictingModules = null;
247 for(ModuleImport moduleImport : moduleImports) {
248 Module module = moduleImport.module;
249 temp = module.getRule(name);
252 if(conflictingModules == null) {
253 conflictingModules = new ArrayList<String>(2);
254 conflictingModules.add(resultModule.getName());
256 conflictingModules.add(module.getName());
260 resultModule = module;
264 if(conflictingModules != null)
265 throw new AmbiguousNameException(conflictingModules, name);
270 public void findValuesForPrefix(String prefix, NamespaceFilter filter, TObjectProcedure<SCLValue> proc) {
271 for(ModuleImport moduleImport : moduleImports)
272 moduleImport.module.findValuesForPrefix(prefix,
273 NamespaceFilters.intersection(filter, moduleImport.filter),
278 public void findTypesForPrefix(String prefix, NamespaceFilter filter, Consumer<TCon> consumer) {
279 for(ModuleImport moduleImport : moduleImports)
280 moduleImport.module.findTypesForPrefix(prefix,
281 NamespaceFilters.intersection(filter, moduleImport.filter),