Skip to content

Commit

Permalink
THe TypeCheckerBuilder now has a new method forBackend() that wil…
Browse files Browse the repository at this point in the history
…l be passed on to the `TypeChecker` on construction so it can perform backend-specific filtering of source elements (#499 and #500)
  • Loading branch information
quintesse committed Apr 12, 2015
1 parent 6418200 commit b359b01
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
16 changes: 15 additions & 1 deletion src/com/redhat/ceylon/compiler/typechecker/TypeChecker.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.List;

import com.redhat.ceylon.cmr.api.RepositoryManager;
import com.redhat.ceylon.common.Backend;
import com.redhat.ceylon.common.Versions;
import com.redhat.ceylon.compiler.typechecker.analyzer.ModuleValidator;
import com.redhat.ceylon.compiler.typechecker.context.Context;
Expand All @@ -13,6 +14,7 @@
import com.redhat.ceylon.compiler.typechecker.model.Module;
import com.redhat.ceylon.compiler.typechecker.tree.Message;
import com.redhat.ceylon.compiler.typechecker.util.AssertionVisitor;
import com.redhat.ceylon.compiler.typechecker.util.BackendFilterVisitor;
import com.redhat.ceylon.compiler.typechecker.util.ModuleManagerFactory;
import com.redhat.ceylon.compiler.typechecker.util.StatisticsVisitor;

Expand All @@ -32,25 +34,29 @@ public class TypeChecker {
private final PhasedUnits phasedUnits;
private List<PhasedUnits> phasedUnitsOfDependencies;
private final boolean verifyDependencies;
private final Backend forBackend;
private final AssertionVisitor assertionVisitor;
private final StatisticsVisitor statsVisitor;
private final BackendFilterVisitor filterVisitor;

//package level
TypeChecker(VFS vfs, List<VirtualFile> srcDirectories, RepositoryManager repositoryManager, boolean verifyDependencies,
AssertionVisitor assertionVisitor, ModuleManagerFactory moduleManagerFactory, boolean verbose, boolean statistics,
List<String> moduleFilters, List<VirtualFile> srcFiles, String encoding) {
List<String> moduleFilters, List<VirtualFile> srcFiles, String encoding, Backend forBackend) {
long start = System.nanoTime();
this.verbose = verbose;
this.statistics = statistics;
this.context = new Context(repositoryManager, vfs);
this.phasedUnits = new PhasedUnits(context, moduleManagerFactory);
this.verifyDependencies = verifyDependencies;
this.forBackend = forBackend;
this.assertionVisitor = assertionVisitor;
statsVisitor = new StatisticsVisitor();
phasedUnits.setSourceFiles(srcFiles);
phasedUnits.setModuleFilters(moduleFilters);
phasedUnits.setEncoding(encoding);
phasedUnits.parseUnits(srcDirectories);
filterVisitor = new BackendFilterVisitor(phasedUnits, forBackend);
long time = System.nanoTime()-start;
if(statistics)
System.out.println("Parsed in " + time/1000000 + " ms");
Expand Down Expand Up @@ -132,6 +138,14 @@ public void process(boolean forceSilence) throws RuntimeException {
}

private void executePhases(PhasedUnits phasedUnits, boolean forceSilence) {
// Filter out anything that's not meant for the current backend
if (forBackend != null) {
for (PhasedUnit pu : phasedUnits.getPhasedUnits()) {
pu.getCompilationUnit().visit(filterVisitor);
}
filterVisitor.purge();
}

final List<PhasedUnit> listOfUnits = phasedUnits.getPhasedUnits();

phasedUnits.getModuleManager().prepareForTypeChecking();
Expand Down
12 changes: 10 additions & 2 deletions src/com/redhat/ceylon/compiler/typechecker/TypeCheckerBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import com.redhat.ceylon.cmr.api.RepositoryManager;
import com.redhat.ceylon.cmr.ceylon.CeylonUtils;
import com.redhat.ceylon.common.Backend;
import com.redhat.ceylon.compiler.typechecker.io.VFS;
import com.redhat.ceylon.compiler.typechecker.io.VirtualFile;
import com.redhat.ceylon.compiler.typechecker.io.cmr.impl.LeakingLogger;
Expand Down Expand Up @@ -39,6 +40,7 @@ public class TypeCheckerBuilder {
private ModuleManagerFactory moduleManagerFactory;
private RepositoryManager repositoryManager;
private List<String> moduleFilters = new ArrayList<String>();
private Backend forBackend;

public TypeCheckerBuilder() {}

Expand All @@ -59,8 +61,9 @@ public TypeCheckerBuilder addSrcDirectory(VirtualFile srcDirectory) {
return this;
}

public void setRepositoryManager(RepositoryManager repositoryManager) {
public TypeCheckerBuilder setRepositoryManager(RepositoryManager repositoryManager) {
this.repositoryManager = repositoryManager;
return this;
}

public TypeCheckerBuilder setModuleFilters(List<String> moduleFilters){
Expand Down Expand Up @@ -139,14 +142,19 @@ public TypeCheckerBuilder encoding(String value) {
return this;
}

public TypeCheckerBuilder forBackend(Backend forBackend) {
this.forBackend = forBackend;
return this;
}

public TypeChecker getTypeChecker() {
if (repositoryManager == null) {
repositoryManager = CeylonUtils.repoManager()
.logger(new LeakingLogger())
.buildManager();
}
return new TypeChecker(vfs, srcDirectories, repositoryManager, verifyDependencies, assertionVisitor,
moduleManagerFactory, verbose, statistics, moduleFilters, srcFiles, encoding);
moduleManagerFactory, verbose, statistics, moduleFilters, srcFiles, encoding, forBackend);
}

}

0 comments on commit b359b01

Please sign in to comment.