Skip to content
This repository was archived by the owner on Apr 13, 2023. It is now read-only.

Commit 5ffdb38

Browse files
committed
ModuleDescriptorReader #4848: only parse the single module file we need
and for default module, do not visit modules and stop at the first source file found
1 parent 67a40f3 commit 5ffdb38

File tree

1 file changed

+54
-4
lines changed

1 file changed

+54
-4
lines changed

compiler-java/src/com/redhat/ceylon/compiler/ModuleDescriptorReader.java

+54-4
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@
2727
import com.redhat.ceylon.cmr.api.Logger;
2828
import com.redhat.ceylon.cmr.api.RepositoryManager;
2929
import com.redhat.ceylon.cmr.api.RepositoryManagerBuilder;
30+
import com.redhat.ceylon.common.ModuleDescriptorReader.NoSuchModuleException;
3031
import com.redhat.ceylon.compiler.typechecker.analyzer.ModuleManager;
3132
import com.redhat.ceylon.compiler.typechecker.context.Context;
3233
import com.redhat.ceylon.compiler.typechecker.context.PhasedUnit;
3334
import com.redhat.ceylon.compiler.typechecker.context.PhasedUnits;
3435
import com.redhat.ceylon.compiler.typechecker.io.VFS;
36+
import com.redhat.ceylon.compiler.typechecker.io.VirtualFile;
3537
import com.redhat.ceylon.compiler.typechecker.model.Annotation;
3638
import com.redhat.ceylon.compiler.typechecker.model.Module;
3739

@@ -61,21 +63,69 @@ public void debug(String str) {
6163

6264
private final Module moduleDescriptor;
6365

64-
public ModuleDescriptorReader(String moduleName, File srcDir) {
66+
public ModuleDescriptorReader(String moduleName, File srcDir) throws NoSuchModuleException {
6567
RepositoryManagerBuilder builder = new RepositoryManagerBuilder(new NullLogger(), false);
6668
RepositoryManager repoManager = builder.buildRepository();
6769
VFS vfs = new VFS();
6870
Context context = new Context(repoManager, vfs);
6971
PhasedUnits pus = new PhasedUnits(context);
70-
pus.parseUnit(vfs.getFromFile(srcDir));
72+
List<String> name = ModuleManager.splitModuleName(moduleName);
73+
ModuleManager moduleManager = pus.getModuleManager();
74+
if(Module.DEFAULT_MODULE_NAME.equals(moduleName)){
75+
// visit every folder and skip modules
76+
boolean exists = findDefaultModuleSource(srcDir);
77+
if(!exists)
78+
throw new NoSuchModuleException("No source found for default module");
79+
}else{
80+
visitModule(vfs, pus, name, srcDir, vfs.getFromFile(srcDir), moduleManager);
81+
}
7182
for (PhasedUnit pu : pus.getPhasedUnits()) {
7283
pu.visitSrcModulePhase();
7384
}
74-
ModuleManager moduleManager = pus.getModuleManager();
75-
List<String> name = ModuleManager.splitModuleName(moduleName);
7685
this.moduleDescriptor = moduleManager.getOrCreateModule(name, null);
7786
}
7887

88+
private void visitModule(VFS vfs, PhasedUnits pus, List<String> name, File srcDir, VirtualFile virtualSourceDirectory, ModuleManager moduleManager) throws NoSuchModuleException {
89+
for(String part : name){
90+
File child = new File(srcDir, part);
91+
if(child.exists() && child.isDirectory()){
92+
moduleManager.push(part);
93+
srcDir = child;
94+
}else{
95+
throw new NoSuchModuleException("Failed to find module name part "+part+" in "+srcDir);
96+
}
97+
}
98+
File moduleFile = new File(srcDir, ModuleManager.MODULE_FILE);
99+
if(moduleFile.exists()){
100+
moduleManager.visitModuleFile();
101+
pus.parseUnit(vfs.getFromFile(moduleFile), virtualSourceDirectory);
102+
}else{
103+
throw new NoSuchModuleException("No module file in "+srcDir);
104+
}
105+
}
106+
107+
private boolean findDefaultModuleSource(File sourceFile) {
108+
if(sourceFile.isDirectory()){
109+
File moduleFile = new File(sourceFile, ModuleManager.MODULE_FILE);
110+
// skip modules entirely
111+
if(moduleFile.exists())
112+
return false;
113+
// recurse down normal folders
114+
for(File f : sourceFile.listFiles()){
115+
boolean found = findDefaultModuleSource(f);
116+
if(found)
117+
return true;
118+
}
119+
return false;
120+
}else{
121+
String name = sourceFile.getName().toLowerCase();
122+
// did we find a source file?
123+
return name.endsWith(".ceylon")
124+
|| name.endsWith(".java")
125+
|| name.endsWith(".js");
126+
}
127+
}
128+
79129
/**
80130
* Gets the module version
81131
* @return The module version, or null if no version could be found

0 commit comments

Comments
 (0)