1 package org.simantics.scl.compiler.environment;
3 import java.util.ArrayList;
5 import java.util.function.Consumer;
7 import org.simantics.scl.compiler.constants.Constant;
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 SCLValue getValue(String name) throws AmbiguousNameException {
52 SCLValue result = null, temp;
53 Module resultModule = null;
54 ArrayList<String> conflictingModules = null;
55 for(ModuleImport moduleImport : moduleImports) {
56 Module module = moduleImport.module;
57 temp = module.getValue(name);
60 && moduleImport.filter.isValueIncluded(name)) {
62 if(conflictingModules == null) {
63 conflictingModules = new ArrayList<String>(2);
64 conflictingModules.add(resultModule.getName());
66 conflictingModules.add(module.getName());
70 resultModule = module;
74 if(conflictingModules != null)
75 throw new AmbiguousNameException(conflictingModules, name);
80 public SCLRelation getRelation(String name) throws AmbiguousNameException {
81 SCLRelation result = null, temp;
82 Module resultModule = null;
83 ArrayList<String> conflictingModules = null;
84 for(ModuleImport moduleImport : moduleImports) {
85 Module module = moduleImport.module;
86 temp = module.getRelation(name);
89 if(conflictingModules == null) {
90 conflictingModules = new ArrayList<String>(2);
91 conflictingModules.add(resultModule.getName());
93 conflictingModules.add(module.getName());
97 resultModule = module;
101 if(conflictingModules != null)
102 throw new AmbiguousNameException(conflictingModules, name);
107 public SCLEntityType getEntityType(String name)
108 throws AmbiguousNameException {
109 SCLEntityType result = null, temp;
110 Module resultModule = null;
111 ArrayList<String> conflictingModules = null;
112 for(ModuleImport moduleImport : moduleImports) {
113 Module module = moduleImport.module;
114 temp = module.getEntityType(name);
117 if(conflictingModules == null) {
118 conflictingModules = new ArrayList<String>(2);
119 conflictingModules.add(resultModule.getName());
121 conflictingModules.add(module.getName());
125 resultModule = module;
129 if(conflictingModules != null)
130 throw new AmbiguousNameException(conflictingModules, name);
135 public TypeDescriptor getTypeDescriptor(String name)
136 throws AmbiguousNameException {
137 TypeDescriptor result = null, temp;
138 Module resultModule = null;
139 ArrayList<String> conflictingModules = null;
140 for(ModuleImport moduleImport : moduleImports) {
141 Module module = moduleImport.module;
142 temp = module.getTypeDescriptor(name);
145 if(conflictingModules == null) {
146 conflictingModules = new ArrayList<String>(2);
147 conflictingModules.add(resultModule.getName());
149 conflictingModules.add(module.getName());
153 resultModule = module;
157 if(conflictingModules != null)
158 throw new AmbiguousNameException(conflictingModules, name);
163 public EffectConstructor getEffectConstructor(String name)
164 throws AmbiguousNameException {
165 EffectConstructor result = null, temp;
166 Module resultModule = null;
167 ArrayList<String> conflictingModules = null;
168 for(ModuleImport moduleImport : moduleImports) {
169 Module module = moduleImport.module;
170 temp = module.getEffectConstructor(name);
173 if(conflictingModules == null) {
174 conflictingModules = new ArrayList<String>(2);
175 conflictingModules.add(resultModule.getName());
177 conflictingModules.add(module.getName());
181 resultModule = module;
185 if(conflictingModules != null)
186 throw new AmbiguousNameException(conflictingModules, name);
191 public TypeClass getTypeClass(String name) throws AmbiguousNameException {
192 TypeClass result = null, temp;
193 Module resultModule = null;
194 ArrayList<String> conflictingModules = null;
195 for(ModuleImport moduleImport : moduleImports) {
196 Module module = moduleImport.module;
197 temp = module.getTypeClass(name);
200 if(conflictingModules == null) {
201 conflictingModules = new ArrayList<String>(2);
202 conflictingModules.add(resultModule.getName());
204 conflictingModules.add(module.getName());
208 resultModule = module;
212 if(conflictingModules != null)
213 throw new AmbiguousNameException(conflictingModules, name);
218 public MappingRelation getMappingRelation(String name) throws AmbiguousNameException {
219 MappingRelation result = null, temp;
220 Module resultModule = null;
221 ArrayList<String> conflictingModules = null;
222 for(ModuleImport moduleImport : moduleImports) {
223 Module module = moduleImport.module;
224 temp = module.getMappingRelation(name);
227 if(conflictingModules == null) {
228 conflictingModules = new ArrayList<String>(2);
229 conflictingModules.add(resultModule.getName());
231 conflictingModules.add(module.getName());
235 resultModule = module;
239 if(conflictingModules != null)
240 throw new AmbiguousNameException(conflictingModules, name);
245 public TransformationRule getRule(String name) throws AmbiguousNameException {
246 TransformationRule result = null, temp;
247 Module resultModule = null;
248 ArrayList<String> conflictingModules = null;
249 for(ModuleImport moduleImport : moduleImports) {
250 Module module = moduleImport.module;
251 temp = module.getRule(name);
254 if(conflictingModules == null) {
255 conflictingModules = new ArrayList<String>(2);
256 conflictingModules.add(resultModule.getName());
258 conflictingModules.add(module.getName());
262 resultModule = module;
266 if(conflictingModules != null)
267 throw new AmbiguousNameException(conflictingModules, name);
272 public void findValuesForPrefix(String prefix, NamespaceFilter filter, TObjectProcedure<SCLValue> proc) {
273 for(ModuleImport moduleImport : moduleImports)
274 moduleImport.module.findValuesForPrefix(prefix,
275 NamespaceFilters.intersection(filter, moduleImport.filter),
280 public void findTypesForPrefix(String prefix, NamespaceFilter filter, Consumer<TCon> consumer) {
281 for(ModuleImport moduleImport : moduleImports)
282 moduleImport.module.findTypesForPrefix(prefix,
283 NamespaceFilters.intersection(filter, moduleImport.filter),