]> gerrit.simantics Code Review - simantics/platform.git/blob
e91e39444281479ba9fc0655464d63b669d5e774
[simantics/platform.git] /
1 package org.simantics.scl.compiler.environment;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.Collections;\r
6 \r
7 import org.simantics.scl.compiler.common.names.Name;\r
8 import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
9 import org.simantics.scl.compiler.elaboration.modules.TypeAlias;\r
10 import org.simantics.scl.compiler.elaboration.modules.TypeClass;\r
11 import org.simantics.scl.compiler.elaboration.modules.TypeClassInstance;\r
12 import org.simantics.scl.compiler.elaboration.modules.TypeConstructor;\r
13 import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;\r
14 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;\r
15 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;\r
16 import org.simantics.scl.compiler.module.Module;\r
17 import org.simantics.scl.compiler.types.TCon;\r
18 \r
19 public abstract class AbstractEnvironment implements Environment {\r
20     protected abstract Module getModule(String name);\r
21     protected abstract Collection<Module> getModules();\r
22     \r
23     @Override\r
24     public SCLValue getValue(Name name) {\r
25         Module module = getModule(name.module);\r
26         if(module == null)\r
27             return null;\r
28         return module.getValue(name.name);\r
29     }\r
30 \r
31     @Override\r
32     public SCLRelation getRelation(Name name) {\r
33         Module module = getModule(name.module);\r
34         if(module == null)\r
35             return null;\r
36         return module.getRelation(name.name);\r
37     }\r
38 \r
39     @Override\r
40     public SCLEntityType getEntityType(Name name) {\r
41         Module module = getModule(name.module);\r
42         if(module == null)\r
43             return null;\r
44         return module.getEntityType(name.name);\r
45     }\r
46 \r
47     @Override\r
48     public TypeConstructor getTypeConstructor(TCon type) {\r
49         Module module = getModule(type.module);\r
50         if(module == null)\r
51             return null;\r
52         return module.getTypeConstructor(type.name);\r
53     }\r
54 \r
55     @Override\r
56     public EffectConstructor getEffectConstructor(TCon type) {\r
57         Module module = getModule(type.module);\r
58         if(module == null)\r
59             return null;\r
60         return module.getEffectConstructor(type.name);\r
61     }\r
62 \r
63     @Override\r
64     public TypeAlias getTypeAlias(TCon type) {\r
65         Module module = getModule(type.module);\r
66         if(module == null)\r
67             return null;\r
68         return module.getTypeAlias(type.name);\r
69     }\r
70 \r
71     @Override\r
72     public TypeClass getTypeClass(TCon type) {\r
73         Module module = getModule(type.module);\r
74         if(module == null)\r
75             return null;\r
76         return module.getTypeClass(type.name);\r
77     }\r
78 \r
79     @Override\r
80     public Collection<TypeClassInstance> getInstances(TCon typeClass) {\r
81         Collection<TypeClassInstance> result = Collections.emptyList();\r
82         int nonemptySubresults = 0;\r
83         for(Module module : getModules()) {\r
84             Collection<TypeClassInstance> instances = module.getInstances(typeClass);\r
85             if(!instances.isEmpty()) {\r
86                 switch(nonemptySubresults) {\r
87                 case 0:\r
88                     result = instances;\r
89                     break;\r
90                 case 1: {\r
91                     ArrayList<TypeClassInstance> temp =\r
92                             new ArrayList<TypeClassInstance>(\r
93                                     ((result.size() + instances.size())*3) / 2);\r
94                     temp.addAll(result);\r
95                     result = temp;\r
96                 }\r
97                 default:\r
98                     result.addAll(instances);\r
99                 }\r
100                 ++nonemptySubresults;\r
101             }\r
102         }\r
103         return result;\r
104     }\r
105 }\r