--- /dev/null
+package org.simantics.scl.compiler.environment;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+\r
+import org.simantics.scl.compiler.module.ConcreteModule;\r
+import org.simantics.scl.compiler.module.ImportDeclaration;\r
+import org.simantics.scl.compiler.module.repository.ImportFailureException;\r
+import org.simantics.scl.compiler.module.repository.ModuleRepository;\r
+import org.simantics.scl.compiler.module.repository.UpdateListener;\r
+\r
+public class EnvironmentFactoryImpl implements EnvironmentFactory {\r
+\r
+ private final ModuleRepository environment;\r
+ private final ImportDeclaration[] builtinImports;\r
+ private final UpdateListener listener;\r
+ \r
+ public EnvironmentFactoryImpl(ModuleRepository environment,\r
+ ImportDeclaration[] builtinImports, UpdateListener listener) {\r
+ this.environment = environment;\r
+ this.builtinImports = builtinImports;\r
+ this.listener = listener;\r
+ }\r
+\r
+ @Override\r
+ public Environment createEnvironment(ImportDeclaration[] imports) throws ImportFailureException {\r
+ ArrayList<ImportDeclaration> acceptedBuiltinImports = \r
+ new ArrayList<ImportDeclaration>(builtinImports.length);\r
+ loop: for(ImportDeclaration builtinImport : builtinImports) {\r
+ for(ImportDeclaration decl : imports)\r
+ if(decl.moduleName.equals(builtinImport.moduleName) &&\r
+ decl.localName.equals(builtinImport.localName))\r
+ continue loop;\r
+ acceptedBuiltinImports.add(builtinImport);\r
+ }\r
+ ImportDeclaration[] is = Arrays.copyOf(\r
+ acceptedBuiltinImports.toArray(new ImportDeclaration[acceptedBuiltinImports.size()]),\r
+ acceptedBuiltinImports.size() + imports.length);\r
+ System.arraycopy(imports, 0, is, acceptedBuiltinImports.size(), imports.length);\r
+ return environment.createEnvironment(is, listener);\r
+ }\r
+ \r
+ @Override\r
+ public void addBuiltinDependencies(ConcreteModule module) {\r
+ for(ImportDeclaration decl : builtinImports) {\r
+ ImportDeclaration decl2 = new ImportDeclaration(decl.moduleName, null);\r
+ module.addDependency(decl2);\r
+ }\r
+ }\r
+\r
+}\r