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