]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/AbstractEnvironment.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / environment / AbstractEnvironment.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/AbstractEnvironment.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/AbstractEnvironment.java
new file mode 100644 (file)
index 0000000..e91e394
--- /dev/null
@@ -0,0 +1,105 @@
+package org.simantics.scl.compiler.environment;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+\r
+import org.simantics.scl.compiler.common.names.Name;\r
+import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
+import org.simantics.scl.compiler.elaboration.modules.TypeAlias;\r
+import org.simantics.scl.compiler.elaboration.modules.TypeClass;\r
+import org.simantics.scl.compiler.elaboration.modules.TypeClassInstance;\r
+import org.simantics.scl.compiler.elaboration.modules.TypeConstructor;\r
+import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;\r
+import org.simantics.scl.compiler.elaboration.relations.SCLRelation;\r
+import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;\r
+import org.simantics.scl.compiler.module.Module;\r
+import org.simantics.scl.compiler.types.TCon;\r
+\r
+public abstract class AbstractEnvironment implements Environment {\r
+    protected abstract Module getModule(String name);\r
+    protected abstract Collection<Module> getModules();\r
+    \r
+    @Override\r
+    public SCLValue getValue(Name name) {\r
+        Module module = getModule(name.module);\r
+        if(module == null)\r
+            return null;\r
+        return module.getValue(name.name);\r
+    }\r
+\r
+    @Override\r
+    public SCLRelation getRelation(Name name) {\r
+        Module module = getModule(name.module);\r
+        if(module == null)\r
+            return null;\r
+        return module.getRelation(name.name);\r
+    }\r
+\r
+    @Override\r
+    public SCLEntityType getEntityType(Name name) {\r
+        Module module = getModule(name.module);\r
+        if(module == null)\r
+            return null;\r
+        return module.getEntityType(name.name);\r
+    }\r
+\r
+    @Override\r
+    public TypeConstructor getTypeConstructor(TCon type) {\r
+        Module module = getModule(type.module);\r
+        if(module == null)\r
+            return null;\r
+        return module.getTypeConstructor(type.name);\r
+    }\r
+\r
+    @Override\r
+    public EffectConstructor getEffectConstructor(TCon type) {\r
+        Module module = getModule(type.module);\r
+        if(module == null)\r
+            return null;\r
+        return module.getEffectConstructor(type.name);\r
+    }\r
+\r
+    @Override\r
+    public TypeAlias getTypeAlias(TCon type) {\r
+        Module module = getModule(type.module);\r
+        if(module == null)\r
+            return null;\r
+        return module.getTypeAlias(type.name);\r
+    }\r
+\r
+    @Override\r
+    public TypeClass getTypeClass(TCon type) {\r
+        Module module = getModule(type.module);\r
+        if(module == null)\r
+            return null;\r
+        return module.getTypeClass(type.name);\r
+    }\r
+\r
+    @Override\r
+    public Collection<TypeClassInstance> getInstances(TCon typeClass) {\r
+        Collection<TypeClassInstance> result = Collections.emptyList();\r
+        int nonemptySubresults = 0;\r
+        for(Module module : getModules()) {\r
+            Collection<TypeClassInstance> instances = module.getInstances(typeClass);\r
+            if(!instances.isEmpty()) {\r
+                switch(nonemptySubresults) {\r
+                case 0:\r
+                    result = instances;\r
+                    break;\r
+                case 1: {\r
+                    ArrayList<TypeClassInstance> temp =\r
+                            new ArrayList<TypeClassInstance>(\r
+                                    ((result.size() + instances.size())*3) / 2);\r
+                    temp.addAll(result);\r
+                    result = temp;\r
+                }\r
+                default:\r
+                    result.addAll(instances);\r
+                }\r
+                ++nonemptySubresults;\r
+            }\r
+        }\r
+        return result;\r
+    }\r
+}\r