From 9e58305b98b1db0bd984f945dcd503344238fece Mon Sep 17 00:00:00 2001 From: kstanger Date: Thu, 30 Apr 2015 07:27:27 -0700 Subject: [PATCH] Adds ProcessingContext for holding the state of a particular input as it goes through preprocessing and then compilation. Change on 2015/04/30 by kstanger ------------- Created by MOE: http://code.google.com/p/moe-java MOE_MIGRATED_REVID=92454164 --- .../devtools/cyclefinder/CycleFinder.java | 17 ++--- translator/Makefile | 1 + .../j2objc/AnnotationPreProcessor.java | 21 +++--- .../google/devtools/j2objc/FileProcessor.java | 71 ++++++++++++------- .../devtools/j2objc/GenerationBatch.java | 29 ++------ .../j2objc/InputFilePreprocessor.java | 34 +++++---- .../com/google/devtools/j2objc/J2ObjC.java | 16 +++-- .../devtools/j2objc/ProcessingContext.java | 53 ++++++++++++++ .../devtools/j2objc/TranslationProcessor.java | 25 ++----- .../devtools/j2objc/ast/CompilationUnit.java | 15 ++-- .../devtools/j2objc/ast/TreeConverter.java | 9 +-- .../j2objc/gen/AbstractSourceGenerator.java | 4 -- .../devtools/j2objc/gen/GenerationUnit.java | 34 ++++----- .../ObjectiveCImplementationGenerator.java | 3 +- .../gen/ObjectiveCSourceFileGenerator.java | 2 +- .../devtools/j2objc/gen/SourceBuilder.java | 9 +-- .../devtools/j2objc/util/ErrorUtil.java | 2 +- .../devtools/j2objc/util/JdtParser.java | 18 ++--- .../devtools/j2objc/GenerationTest.java | 26 +++---- .../j2objc/TranslationProcessorTest.java | 22 +++--- .../j2objc/gen/LineDirectivesTest.java | 6 +- .../translate/OuterReferenceResolverTest.java | 7 +- .../ImplementationImportCollectorTest.java | 40 +++++------ .../devtools/j2objc/util/NameTableTest.java | 10 +-- 24 files changed, 242 insertions(+), 232 deletions(-) create mode 100644 translator/src/main/java/com/google/devtools/j2objc/ProcessingContext.java diff --git a/cycle_finder/src/main/java/com/google/devtools/cyclefinder/CycleFinder.java b/cycle_finder/src/main/java/com/google/devtools/cyclefinder/CycleFinder.java index 177edaf065..80fac0252d 100644 --- a/cycle_finder/src/main/java/com/google/devtools/cyclefinder/CycleFinder.java +++ b/cycle_finder/src/main/java/com/google/devtools/cyclefinder/CycleFinder.java @@ -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; @@ -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; @@ -96,24 +94,21 @@ public List> 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 inputFiles = new ArrayList(); - 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; diff --git a/translator/Makefile b/translator/Makefile index 5d8392c831..a65828907c 100644 --- a/translator/Makefile +++ b/translator/Makefile @@ -59,6 +59,7 @@ JAVA_SOURCES = \ J2ObjC.java \ Options.java \ Plugin.java \ + ProcessingContext.java \ TranslationProcessor.java \ ast/AbstractTypeDeclaration.java \ ast/Annotation.java \ diff --git a/translator/src/main/java/com/google/devtools/j2objc/AnnotationPreProcessor.java b/translator/src/main/java/com/google/devtools/j2objc/AnnotationPreProcessor.java index 8c6caa825f..1e48eb7c22 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/AnnotationPreProcessor.java +++ b/translator/src/main/java/com/google/devtools/j2objc/AnnotationPreProcessor.java @@ -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; @@ -42,11 +43,6 @@ class AnnotationPreProcessor { private File tmpDirectory; - private GenerationBatch batch; - - AnnotationPreProcessor(GenerationBatch batch) { - this.batch = batch; - } File getTemporaryDirectory() { return tmpDirectory; @@ -103,8 +99,6 @@ void process(Iterable 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, ""); } } @@ -120,15 +114,22 @@ private boolean hasAnnotationProcessors() { return iterator.hasNext(); } - private void addGeneratedSources(File dir, String currentRelativePath) { + public void collectInputs(Collection inputs) { + if (tmpDirectory != null) { + collectGeneratedInputs(tmpDirectory, "", inputs); + } + } + + private void collectGeneratedInputs( + File dir, String currentRelativePath, Collection 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))); } } } diff --git a/translator/src/main/java/com/google/devtools/j2objc/FileProcessor.java b/translator/src/main/java/com/google/devtools/j2objc/FileProcessor.java index 35a4341f7d..0c140b38a3 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/FileProcessor.java +++ b/translator/src/main/java/com/google/devtools/j2objc/FileProcessor.java @@ -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; @@ -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; @@ -43,7 +47,8 @@ abstract class FileProcessor { private final NameTable.Factory nameTableFactory = NameTable.newFactory(); private final int batchSize = Options.batchTranslateMaximum(); - private final Set batchFiles = Sets.newLinkedHashSetWithExpectedSize(batchSize); + private final Set batchInputs = + Sets.newLinkedHashSetWithExpectedSize(batchSize); private final boolean doBatching = batchSize > 0; @@ -58,9 +63,9 @@ public FileProcessor(JdtParser parser) { } } - public void processFiles(Iterable files) { - for (InputFile inputFile : files) { - processInputFile(inputFile); + public void processInputs(Iterable inputs) { + for (ProcessingContext input : inputs) { + processInput(input); } processBatch(); } @@ -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; @@ -102,11 +109,11 @@ 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) { @@ -114,43 +121,57 @@ protected boolean isBatchable(InputFile file) { } private void processBatch() { - if (batchFiles.isEmpty()) { + if (batchInputs.isEmpty()) { return; } + List paths = Lists.newArrayListWithCapacity(batchInputs.size()); + final Map 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); } diff --git a/translator/src/main/java/com/google/devtools/j2objc/GenerationBatch.java b/translator/src/main/java/com/google/devtools/j2objc/GenerationBatch.java index 0d3a934784..2d1358ece8 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/GenerationBatch.java +++ b/translator/src/main/java/com/google/devtools/j2objc/GenerationBatch.java @@ -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; @@ -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; @@ -49,24 +46,10 @@ public class GenerationBatch { private static final Logger logger = Logger.getLogger(GenerationBatch.class.getName()); - private final Map unitMap = Maps.newLinkedHashMap(); + private final List inputs = Lists.newArrayList(); - public GenerationBatch() { - } - - @VisibleForTesting - public static GenerationBatch fromFile(InputFile file) { - GenerationBatch newBatch = new GenerationBatch(); - newBatch.addSource(file); - return newBatch; - } - - public Set getInputFiles() { - return unitMap.keySet(); - } - - public GenerationUnit generationUnitForFile(InputFile file) { - return unitMap.get(file); + public List getInputs() { + return inputs; } public void processFileArgs(Iterable args) { @@ -179,9 +162,9 @@ private void processJarFile(String filename) { @VisibleForTesting public void addCombinedJar(String filename, Collection 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)); } } @@ -190,6 +173,6 @@ public void addCombinedJar(String filename, Collection 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)); } } diff --git a/translator/src/main/java/com/google/devtools/j2objc/InputFilePreprocessor.java b/translator/src/main/java/com/google/devtools/j2objc/InputFilePreprocessor.java index 33c85637c8..22f909c30c 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/InputFilePreprocessor.java +++ b/translator/src/main/java/com/google/devtools/j2objc/InputFilePreprocessor.java @@ -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; @@ -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 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) { diff --git a/translator/src/main/java/com/google/devtools/j2objc/J2ObjC.java b/translator/src/main/java/com/google/devtools/j2objc/J2ObjC.java index a72b4485ad..ea1150c242 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/J2ObjC.java +++ b/translator/src/main/java/com/google/devtools/j2objc/J2ObjC.java @@ -17,6 +17,7 @@ package com.google.devtools.j2objc; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.Lists; import com.google.common.io.Files; import com.google.devtools.j2objc.util.DeadCodeMap; import com.google.devtools.j2objc.util.ErrorUtil; @@ -96,14 +97,17 @@ public static void run(List fileArgs) { try { JdtParser parser = createParser(); + List inputs = Lists.newArrayList(); GenerationBatch batch = new GenerationBatch(); batch.processFileArgs(fileArgs); + inputs.addAll(batch.getInputs()); if (ErrorUtil.errorCount() > 0) { return; } - AnnotationPreProcessor preProcessor = new AnnotationPreProcessor(batch); + AnnotationPreProcessor preProcessor = new AnnotationPreProcessor(); preProcessor.process(fileArgs); + preProcessor.collectInputs(inputs); preProcessorTempDir = preProcessor.getTemporaryDirectory(); if (ErrorUtil.errorCount() > 0) { return; @@ -112,16 +116,16 @@ public static void run(List fileArgs) { parser.addSourcepathEntry(preProcessorTempDir.getAbsolutePath()); } - InputFilePreprocessor inputFilePreprocessor = new InputFilePreprocessor(batch, parser); - inputFilePreprocessor.process(); + InputFilePreprocessor inputFilePreprocessor = new InputFilePreprocessor(parser); + inputFilePreprocessor.processInputs(inputs); if (ErrorUtil.errorCount() > 0) { return; } TranslationProcessor.loadHeaderMappings(); - TranslationProcessor translationProcessor - = new TranslationProcessor(batch, parser, loadDeadCodeMap()); - translationProcessor.processFiles(batch.getInputFiles()); + TranslationProcessor translationProcessor = + new TranslationProcessor(parser, loadDeadCodeMap()); + translationProcessor.processInputs(inputs); translationProcessor.processBuildClosureDependencies(); if (ErrorUtil.errorCount() > 0) { return; diff --git a/translator/src/main/java/com/google/devtools/j2objc/ProcessingContext.java b/translator/src/main/java/com/google/devtools/j2objc/ProcessingContext.java new file mode 100644 index 0000000000..2b59149268 --- /dev/null +++ b/translator/src/main/java/com/google/devtools/j2objc/ProcessingContext.java @@ -0,0 +1,53 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.devtools.j2objc; + +import com.google.devtools.j2objc.file.InputFile; +import com.google.devtools.j2objc.gen.GenerationUnit; + +/** + * Contains all the state required to preprocess and eventually compile a source + * file into an AST. + */ +public class ProcessingContext { + + // The file may change during preprocessing, but we want to save the path of + // the original source for documentation and line directives. + private final String originalSourcePath; + private InputFile file; // mutable. + private final GenerationUnit generationUnit; + + public ProcessingContext(InputFile file, GenerationUnit generationUnit) { + originalSourcePath = file.getPath(); + this.file = file; + this.generationUnit = generationUnit; + } + + public static ProcessingContext fromFile(InputFile file) { + return new ProcessingContext(file, GenerationUnit.newSingleFileUnit(file)); + } + + public String getOriginalSourcePath() { + return originalSourcePath; + } + + public InputFile getFile() { + return file; + } + + public GenerationUnit getGenerationUnit() { + return generationUnit; + } +} diff --git a/translator/src/main/java/com/google/devtools/j2objc/TranslationProcessor.java b/translator/src/main/java/com/google/devtools/j2objc/TranslationProcessor.java index 0bc5f01d18..6961e582a3 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/TranslationProcessor.java +++ b/translator/src/main/java/com/google/devtools/j2objc/TranslationProcessor.java @@ -16,7 +16,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.devtools.j2objc.ast.CompilationUnit; -import com.google.devtools.j2objc.file.InputFile; import com.google.devtools.j2objc.gen.GenerationUnit; import com.google.devtools.j2objc.gen.ObjectiveCHeaderGenerator; import com.google.devtools.j2objc.gen.ObjectiveCImplementationGenerator; @@ -85,25 +84,18 @@ class TranslationProcessor extends FileProcessor { private static final Logger logger = Logger.getLogger(TranslationProcessor.class.getName()); - private final GenerationBatch batch; private final DeadCodeMap deadCodeMap; private int processedCount = 0; - public TranslationProcessor(GenerationBatch batch, JdtParser parser, DeadCodeMap deadCodeMap) { + public TranslationProcessor(JdtParser parser, DeadCodeMap deadCodeMap) { super(parser); - this.batch = batch; this.deadCodeMap = deadCodeMap; } @Override - protected void processConvertedTree(CompilationUnit unit) { - InputFile file = unit.getInputFile(); - GenerationUnit genUnit = batch.generationUnitForFile(file); - // Possible with --build-closure and in testing. - if (genUnit == null) { - genUnit = GenerationUnit.newSingleFileUnit(file); - } + protected void processConvertedTree(ProcessingContext input, CompilationUnit unit) { + GenerationUnit genUnit = input.getGenerationUnit(); genUnit.addCompilationUnit(unit); if (genUnit.isFullyParsed()) { @@ -115,7 +107,7 @@ protected void processConvertedTree(CompilationUnit unit) { protected void processCompiledGenerationUnit(GenerationUnit unit) { assert unit.getOutputPath() != null; - assert unit.getCompilationUnits().size() == unit.getInputFiles().size(); + assert unit.isFullyParsed(); TimeTracker ticker = getTicker(unit.getOutputPath()); ticker.push(); try { @@ -311,12 +303,9 @@ public static void generateObjectiveCSource(GenerationUnit unit, TimeTracker tic ticker.pop(); } - protected void handleError(InputFile file) { - GenerationUnit generationUnit = batch.generationUnitForFile(file); - if (generationUnit != null) { - // Causes the generation unit to release any trees it was holding. - generationUnit.failed(); - } + protected void handleError(ProcessingContext input) { + // Causes the generation unit to release any trees it was holding. + input.getGenerationUnit().failed(); } public void postProcess() { diff --git a/translator/src/main/java/com/google/devtools/j2objc/ast/CompilationUnit.java b/translator/src/main/java/com/google/devtools/j2objc/ast/CompilationUnit.java index 8e15beb0a9..fe0fa80982 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/ast/CompilationUnit.java +++ b/translator/src/main/java/com/google/devtools/j2objc/ast/CompilationUnit.java @@ -16,7 +16,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; -import com.google.devtools.j2objc.file.InputFile; import com.google.devtools.j2objc.types.Types; import com.google.devtools.j2objc.util.NameTable; @@ -31,7 +30,7 @@ public class CompilationUnit extends TreeNode { private final Types typeEnv; private final NameTable nameTable; - private final InputFile inputFile; + private final String sourceFilePath; private final String mainTypeName; private final String source; private final int[] newlines; @@ -46,12 +45,12 @@ public class CompilationUnit extends TreeNode { ChildList.create(AbstractTypeDeclaration.class, this); public CompilationUnit( - org.eclipse.jdt.core.dom.CompilationUnit jdtNode, InputFile inputFile, + org.eclipse.jdt.core.dom.CompilationUnit jdtNode, String sourceFilePath, String mainTypeName, String source, NameTable.Factory nameTableFactory) { super(jdtNode); typeEnv = new Types(jdtNode.getAST()); nameTable = nameTableFactory == null ? null : nameTableFactory.newNameTable(typeEnv); - this.inputFile = Preconditions.checkNotNull(inputFile); + this.sourceFilePath = Preconditions.checkNotNull(sourceFilePath); Preconditions.checkNotNull(mainTypeName); if (mainTypeName.endsWith(NameTable.PACKAGE_INFO_FILE_NAME)) { mainTypeName = @@ -87,7 +86,7 @@ public CompilationUnit(CompilationUnit other) { super(other); typeEnv = other.getTypeEnv(); nameTable = other.getNameTable(); - inputFile = other.getInputFile(); + sourceFilePath = other.getSourceFilePath(); mainTypeName = other.getMainTypeName(); source = other.getSource(); newlines = new int[other.newlines.length]; @@ -111,8 +110,8 @@ public NameTable getNameTable() { return nameTable; } - public InputFile getInputFile() { - return inputFile; + public String getSourceFilePath() { + return sourceFilePath; } public String getMainTypeName() { @@ -214,7 +213,7 @@ public CompilationUnit copy() { @Override public void validateInner() { super.validateInner(); - Preconditions.checkNotNull(inputFile); + Preconditions.checkNotNull(sourceFilePath); Preconditions.checkNotNull(mainTypeName); Preconditions.checkNotNull(source); Preconditions.checkNotNull(packageDeclaration); diff --git a/translator/src/main/java/com/google/devtools/j2objc/ast/TreeConverter.java b/translator/src/main/java/com/google/devtools/j2objc/ast/TreeConverter.java index 2766f3b624..4641f0ee0e 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/ast/TreeConverter.java +++ b/translator/src/main/java/com/google/devtools/j2objc/ast/TreeConverter.java @@ -14,8 +14,6 @@ package com.google.devtools.j2objc.ast; -import com.google.devtools.j2objc.file.InputFile; -import com.google.devtools.j2objc.util.FileUtil; import com.google.devtools.j2objc.util.NameTable; import org.eclipse.jdt.core.dom.ASTNode; @@ -26,10 +24,9 @@ public class TreeConverter { public static CompilationUnit convertCompilationUnit( - org.eclipse.jdt.core.dom.CompilationUnit jdtUnit, InputFile inputFile, String source, - NameTable.Factory nameTableFactory) { - return new CompilationUnit( - jdtUnit, inputFile, FileUtil.getMainTypeName(inputFile), source, nameTableFactory); + org.eclipse.jdt.core.dom.CompilationUnit jdtUnit, String sourceFilePath, String mainTypeName, + String source, NameTable.Factory nameTableFactory) { + return new CompilationUnit(jdtUnit, sourceFilePath, mainTypeName, source, nameTableFactory); } public static Statement convertStatement(org.eclipse.jdt.core.dom.Statement jdtStatement) { diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/AbstractSourceGenerator.java b/translator/src/main/java/com/google/devtools/j2objc/gen/AbstractSourceGenerator.java index 9969c4365d..2da146ffb5 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/AbstractSourceGenerator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/AbstractSourceGenerator.java @@ -82,10 +82,6 @@ protected void syncFilename(String filename) { builder.syncFilename(filename); } - protected void printStart(String path) { - builder.printStart(path); - } - protected String reindent(String code) { return builder.reindent(code); } diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/GenerationUnit.java b/translator/src/main/java/com/google/devtools/j2objc/gen/GenerationUnit.java index 8df76ff5a3..67f5966d75 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/GenerationUnit.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/GenerationUnit.java @@ -13,6 +13,8 @@ */ package com.google.devtools.j2objc.gen; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.Lists; import com.google.devtools.j2objc.Options; import com.google.devtools.j2objc.ast.CompilationUnit; import com.google.devtools.j2objc.ast.PackageDeclaration; @@ -21,8 +23,6 @@ import com.google.devtools.j2objc.util.UnicodeUtils; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; import java.util.List; import javax.annotation.Nullable; @@ -36,10 +36,11 @@ * @author Mike Thvedt */ public class GenerationUnit { + private String name; private String outputPath; - private final List inputFiles = new ArrayList(); - private List compilationUnits = new ArrayList(); + private final int numUnits; + private List compilationUnits = Lists.newArrayList(); private final String sourceName; private State state = State.ACTIVE; @@ -49,13 +50,14 @@ private enum State { FINISHED // Finished, object is now invalid. } - private GenerationUnit(String sourceName) { + @VisibleForTesting + public GenerationUnit(String sourceName, int numUnits) { this.sourceName = sourceName; + this.numUnits = numUnits; } public static GenerationUnit newSingleFileUnit(InputFile file) { - GenerationUnit unit = new GenerationUnit(file.getPath()); - unit.inputFiles.add(file); + GenerationUnit unit = new GenerationUnit(file.getPath(), 1); if (Options.useSourceDirectories()) { String outputPath = file.getUnitName(); outputPath = outputPath.substring(0, outputPath.lastIndexOf(".java")); @@ -64,16 +66,14 @@ public static GenerationUnit newSingleFileUnit(InputFile file) { return unit; } - public static GenerationUnit newCombinedJarUnit( - String filename, Collection inputFiles) { + public static GenerationUnit newCombinedJarUnit(String filename, int numInputs) { String outputPath = filename; if (outputPath.lastIndexOf(File.separatorChar) < outputPath.lastIndexOf(".")) { outputPath = outputPath.substring(0, outputPath.lastIndexOf(".")); } - GenerationUnit unit = new GenerationUnit(filename); + GenerationUnit unit = new GenerationUnit(filename, numInputs); unit.outputPath = outputPath; unit.name = UnicodeUtils.asValidObjcIdentifier(NameTable.camelCasePath(outputPath)); - unit.inputFiles.addAll(inputFiles); return unit; } @@ -94,10 +94,6 @@ public String getName() { return name; } - public List getInputFiles() { - return inputFiles; - } - /** * A list of CompilationUnits generated from the input files in this GenerationUnit. * This list is mildly stateful in that some processors might add to it. @@ -113,22 +109,22 @@ public void addCompilationUnit(CompilationUnit unit) { if (state != State.ACTIVE) { return; // Ignore any added units. } - assert compilationUnits.size() < inputFiles.size(); + assert compilationUnits.size() < numUnits; compilationUnits.add(unit); if (name == null) { - assert inputFiles.size() == 1; + assert numUnits == 1; name = UnicodeUtils.asValidObjcIdentifier(NameTable.getMainTypeFullName(unit)); } if (outputPath == null) { // We can only infer the output path if there's one compilation unit. - assert inputFiles.size() == 1; + assert numUnits == 1; outputPath = getDefaultOutputPath(unit); } } public boolean isFullyParsed() { - return compilationUnits.size() == inputFiles.size(); + return compilationUnits.size() == numUnits; } /** diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCImplementationGenerator.java b/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCImplementationGenerator.java index 725fe7dedd..3047d26a83 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCImplementationGenerator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCImplementationGenerator.java @@ -68,10 +68,9 @@ public void generate() { println(J2ObjC.getFileHeader(getGenerationUnit().getSourceName())); if (!types.isEmpty() || !packageInfos.isEmpty()) { - printStart(getGenerationUnit().getSourceName()); printImports(packageInfos); for (CompilationUnit packageInfo : packageInfos) { - syncFilename(packageInfo.getInputFile().getPath()); + syncFilename(packageInfo.getSourceFilePath()); generatePackageInfo(packageInfo); } diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCSourceFileGenerator.java b/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCSourceFileGenerator.java index 596f2ca363..49fcb0ebd5 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCSourceFileGenerator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/ObjectiveCSourceFileGenerator.java @@ -92,7 +92,7 @@ protected boolean isLocalType(ITypeBinding type) { protected void setGenerationContext(AbstractTypeDeclaration type) { CompilationUnit unit = TreeUtil.getCompilationUnit(type); - syncFilename(unit.getInputFile().getPath()); + syncFilename(unit.getSourceFilePath()); } protected void save(String path) { diff --git a/translator/src/main/java/com/google/devtools/j2objc/gen/SourceBuilder.java b/translator/src/main/java/com/google/devtools/j2objc/gen/SourceBuilder.java index 55ee1d34d2..9e2ebaf08b 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/gen/SourceBuilder.java +++ b/translator/src/main/java/com/google/devtools/j2objc/gen/SourceBuilder.java @@ -191,19 +191,12 @@ public void syncFilename(String fileName) { // In the dominant usage pattern, the filename is synced right before the line is synced. // Emit 0 so readers don't think the line number is still meaningful. currentLine = 0; - buffer.append(String.format("\n#line %d \"%s\"\n", 0, fileName)); + buffer.append(String.format("\n#line 0 \"%s\"\n", fileName)); } } currentFile = fileName; } - public void printStart(String path) { - currentFile = path; - if (emitLineDirectives) { - buffer.append(String.format("\n#line 1 \"%s\"\n", path)); - } - } - /** * Fix line indention, based on brace count. */ diff --git a/translator/src/main/java/com/google/devtools/j2objc/util/ErrorUtil.java b/translator/src/main/java/com/google/devtools/j2objc/util/ErrorUtil.java index bb0bc06f89..cc59828070 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/util/ErrorUtil.java +++ b/translator/src/main/java/com/google/devtools/j2objc/util/ErrorUtil.java @@ -130,7 +130,7 @@ public static void warning(TreeNode node, String message) { private static String formatMessage(TreeNode node, String message) { CompilationUnit unit = TreeUtil.getCompilationUnit(node); - return String.format("%s:%s: %s", unit.getInputFile().getPath(), node.getLineNumber(), message); + return String.format("%s:%s: %s", unit.getSourceFilePath(), node.getLineNumber(), message); } public static void functionizedMethod() { diff --git a/translator/src/main/java/com/google/devtools/j2objc/util/JdtParser.java b/translator/src/main/java/com/google/devtools/j2objc/util/JdtParser.java index 26b049f392..e4a5b6cdc9 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/util/JdtParser.java +++ b/translator/src/main/java/com/google/devtools/j2objc/util/JdtParser.java @@ -17,7 +17,6 @@ import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.google.devtools.j2objc.file.InputFile; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.AST; @@ -28,7 +27,6 @@ import java.io.File; import java.util.Arrays; import java.util.Collection; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; @@ -133,23 +131,17 @@ private CompilationUnit parse(String unitName, String source, boolean resolveBin * implementation is called with the parsed units. */ public interface Handler { - public void handleParsedUnit(InputFile filePath, CompilationUnit unit); + public void handleParsedUnit(String path, CompilationUnit unit); } - public void parseFiles(Collection files, final Handler handler) { - // We need the whole SourceFile to correctly handle a parsed ADT, so we keep track of it here. - final Map reverseMap = new LinkedHashMap(); - for (InputFile file : files) { - reverseMap.put(file.getPath(), file); - } - + public void parseFiles(Collection paths, final Handler handler) { ASTParser parser = newASTParser(true); FileASTRequestor astRequestor = new FileASTRequestor() { @Override public void acceptAST(String sourceFilePath, CompilationUnit ast) { logger.fine("acceptAST: " + sourceFilePath); if (checkCompilationErrors(sourceFilePath, ast)) { - handler.handleParsedUnit(reverseMap.get(sourceFilePath), ast); + handler.handleParsedUnit(sourceFilePath, ast); } } }; @@ -157,8 +149,8 @@ public void acceptAST(String sourceFilePath, CompilationUnit ast) { // number of "binding key" strings as source files. It doesn't appear to // matter what the binding key strings should be (as long as they're non- // null), so the paths array is reused. - String[] paths = reverseMap.keySet().toArray(new String[reverseMap.size()]); - parser.createASTs(paths, getEncodings(paths.length), paths, astRequestor, null); + String[] pathsArray = paths.toArray(new String[paths.size()]); + parser.createASTs(pathsArray, getEncodings(pathsArray.length), pathsArray, astRequestor, null); } private ASTParser newASTParser(boolean resolveBindings) { diff --git a/translator/src/test/java/com/google/devtools/j2objc/GenerationTest.java b/translator/src/test/java/com/google/devtools/j2objc/GenerationTest.java index a2692ada44..27459abcbd 100644 --- a/translator/src/test/java/com/google/devtools/j2objc/GenerationTest.java +++ b/translator/src/test/java/com/google/devtools/j2objc/GenerationTest.java @@ -137,10 +137,7 @@ public boolean visit(MethodDeclaration node) { * @return the translated compilation unit */ protected CompilationUnit translateType(String typeName, String source) { - String typePath = typeName.replace('.', '/'); - org.eclipse.jdt.core.dom.CompilationUnit unit = compileType(typePath + ".java", source); - CompilationUnit newUnit = TreeConverter.convertCompilationUnit( - unit, new RegularInputFile(typePath + ".java"), source, NameTable.newFactory()); + CompilationUnit newUnit = compileType(typeName, source); TranslationProcessor.applyMutations(newUnit, deadCodeMap, TimeTracker.noop()); return newUnit; } @@ -152,17 +149,20 @@ protected CompilationUnit translateType(String typeName, String source) { * @param source the source code * @return the parsed compilation unit */ - protected org.eclipse.jdt.core.dom.CompilationUnit compileType(String name, String source) { + protected CompilationUnit compileType(String name, String source) { + String mainTypeName = name.substring(name.lastIndexOf('.') + 1); + String path = name.replace('.', '/') + ".java"; int errors = ErrorUtil.errorCount(); parser.setEnableDocComments(Options.docCommentsEnabled()); - org.eclipse.jdt.core.dom.CompilationUnit unit = parser.parseWithBindings(name, source); + org.eclipse.jdt.core.dom.CompilationUnit unit = parser.parseWithBindings(path, source); if (ErrorUtil.errorCount() > errors) { int newErrorCount = ErrorUtil.errorCount() - errors; String info = String.format( "%d test compilation error%s", newErrorCount, (newErrorCount == 1 ? "" : "s")); failWithMessages(info, ErrorUtil.getErrorMessages().subList(errors, ErrorUtil.errorCount())); } - return unit; + return TreeConverter.convertCompilationUnit( + unit, path, mainTypeName, source, NameTable.newFactory()); } protected static List getComGoogleDevtoolsJ2objcPath() { @@ -287,7 +287,7 @@ public boolean visit(MethodDeclaration node) { * which is either the Obj-C header or implementation file */ protected String translateSourceFile(String typeName, String fileName) throws IOException { - String source = getTranslatedFile(typeName + ".java"); + String source = getTranslatedFile(typeName.replace('.', '/') + ".java"); return translateSourceFile(source, typeName, fileName); } @@ -306,7 +306,7 @@ protected String translateSourceFile(String source, String typeName, String file } protected String generateFromUnit(CompilationUnit unit, String filename) throws IOException { - GenerationUnit genUnit = GenerationUnit.newSingleFileUnit(unit.getInputFile()); + GenerationUnit genUnit = new GenerationUnit(unit.getSourceFilePath(), 1); genUnit.addCompilationUnit(unit); TranslationProcessor.generateObjectiveCSource(genUnit, TimeTracker.noop()); return getTranslatedFile(filename); @@ -320,10 +320,10 @@ protected String translateCombinedFiles(String outputPath, String extension, Str } GenerationBatch batch = new GenerationBatch(); batch.addCombinedJar(outputPath + ".testfile", inputFiles); + List inputs = batch.getInputs(); parser.setEnableDocComments(Options.docCommentsEnabled()); - new InputFilePreprocessor(batch, parser).process(); - new TranslationProcessor(batch, parser, DeadCodeMap.builder().build()) - .processFiles(batch.getInputFiles()); + new InputFilePreprocessor(parser).processInputs(inputs); + new TranslationProcessor(parser, DeadCodeMap.builder().build()).processInputs(inputs); return getTranslatedFile(outputPath + extension); } @@ -337,7 +337,7 @@ protected void preprocessFiles(String... fileNames) { batch.addSource(new RegularInputFile( tempDir.getPath() + File.separatorChar + fileName, fileName)); } - new InputFilePreprocessor(batch, parser).process(); + new InputFilePreprocessor(parser).processInputs(batch.getInputs()); } protected Map writeAndReloadHeaderMappings() throws IOException { diff --git a/translator/src/test/java/com/google/devtools/j2objc/TranslationProcessorTest.java b/translator/src/test/java/com/google/devtools/j2objc/TranslationProcessorTest.java index 7860af10ad..888a9cb625 100644 --- a/translator/src/test/java/com/google/devtools/j2objc/TranslationProcessorTest.java +++ b/translator/src/test/java/com/google/devtools/j2objc/TranslationProcessorTest.java @@ -21,6 +21,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.Collections; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; @@ -55,8 +56,8 @@ public void testJarBatchTranslation() throws IOException { GenerationBatch batch = new GenerationBatch(); batch.addSource(new JarredInputFile(getTempDir() + "/test.jar", "mypkg/Foo.java")); batch.addSource(new JarredInputFile(getTempDir() + "/test.jar", "mypkg/Bar.java")); - TranslationProcessor processor = new TranslationProcessor(batch, J2ObjC.createParser(), null); - processor.processFiles(batch.getInputFiles()); + TranslationProcessor processor = new TranslationProcessor(J2ObjC.createParser(), null); + processor.processInputs(batch.getInputs()); assertEquals(0, ErrorUtil.errorCount()); } @@ -68,8 +69,8 @@ public void testSingleSourceFileBuildClosure() throws IOException { GenerationBatch batch = new GenerationBatch(); batch.addSource(new RegularInputFile(getTempDir() + "/Test.java", "Test.java")); - TranslationProcessor processor = new TranslationProcessor(batch, J2ObjC.createParser(), null); - processor.processFiles(batch.getInputFiles()); + TranslationProcessor processor = new TranslationProcessor(J2ObjC.createParser(), null); + processor.processInputs(batch.getInputs()); processor.processBuildClosureDependencies(); String translation = getTranslatedFile("Test.h"); @@ -89,8 +90,8 @@ public void testDuplicateSourceFileOnSourcepath() throws IOException { GenerationBatch batch = new GenerationBatch(); batch.addSource(new RegularInputFile(getTempDir() + "/Test.java", "Test.java")); batch.addSource(new RegularInputFile(getTempDir() + "/src/main/java/Foo.java", "Foo.java")); - TranslationProcessor processor = new TranslationProcessor(batch, J2ObjC.createParser(), null); - processor.processFiles(batch.getInputFiles()); + TranslationProcessor processor = new TranslationProcessor(J2ObjC.createParser(), null); + processor.processInputs(batch.getInputs()); processor.processBuildClosureDependencies(); String translation = getTranslatedFile("Foo.h"); @@ -101,17 +102,16 @@ public void testDuplicateSourceFileOnSourcepath() throws IOException { public void testBatchReuse() throws IOException { addSourceFile("class Test { }", "Test.java"); - GenerationBatch batch = new GenerationBatch(); RegularInputFile inputFile = new RegularInputFile(getTempDir() + "/Test.java", "Test.java"); - batch.addSource(inputFile); - TranslationProcessor processor = new TranslationProcessor(batch, J2ObjC.createParser(), null); - processor.processFiles(batch.getInputFiles()); + ProcessingContext input = ProcessingContext.fromFile(inputFile); + TranslationProcessor processor = new TranslationProcessor(J2ObjC.createParser(), null); + processor.processInputs(Collections.singletonList(input)); String header = getTranslatedFile("Test.h"); String impl = getTranslatedFile("Test.m"); assertTranslation(header, "@interface Test"); assertTranslation(impl, "@implementation Test"); // Test that the GenerationUnit no longer holds a reference to the tree. - assertEquals(0, batch.generationUnitForFile(inputFile).getCompilationUnits().size()); + assertEquals(0, input.getGenerationUnit().getCompilationUnits().size()); } } diff --git a/translator/src/test/java/com/google/devtools/j2objc/gen/LineDirectivesTest.java b/translator/src/test/java/com/google/devtools/j2objc/gen/LineDirectivesTest.java index 48467d4c9c..348f530f91 100644 --- a/translator/src/test/java/com/google/devtools/j2objc/gen/LineDirectivesTest.java +++ b/translator/src/test/java/com/google/devtools/j2objc/gen/LineDirectivesTest.java @@ -56,7 +56,7 @@ public void testMethodNumbering() throws IOException { + " void two() {}\n" + " void three() {}}\n", "A", "A.m"); - assertTranslation(translation, "#line 1 \"A.java\""); + assertTranslation(translation, "#line 0 \"A.java\""); assertTranslation(translation, "#line 3\n@implementation A"); assertTranslation(translation, "#line 6\n- (void)one"); // Lines match up between one() and two() so no need for the directive. @@ -74,8 +74,7 @@ public void testStatementNumbering() throws IOException { + " return Integer.toString(i);\n" + " }}\n", "A", "A.m"); - assertTranslation(translation, "#line 1 \"A.java\""); - assertTranslation(translation, "#line 1\n@implementation A"); + assertTranslation(translation, "#line 0 \"A.java\""); assertTranslation(translation, "#line 2\n- (NSString *)test"); assertTranslation(translation, "#line 4\n jint i = 0;"); assertTranslation(translation, "#line 7\n return JavaLangInteger_toStringWithInt_(i);"); @@ -162,7 +161,6 @@ public void testCombinedFileLineDirectives() throws IOException { String translation = translateCombinedFiles( "unit/Foo", ".m", "unit/TestDependent.java", "unit/AnotherTest.java", "unit/Test.java"); - assertTranslation(translation, "#line 1 \"unit/Foo.testfile\""); assertDirectivePreceedsLine( translation, "TestDependent.java", "@implementation UnitTestDependent"); assertDirectivePreceedsLine( diff --git a/translator/src/test/java/com/google/devtools/j2objc/translate/OuterReferenceResolverTest.java b/translator/src/test/java/com/google/devtools/j2objc/translate/OuterReferenceResolverTest.java index c8cbcb4d16..66719667bf 100644 --- a/translator/src/test/java/com/google/devtools/j2objc/translate/OuterReferenceResolverTest.java +++ b/translator/src/test/java/com/google/devtools/j2objc/translate/OuterReferenceResolverTest.java @@ -22,14 +22,11 @@ import com.google.devtools.j2objc.ast.InfixExpression; import com.google.devtools.j2objc.ast.MethodInvocation; import com.google.devtools.j2objc.ast.PostfixExpression; -import com.google.devtools.j2objc.ast.TreeConverter; import com.google.devtools.j2objc.ast.TreeNode; import com.google.devtools.j2objc.ast.TreeNode.Kind; import com.google.devtools.j2objc.ast.TreeVisitor; import com.google.devtools.j2objc.ast.TypeDeclaration; -import com.google.devtools.j2objc.file.RegularInputFile; import com.google.devtools.j2objc.util.BindingUtil; -import com.google.devtools.j2objc.util.NameTable; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; @@ -140,9 +137,7 @@ public void testAnonymousClassInheritsLocalClassInStaticMethod() { } private void resolveSource(String name, String source) { - org.eclipse.jdt.core.dom.CompilationUnit jdtUnit = compileType(name + ".java", source); - CompilationUnit unit = TreeConverter.convertCompilationUnit( - jdtUnit, new RegularInputFile(name + ".java"), source, NameTable.newFactory()); + CompilationUnit unit = compileType(name, source); OuterReferenceResolver.resolve(unit); findTypeDeclarations(unit); } diff --git a/translator/src/test/java/com/google/devtools/j2objc/types/ImplementationImportCollectorTest.java b/translator/src/test/java/com/google/devtools/j2objc/types/ImplementationImportCollectorTest.java index ee0fe645af..5b7aeea274 100644 --- a/translator/src/test/java/com/google/devtools/j2objc/types/ImplementationImportCollectorTest.java +++ b/translator/src/test/java/com/google/devtools/j2objc/types/ImplementationImportCollectorTest.java @@ -36,14 +36,14 @@ protected void tearDown() throws Exception { // Verify that invoked method's return value has associated header. public void testMethodReturnHasHeader() throws IOException { - addSourceFile("class FooException extends Exception { AssertionError asAssertion() { " + - "return new AssertionError(this); }}", "FooException.java"); + addSourceFile("class FooException extends Exception { AssertionError asAssertion() { " + + "return new AssertionError(this); }}", "FooException.java"); addSourceFile( "class FooMaker { static FooException makeException() { return new FooException(); }}", "FooMaker.java"); String translation = translateSourceFile( - "class A { void test() { " + - "throw FooMaker.makeException().asAssertion(); }}", "A", "A.m"); + "class A { void test() { " + + "throw FooMaker.makeException().asAssertion(); }}", "A", "A.m"); assertTranslation(translation, "#include \"FooException.h\""); } @@ -91,11 +91,11 @@ public void testObjectArrayImport() throws IOException { } public void testEnhancedForMethodInvocation() throws IOException { - addSourceFile("import java.util.*; class A { " + - "final Map map; }", "A.java"); + addSourceFile("import java.util.*; class A { " + + "final Map map; }", "A.java"); String translation = translateSourceFile( - "import java.util.*; class B extends A { " + - "void test() { for (String s : map.keySet()) {}}}", "B", "B.m"); + "import java.util.*; class B extends A { " + + "void test() { for (String s : map.keySet()) {}}}", "B", "B.m"); assertTranslation(translation, "#include \"java/util/Map.h\""); } @@ -138,9 +138,9 @@ public void testMultiArrayTypeLiteralImport() throws IOException { // Verify that a multi-catch clause imports are all collected. public void testMultiCatchClauses() throws IOException { String translation = translateSourceFile( - "class Test { void test() {" + - " try { System.out.println(); } catch (ArithmeticException | AssertionError | " + - " ClassCastException | SecurityException e) {} }}", + "class Test { void test() {" + + " try { System.out.println(); } catch (ArithmeticException | AssertionError | " + + " ClassCastException | SecurityException e) {} }}", "Test", "Test.m"); assertTranslation(translation, "#include \"java/lang/ArithmeticException.h\""); assertTranslation(translation, "#include \"java/lang/AssertionError.h\""); @@ -152,10 +152,10 @@ public void testMultiCatchClauses() throws IOException { public void testPlatformImports() throws IOException { Options.setOutputStyle(Options.OutputStyleOption.NONE); String translation = translateSourceFile( - "package foo.bar; import org.xml.sax.*; import org.xml.sax.helpers.*; " + - "class Test { XMLReader test() { " + - " try { return XMLReaderFactory.createXMLReader(); } catch (SAXException e) {} " + - " return null; }}", + "package foo.bar; import org.xml.sax.*; import org.xml.sax.helpers.*; " + + "class Test { XMLReader test() { " + + " try { return XMLReaderFactory.createXMLReader(); } catch (SAXException e) {} " + + " return null; }}", "Test", "Test.m"); // Test file's import should not have package. @@ -171,10 +171,10 @@ public void testPlatformImports() throws IOException { public void testPlatformImportsSourceDirs() throws IOException { Options.setOutputStyle(Options.OutputStyleOption.SOURCE); String translation = translateSourceFile( - "package foo.bar; import org.xml.sax.*; import org.xml.sax.helpers.*; " + - "class Test { XMLReader test() { " + - " try { return XMLReaderFactory.createXMLReader(); } catch (SAXException e) {} " + - " return null; }}", + "package foo.bar; import org.xml.sax.*; import org.xml.sax.helpers.*; " + + "class Test { XMLReader test() { " + + " try { return XMLReaderFactory.createXMLReader(); } catch (SAXException e) {} " + + " return null; }}", "Test", "Test.m"); // Test file's import should not have package. @@ -189,7 +189,7 @@ public void testPlatformImportsSourceDirs() throws IOException { public void testAddsHeaderForRenamedMainType() throws IOException { String translation = translateSourceFile( "package foo; import com.google.j2objc.annotations.ObjectiveCName;" - + " @ObjectiveCName(\"Bar\") class Test {}", "foo/Test", "foo/Test.m"); + + " @ObjectiveCName(\"Bar\") class Test {}", "foo.Test", "foo/Test.m"); assertTranslation(translation, "#include \"foo/Test.h\""); } } diff --git a/translator/src/test/java/com/google/devtools/j2objc/util/NameTableTest.java b/translator/src/test/java/com/google/devtools/j2objc/util/NameTableTest.java index 853ac01baa..7326b68110 100644 --- a/translator/src/test/java/com/google/devtools/j2objc/util/NameTableTest.java +++ b/translator/src/test/java/com/google/devtools/j2objc/util/NameTableTest.java @@ -167,9 +167,9 @@ public void testRenameMapping() throws IOException { addSourceFile("package foo.bar; public class A { static void test() {}}", "foo/bar/A.java"); addSourceFile( "package foo.bar; public class B { void test() { A.test(); }}", "foo/bar/B.java"); - String translation = translateSourceFile("foo/bar/A", "foo/bar/A.h"); + String translation = translateSourceFile("foo.bar.A", "foo/bar/A.h"); assertTranslation(translation, "@interface Test2Name : NSObject"); - translation = translateSourceFile("foo/bar/B", "foo/bar/B.m"); + translation = translateSourceFile("foo.bar.B", "foo/bar/B.m"); assertTranslation(translation, "Test2Name_test();"); } finally { Options.getClassMappings().remove("foo.bar.A"); @@ -285,7 +285,7 @@ public void testRenamePackageAnnotation() throws IOException { addSourceFile("@com.google.j2objc.annotations.ObjectiveCName(\"FB\") " + "package foo.bar;", "foo/bar/package-info.java"); addSourceFile("package foo.bar; public class Test {}", "foo/bar/Test.java"); - String translation = translateSourceFile("foo/bar/Test", "foo/bar/Test.h"); + String translation = translateSourceFile("foo.bar.Test", "foo/bar/Test.h"); assertTranslation(translation, "@interface FBTest : NSObject"); assertTranslation(translation, "J2OBJC_EMPTY_STATIC_INIT(FBTest)"); assertTranslation(translation, "typedef FBTest FooBarTest;"); @@ -301,7 +301,7 @@ public void testRenamePackageAnnotationEnum() throws IOException { addSourceFile("@com.google.j2objc.annotations.ObjectiveCName(\"FB\") " + "package foo.bar;", "foo/bar/package-info.java"); addSourceFile("package foo.bar; public enum Test { FOO, BAR }", "foo/bar/Test.java"); - String translation = translateSourceFile("foo/bar/Test", "foo/bar/Test.h"); + String translation = translateSourceFile("foo.bar.Test", "foo/bar/Test.h"); assertTranslatedLines(translation, "typedef NS_ENUM(NSUInteger, FBTest) {", "FBTest_FOO = 0,", "FBTest_BAR = 1,", "};"); assertTranslation(translation, "@interface FBTestEnum : JavaLangEnum"); @@ -317,7 +317,7 @@ public void testRenamePackageAnnotationEnum() throws IOException { assertTranslation(translation, "J2ObjcClassInfo _FBTestEnum = { 2, \"Test\", \"foo.bar\", "); // Make sure package-info class doesn't use prefix for its own type name. - translation = translateSourceFile("foo/bar/package-info", "foo/bar/package-info.m"); + translation = translateSourceFile("foo.bar.package-info", "foo/bar/package-info.m"); assertTranslation(translation, "@interface FooBarpackage_info"); assertTranslation(translation, "@implementation FooBarpackage_info"); assertNotInTranslation(translation, "FBpackage_info");