]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/SourceRepositories.java
Fixing a deadlock. Some improvements to ModuleSourceRepository API
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / repository / SourceRepositories.java
1 package org.simantics.scl.compiler.source.repository;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.net.URL;
6 import java.util.ArrayList;
7 import java.util.List;
8
9 import org.simantics.scl.compiler.module.ImportDeclaration;
10 import org.simantics.scl.runtime.SCLContext;
11
12 import gnu.trove.procedure.TObjectProcedure;
13
14 public class SourceRepositories {
15     public static final ModuleSourceRepository BUILTIN_SOURCE_REPOSITORY = new BuiltinModuleSourceRepository();
16     
17     public static final ModuleSourceRepository PRELUDE_SOURCE_REPOSITORY = createPreludeSourceEnvironment();
18
19     private static ModuleSourceRepository createPreludeSourceEnvironment() {
20         try {
21             File directory = getPreludeDirectory();
22             if(directory != null) {
23                 return new FileModuleSourceRepository(directory, SourceRepositories.class.getClassLoader()) {
24                     protected ImportDeclaration[] getBuiltinImports() {
25                         return ImportDeclaration.ONLY_BUILTINS;
26                     }
27                 };
28             }
29             
30             // Hope that ClassSourceEnvironment works
31             return new ClassModuleSourceRepository(SCLContext.class, SourceRepositories.class.getClassLoader(), "/scl") {
32                 protected ImportDeclaration[] getBuiltinImports() {
33                     return ImportDeclaration.ONLY_BUILTINS;
34                 }
35             };
36         } catch(IOException e) {
37             e.printStackTrace();
38             return null;
39         }
40     }
41     
42     private static File getPreludeDirectory() throws IOException {
43         URL url = SCLContext.class.getResource(".");
44         if(url == null)
45             return null;
46         File file = ModuleBrowsingUtil.toFile(url);
47         if(file == null)
48             return null;
49         File preludeDir = new File(file, "../../../../scl");
50         if(preludeDir.exists())
51             return preludeDir.getCanonicalFile();
52         preludeDir = new File(file, "../../../../../scl");
53         if(preludeDir.exists())
54             return preludeDir.getCanonicalFile();
55         return null;
56     }
57     
58     public static List<String> getModuleNames(ModuleSourceRepository repository) {
59         final ArrayList<String> result = new ArrayList<String>(); 
60         repository.forAllModules(new TObjectProcedure<String>() {
61             @Override
62             public boolean execute(String moduleName) {
63                 result.add(moduleName);
64                 return true;
65             }
66         });
67         return result;
68     }
69 }