Skip to content

Commit

Permalink
Adds ProcessingContext for holding the state of a particular input as…
Browse files Browse the repository at this point in the history
… it goes through preprocessing and then compilation.

	Change on 2015/04/30 by kstanger <kstanger@google.com>
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=92454164
  • Loading branch information
kstanger authored and tomball committed Apr 30, 2015
1 parent 6145cc0 commit 9e58305
Show file tree
Hide file tree
Showing 24 changed files with 242 additions and 232 deletions.
Expand Up @@ -17,7 +17,6 @@
import com.google.common.base.Strings;
import com.google.devtools.j2objc.ast.CompilationUnit;
import com.google.devtools.j2objc.ast.TreeConverter;
import com.google.devtools.j2objc.file.InputFile;
import com.google.devtools.j2objc.file.RegularInputFile;
import com.google.devtools.j2objc.translate.OuterReferenceResolver;
import com.google.devtools.j2objc.util.ErrorUtil;
Expand All @@ -27,7 +26,6 @@
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

Expand Down Expand Up @@ -96,24 +94,21 @@ public List<List<Edge>> findCycles() throws IOException {
JdtParser parser = createParser(options);
JdtParser.Handler handler = new JdtParser.Handler() {
@Override
public void handleParsedUnit(
InputFile file, org.eclipse.jdt.core.dom.CompilationUnit jdtUnit) {
public void handleParsedUnit(String path, org.eclipse.jdt.core.dom.CompilationUnit jdtUnit) {
String source = "";
RegularInputFile file = new RegularInputFile(path);
try {
source = FileUtil.readFile(file);
} catch (IOException e) {
ErrorUtil.error("Error reading file " + file.getPath() + ": " + e.getMessage());
ErrorUtil.error("Error reading file " + path + ": " + e.getMessage());
}
CompilationUnit unit = TreeConverter.convertCompilationUnit(jdtUnit, file, source, null);
CompilationUnit unit = TreeConverter.convertCompilationUnit(
jdtUnit, path, FileUtil.getMainTypeName(file), source, null);
typeCollector.visitAST(unit);
OuterReferenceResolver.resolve(unit);
}
};
List<InputFile> inputFiles = new ArrayList<InputFile>();
for (String f: options.getSourceFiles()) {
inputFiles.add(new RegularInputFile(f));
}
parser.parseFiles(inputFiles, handler);
parser.parseFiles(options.getSourceFiles(), handler);

if (ErrorUtil.errorCount() > 0) {
return null;
Expand Down
1 change: 1 addition & 0 deletions translator/Makefile
Expand Up @@ -59,6 +59,7 @@ JAVA_SOURCES = \
J2ObjC.java \
Options.java \
Plugin.java \
ProcessingContext.java \
TranslationProcessor.java \
ast/AbstractTypeDeclaration.java \
ast/Annotation.java \
Expand Down
Expand Up @@ -27,6 +27,7 @@
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
Expand All @@ -42,11 +43,6 @@
class AnnotationPreProcessor {

private File tmpDirectory;
private GenerationBatch batch;

AnnotationPreProcessor(GenerationBatch batch) {
this.batch = batch;
}

File getTemporaryDirectory() {
return tmpDirectory;
Expand Down Expand Up @@ -103,8 +99,6 @@ void process(Iterable<String> fileArgs) {
if (!batchCompiler.compile(compileArgs.toArray(new String[0]))) {
// Any compilation errors will already by displayed.
ErrorUtil.error("failed batch processing sources");
} else {
addGeneratedSources(tmpDirectory, "");
}
}

Expand All @@ -120,15 +114,22 @@ private boolean hasAnnotationProcessors() {
return iterator.hasNext();
}

private void addGeneratedSources(File dir, String currentRelativePath) {
public void collectInputs(Collection<ProcessingContext> inputs) {
if (tmpDirectory != null) {
collectGeneratedInputs(tmpDirectory, "", inputs);
}
}

private void collectGeneratedInputs(
File dir, String currentRelativePath, Collection<ProcessingContext> inputs) {
assert dir.exists() && dir.isDirectory();
for (File f : dir.listFiles()) {
String relativeName = currentRelativePath + File.separatorChar + f.getName();
if (f.isDirectory()) {
addGeneratedSources(f, relativeName);
collectGeneratedInputs(f, relativeName, inputs);
} else {
if (f.getName().endsWith(".java")) {
batch.addSource(new RegularInputFile(f.getPath(), relativeName));
inputs.add(ProcessingContext.fromFile(new RegularInputFile(f.getPath(), relativeName)));
}
}
}
Expand Down
Expand Up @@ -15,6 +15,8 @@
package com.google.devtools.j2objc;

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.devtools.j2objc.ast.TreeConverter;
import com.google.devtools.j2objc.file.InputFile;
Expand All @@ -26,6 +28,8 @@
import org.eclipse.jdt.core.dom.CompilationUnit;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;

Expand All @@ -43,7 +47,8 @@ abstract class FileProcessor {
private final NameTable.Factory nameTableFactory = NameTable.newFactory();

private final int batchSize = Options.batchTranslateMaximum();
private final Set<InputFile> batchFiles = Sets.newLinkedHashSetWithExpectedSize(batchSize);
private final Set<ProcessingContext> batchInputs =
Sets.newLinkedHashSetWithExpectedSize(batchSize);

private final boolean doBatching = batchSize > 0;

Expand All @@ -58,9 +63,9 @@ public FileProcessor(JdtParser parser) {
}
}

public void processFiles(Iterable<? extends InputFile> files) {
for (InputFile inputFile : files) {
processInputFile(inputFile);
public void processInputs(Iterable<ProcessingContext> inputs) {
for (ProcessingContext input : inputs) {
processInput(input);
}
processBatch();
}
Expand All @@ -76,15 +81,17 @@ public void processBuildClosureDependencies() {
if (file == null) {
break;
}
processInputFile(file);
processInput(ProcessingContext.fromFile(file));
}
}
}

private void processInputFile(InputFile file) {
private void processInput(ProcessingContext input) {
InputFile file = input.getFile();

if (isBatchable(file)) {
batchFiles.add(file);
if (batchFiles.size() == batchSize) {
batchInputs.add(input);
if (batchInputs.size() == batchSize) {
processBatch();
}
return;
Expand All @@ -102,55 +109,69 @@ private void processInputFile(InputFile file) {
}

if (compilationUnit == null) {
handleError(file);
handleError(input);
return;
}

processCompiledSource(file, source, compilationUnit);
processCompiledSource(input, source, compilationUnit);
}

protected boolean isBatchable(InputFile file) {
return doBatching && file.getContainingPath().endsWith(".java");
}

private void processBatch() {
if (batchFiles.isEmpty()) {
if (batchInputs.isEmpty()) {
return;
}

List<String> paths = Lists.newArrayListWithCapacity(batchInputs.size());
final Map<String, ProcessingContext> inputMap =
Maps.newHashMapWithExpectedSize(batchInputs.size());
for (ProcessingContext input : batchInputs) {
String path = input.getFile().getPath();
paths.add(path);
inputMap.put(path, input);
}

JdtParser.Handler handler = new JdtParser.Handler() {
@Override
public void handleParsedUnit(InputFile file, CompilationUnit unit) {
public void handleParsedUnit(String path, CompilationUnit unit) {
ProcessingContext input = inputMap.get(path);
try {
String source = FileUtil.readFile(file);
processCompiledSource(file, source, unit);
batchFiles.remove(file);
String source = FileUtil.readFile(input.getFile());
processCompiledSource(input, source, unit);
batchInputs.remove(input);
} catch (IOException e) {
ErrorUtil.error(e.getMessage());
}
}
};
logger.finest("Processing batch of size " + batchFiles.size());
parser.parseFiles(batchFiles, handler);
logger.finest("Processing batch of size " + batchInputs.size());
parser.parseFiles(paths, handler);

// Any remaining files in batchFiles has some kind of error.
for (InputFile file : batchFiles) {
handleError(file);
for (ProcessingContext input : batchInputs) {
handleError(input);
}

batchFiles.clear();
batchInputs.clear();
}

private void processCompiledSource(InputFile file, String source, CompilationUnit unit) {
private void processCompiledSource(ProcessingContext input, String source, CompilationUnit unit) {
InputFile file = input.getFile();
if (closureQueue != null) {
closureQueue.addProcessedName(FileUtil.getQualifiedMainTypeName(file, unit));
}
com.google.devtools.j2objc.ast.CompilationUnit convertedUnit =
TreeConverter.convertCompilationUnit(unit, file, source, nameTableFactory);
processConvertedTree(convertedUnit);
TreeConverter.convertCompilationUnit(
unit, input.getOriginalSourcePath(), FileUtil.getMainTypeName(file), source,
nameTableFactory);
processConvertedTree(input, convertedUnit);
}

protected abstract void processConvertedTree(com.google.devtools.j2objc.ast.CompilationUnit unit);
protected abstract void processConvertedTree(
ProcessingContext input, com.google.devtools.j2objc.ast.CompilationUnit unit);

protected abstract void handleError(InputFile file);
protected abstract void handleError(ProcessingContext input);
}
Expand Up @@ -16,7 +16,6 @@

import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.io.Files;
import com.google.devtools.j2objc.file.InputFile;
import com.google.devtools.j2objc.file.JarredInputFile;
Expand All @@ -30,8 +29,6 @@
import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
Expand All @@ -49,24 +46,10 @@ public class GenerationBatch {

private static final Logger logger = Logger.getLogger(GenerationBatch.class.getName());

private final Map<InputFile, GenerationUnit> unitMap = Maps.newLinkedHashMap();
private final List<ProcessingContext> inputs = Lists.newArrayList();

public GenerationBatch() {
}

@VisibleForTesting
public static GenerationBatch fromFile(InputFile file) {
GenerationBatch newBatch = new GenerationBatch();
newBatch.addSource(file);
return newBatch;
}

public Set<InputFile> getInputFiles() {
return unitMap.keySet();
}

public GenerationUnit generationUnitForFile(InputFile file) {
return unitMap.get(file);
public List<ProcessingContext> getInputs() {
return inputs;
}

public void processFileArgs(Iterable<String> args) {
Expand Down Expand Up @@ -179,9 +162,9 @@ private void processJarFile(String filename) {

@VisibleForTesting
public void addCombinedJar(String filename, Collection<? extends InputFile> inputFiles) {
GenerationUnit unit = GenerationUnit.newCombinedJarUnit(filename, inputFiles);
GenerationUnit unit = GenerationUnit.newCombinedJarUnit(filename, inputFiles.size());
for (InputFile file : inputFiles) {
unitMap.put(file, unit);
inputs.add(new ProcessingContext(file, unit));
}
}

Expand All @@ -190,6 +173,6 @@ public void addCombinedJar(String filename, Collection<? extends InputFile> inpu
* creating GenerationUnits and inferring unit names/output paths as necessary.
*/
public void addSource(InputFile file) {
unitMap.put(file, GenerationUnit.newSingleFileUnit(file));
inputs.add(ProcessingContext.fromFile(file));
}
}
Expand Up @@ -15,7 +15,6 @@
package com.google.devtools.j2objc;

import com.google.devtools.j2objc.file.InputFile;
import com.google.devtools.j2objc.gen.GenerationUnit;
import com.google.devtools.j2objc.util.ErrorUtil;
import com.google.devtools.j2objc.util.FileUtil;
import com.google.devtools.j2objc.util.JdtParser;
Expand All @@ -33,50 +32,49 @@
*/
public class InputFilePreprocessor {

private final GenerationBatch batch;
private final JdtParser parser;

public InputFilePreprocessor(GenerationBatch batch, JdtParser parser) {
this.batch = batch;
public InputFilePreprocessor(JdtParser parser) {
this.parser = parser;
}

public void process() {
for (InputFile inputFile : batch.getInputFiles()) {
processFile(inputFile);
public void processInputs(Iterable<ProcessingContext> inputs) {
for (ProcessingContext input : inputs) {
processInput(input);
}
}

private void processFile(InputFile file) {
private void processInput(ProcessingContext input) {
try {
if (file.getUnitName().endsWith("package-info.java")) {
processPackageInfoFile(file);
if (input.getFile().getUnitName().endsWith("package-info.java")) {
processPackageInfoSource(input);
} else {
processSourceFile(file);
processRegularSource(input);
}
} catch (IOException e) {
ErrorUtil.error(e.getMessage());
}
}

private void processSourceFile(InputFile file) throws IOException {
private void processRegularSource(ProcessingContext input) throws IOException {
if (Options.shouldMapHeaders()) {
InputFile file = input.getFile();
String source = FileUtil.readFile(file);
CompilationUnit compilationUnit = parser.parseWithoutBindings(file.getUnitName(), source);
if (compilationUnit != null) {
addHeaderMapping(file, compilationUnit);
addHeaderMapping(input, compilationUnit);
}
}
}

private void addHeaderMapping(InputFile file, CompilationUnit compilationUnit) {
GenerationUnit generationUnit = batch.generationUnitForFile(file);
private void addHeaderMapping(ProcessingContext input, CompilationUnit compilationUnit) {
Options.getHeaderMappings().put(
FileUtil.getQualifiedMainTypeName(file, compilationUnit),
generationUnit.getOutputPath() + ".h");
FileUtil.getQualifiedMainTypeName(input.getFile(), compilationUnit),
input.getGenerationUnit().getOutputPath() + ".h");
}

private void processPackageInfoFile(InputFile file) throws IOException {
private void processPackageInfoSource(ProcessingContext input) throws IOException {
InputFile file = input.getFile();
String source = FileUtil.readFile(file);
CompilationUnit compilationUnit = parser.parseWithBindings(file.getUnitName(), source);
if (compilationUnit != null) {
Expand Down

0 comments on commit 9e58305

Please sign in to comment.