]> 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 79009374813197eb8aaa7529cd7d159302a57e30..8940b7a82d76a55a72a36daa155aea0563b1f1a4 100644 (file)
@@ -3,6 +3,7 @@ package org.simantics.scl.compiler.environment;
 import java.util.ArrayList;
 import java.util.Arrays;
 
+import org.simantics.scl.compiler.compilation.CompilationContext;
 import org.simantics.scl.compiler.module.ConcreteModule;
 import org.simantics.scl.compiler.module.ImportDeclaration;
 import org.simantics.scl.compiler.module.repository.ImportFailureException;
@@ -11,19 +12,42 @@ 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(ImportDeclaration[] imports) throws ImportFailureException {
+    public Environment createEnvironment(CompilationContext context, ImportDeclaration[] imports) throws ImportFailureException {
+        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.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) {
@@ -37,7 +61,7 @@ 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(is, listener);
+        return repository.createEnvironmentRobustly(context, is, listener);
     }
     
     @Override