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.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
18 public abstract class AbstractEnvironment implements Environment {
\r
19 protected abstract Module getModule(String name);
\r
20 protected abstract Collection<Module> getModules();
\r
23 public SCLValue getValue(Name name) {
\r
24 Module module = getModule(name.module);
\r
27 return module.getValue(name.name);
\r
31 public SCLRelation getRelation(Name name) {
\r
32 Module module = getModule(name.module);
\r
35 return module.getRelation(name.name);
\r
39 public SCLEntityType getEntityType(Name name) {
\r
40 Module module = getModule(name.module);
\r
43 return module.getEntityType(name.name);
\r
47 public TypeDescriptor getTypeDescriptor(TCon type) {
\r
48 Module module = getModule(type.module);
\r
51 return module.getTypeDescriptor(type.name);
\r
55 public EffectConstructor getEffectConstructor(TCon type) {
\r
56 Module module = getModule(type.module);
\r
59 return module.getEffectConstructor(type.name);
\r
63 public TypeClass getTypeClass(TCon type) {
\r
64 Module module = getModule(type.module);
\r
67 return module.getTypeClass(type.name);
\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
82 ArrayList<TypeClassInstance> temp =
\r
83 new ArrayList<TypeClassInstance>(
\r
84 ((result.size() + instances.size())*3) / 2);
\r
85 temp.addAll(result);
\r
89 result.addAll(instances);
\r
91 ++nonemptySubresults;
\r