]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/EnvironmentFactoryImpl.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / environment / EnvironmentFactoryImpl.java
index 1a7fb3c6d89e5afe27186ec72aba82456058fc19..8940b7a82d76a55a72a36daa155aea0563b1f1a4 100644 (file)
@@ -12,16 +12,21 @@ import org.simantics.scl.compiler.module.repository.UpdateListener;
 
 public class EnvironmentFactoryImpl implements EnvironmentFactory {
 
-    private final ModuleRepository environment;
+    private final ModuleRepository repository;
     private final ImportDeclaration[] builtinImports;
     private final UpdateListener listener;
     
-    public EnvironmentFactoryImpl(ModuleRepository environment,
+    public EnvironmentFactoryImpl(ModuleRepository repository,
             ImportDeclaration[] builtinImports, UpdateListener listener) {
-        this.environment = environment;
+        this.repository = repository;
         this.builtinImports = builtinImports;
         this.listener = listener;
     }
+    
+    @Override
+    public ModuleRepository getModuleRepository() {
+        return repository;
+    }
 
     @Override
     public Environment createEnvironment(CompilationContext context, ImportDeclaration[] imports) throws ImportFailureException {
@@ -38,7 +43,25 @@ public class EnvironmentFactoryImpl implements EnvironmentFactory {
                 acceptedBuiltinImports.toArray(new ImportDeclaration[acceptedBuiltinImports.size()]),
                 acceptedBuiltinImports.size() + imports.length);
         System.arraycopy(imports, 0, is, acceptedBuiltinImports.size(), imports.length);
-        return environment.createEnvironment(context, is, listener);
+        return repository.createEnvironment(context, is, listener);
+    }
+    
+    @Override
+    public Environment createEnvironmentRobustly(CompilationContext context, ImportDeclaration[] imports) {
+        ArrayList<ImportDeclaration> acceptedBuiltinImports = 
+                new ArrayList<ImportDeclaration>(builtinImports.length);
+        loop: for(ImportDeclaration builtinImport : builtinImports) {
+            for(ImportDeclaration decl : imports)
+                if(decl.moduleName.equals(builtinImport.moduleName) &&
+                        decl.localName.equals(builtinImport.localName))
+                    continue loop;
+            acceptedBuiltinImports.add(builtinImport);
+        }
+        ImportDeclaration[] is = Arrays.copyOf(
+                acceptedBuiltinImports.toArray(new ImportDeclaration[acceptedBuiltinImports.size()]),
+                acceptedBuiltinImports.size() + imports.length);
+        System.arraycopy(imports, 0, is, acceptedBuiltinImports.size(), imports.length);
+        return repository.createEnvironmentRobustly(context, is, listener);
     }
     
     @Override