]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/ConcreteEnvironment.java
(refs #6924) Support for record field access syntax.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / environment / ConcreteEnvironment.java
index 2fb5e41d769c1d02da6548407cd30347da92771d..c2a16f68151995defb0f4d02d7551ecf90df5f34 100644 (file)
@@ -1,12 +1,15 @@
 package org.simantics.scl.compiler.environment;
 
-import gnu.trove.map.hash.THashMap;
-
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
+import org.simantics.scl.compiler.constants.Constant;
 import org.simantics.scl.compiler.elaboration.rules.TransformationRule;
 import org.simantics.scl.compiler.module.Module;
 
+import gnu.trove.map.hash.THashMap;
+
 public class ConcreteEnvironment extends AbstractEnvironment {
 
     private final THashMap<String, Module> moduleMap;
@@ -18,6 +21,27 @@ public class ConcreteEnvironment extends AbstractEnvironment {
         this.localNamespace = localNamespace;
     }
 
+    @Override
+    public List<Constant> getFieldAccessors(String name) {
+        List<Constant> result = null;
+        boolean resultIsImmutable = true;
+        for(Module module : moduleMap.values()) {
+            List<Constant> accessors = module.getFieldAccessors(name);
+            if(accessors != null) {
+                if(result == null)
+                    result = accessors;
+                else if(resultIsImmutable) {
+                    result = new ArrayList<Constant>(result.size() + accessors.size());
+                    result.addAll(accessors);
+                    resultIsImmutable = false;
+                }   
+                else
+                    result.addAll(accessors);
+            }
+        }
+        return result;
+    }
+
     @Override
     public Namespace getLocalNamespace() {
         return localNamespace;