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