1 package org.simantics.scl.compiler.environment;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collection;
\r
5 import java.util.Collections;
\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
19 public abstract class AbstractEnvironment implements Environment {
\r
20 protected abstract Module getModule(String name);
\r
21 protected abstract Collection<Module> getModules();
\r
24 public SCLValue getValue(Name name) {
\r
25 Module module = getModule(name.module);
\r
28 return module.getValue(name.name);
\r
32 public SCLRelation getRelation(Name name) {
\r
33 Module module = getModule(name.module);
\r
36 return module.getRelation(name.name);
\r
40 public SCLEntityType getEntityType(Name name) {
\r
41 Module module = getModule(name.module);
\r
44 return module.getEntityType(name.name);
\r
48 public TypeConstructor getTypeConstructor(TCon type) {
\r
49 Module module = getModule(type.module);
\r
52 return module.getTypeConstructor(type.name);
\r
56 public EffectConstructor getEffectConstructor(TCon type) {
\r
57 Module module = getModule(type.module);
\r
60 return module.getEffectConstructor(type.name);
\r
64 public TypeAlias getTypeAlias(TCon type) {
\r
65 Module module = getModule(type.module);
\r
68 return module.getTypeAlias(type.name);
\r
72 public TypeClass getTypeClass(TCon type) {
\r
73 Module module = getModule(type.module);
\r
76 return module.getTypeClass(type.name);
\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
91 ArrayList<TypeClassInstance> temp =
\r
92 new ArrayList<TypeClassInstance>(
\r
93 ((result.size() + instances.size())*3) / 2);
\r
94 temp.addAll(result);
\r
98 result.addAll(instances);
\r
100 ++nonemptySubresults;
\r