]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/EnvironmentFactoryImpl.java
Merge "Adding more detailed message to thrown exceptions in SyncElementFactory"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / environment / EnvironmentFactoryImpl.java
1 package org.simantics.scl.compiler.environment;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Arrays;\r
5 \r
6 import org.simantics.scl.compiler.module.ConcreteModule;\r
7 import org.simantics.scl.compiler.module.ImportDeclaration;\r
8 import org.simantics.scl.compiler.module.repository.ImportFailureException;\r
9 import org.simantics.scl.compiler.module.repository.ModuleRepository;\r
10 import org.simantics.scl.compiler.module.repository.UpdateListener;\r
11 \r
12 public class EnvironmentFactoryImpl implements EnvironmentFactory {\r
13 \r
14     private final ModuleRepository environment;\r
15     private final ImportDeclaration[] builtinImports;\r
16     private final UpdateListener listener;\r
17     \r
18     public EnvironmentFactoryImpl(ModuleRepository environment,\r
19             ImportDeclaration[] builtinImports, UpdateListener listener) {\r
20         this.environment = environment;\r
21         this.builtinImports = builtinImports;\r
22         this.listener = listener;\r
23     }\r
24 \r
25     @Override\r
26     public Environment createEnvironment(ImportDeclaration[] imports) throws ImportFailureException {\r
27         ArrayList<ImportDeclaration> acceptedBuiltinImports = \r
28                 new ArrayList<ImportDeclaration>(builtinImports.length);\r
29         loop: for(ImportDeclaration builtinImport : builtinImports) {\r
30             for(ImportDeclaration decl : imports)\r
31                 if(decl.moduleName.equals(builtinImport.moduleName) &&\r
32                         decl.localName.equals(builtinImport.localName))\r
33                     continue loop;\r
34             acceptedBuiltinImports.add(builtinImport);\r
35         }\r
36         ImportDeclaration[] is = Arrays.copyOf(\r
37                 acceptedBuiltinImports.toArray(new ImportDeclaration[acceptedBuiltinImports.size()]),\r
38                 acceptedBuiltinImports.size() + imports.length);\r
39         System.arraycopy(imports, 0, is, acceptedBuiltinImports.size(), imports.length);\r
40         return environment.createEnvironment(is, listener);\r
41     }\r
42     \r
43     @Override\r
44     public void addBuiltinDependencies(ConcreteModule module) {\r
45         for(ImportDeclaration decl : builtinImports) {\r
46             ImportDeclaration decl2 = new ImportDeclaration(decl.moduleName, null);\r
47             module.addDependency(decl2);\r
48         }\r
49     }\r
50 \r
51 }\r