diff --git a/translator/Makefile b/translator/Makefile index 20e9b2734b..5d8392c831 100644 --- a/translator/Makefile +++ b/translator/Makefile @@ -160,6 +160,9 @@ JAVA_SOURCES = \ ast/VariableDeclarationFragment.java \ ast/VariableDeclarationStatement.java \ ast/WhileStatement.java \ + file/InputFile.java \ + file/JarredInputFile.java \ + file/RegularInputFile.java \ gen/AbstractSourceGenerator.java \ gen/GenerationUnit.java \ gen/JavadocGenerator.java \ diff --git a/translator/src/main/java/com/google/devtools/j2objc/BuildClosureQueue.java b/translator/src/main/java/com/google/devtools/j2objc/BuildClosureQueue.java index 4052b587aa..633c9d133d 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/BuildClosureQueue.java +++ b/translator/src/main/java/com/google/devtools/j2objc/BuildClosureQueue.java @@ -79,10 +79,9 @@ private static InputFile getFileForName(String name) { return null; } - String sourceName = name.replace('.', File.separatorChar) + ".java"; InputFile inputFile = null; try { - inputFile = FileUtil.findOnSourcePath(sourceName); + inputFile = FileUtil.findOnSourcePath(name); } catch (IOException e) { ErrorUtil.warning(e.getMessage()); } @@ -92,7 +91,8 @@ private static InputFile getFileForName(String name) { } // Check if the source file is older than the generated header file. - File headerSource = new File(Options.getOutputDirectory(), sourceName.replace(".java", ".h")); + File headerSource = + new File(Options.getOutputDirectory(), name.replace('.', File.separatorChar) + ".h"); if (headerSource.exists() && inputFile.lastModified() < headerSource.lastModified()) { return null; } @@ -100,12 +100,10 @@ private static InputFile getFileForName(String name) { return inputFile; } - private static boolean findClassFile(String typeName) { - // Zip/jar files always use forward slashes. - String path = typeName.replace('.', File.separatorChar) + ".class"; + private static boolean findClassFile(String name) { InputFile f = null; try { - f = FileUtil.findOnClassPath(path); + f = FileUtil.findOnClassPath(name); } catch (IOException e) { ErrorUtil.warning(e.getMessage()); } @@ -114,7 +112,7 @@ private static boolean findClassFile(String typeName) { } // See if it's a JRE class. try { - Class.forName(typeName); + Class.forName(name); return true; } catch (ClassNotFoundException e) { // Fall-through. 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 21a6294f3e..1ec8c69c63 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/GenerationBatch.java +++ b/translator/src/main/java/com/google/devtools/j2objc/GenerationBatch.java @@ -128,7 +128,10 @@ private void processJavaFile(String filename) { inputFile = new RegularInputFile(filename, filename); if (!inputFile.exists()) { - inputFile = FileUtil.findOnSourcePath(filename); + // Convert to a qualified name and search on the sourcepath. + String qualifiedName = + filename.substring(0, filename.length() - 5).replace(File.separatorChar, '.'); + inputFile = FileUtil.findOnSourcePath(qualifiedName); if (inputFile == null) { ErrorUtil.error("No such file: " + filename); 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 26e6cf8db8..2766f3b624 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 @@ -29,8 +29,7 @@ public static CompilationUnit convertCompilationUnit( org.eclipse.jdt.core.dom.CompilationUnit jdtUnit, InputFile inputFile, String source, NameTable.Factory nameTableFactory) { return new CompilationUnit( - jdtUnit, inputFile, FileUtil.getClassNameFromFilePath(inputFile.getUnitName()), source, - nameTableFactory); + jdtUnit, inputFile, FileUtil.getMainTypeName(inputFile), source, nameTableFactory); } public static Statement convertStatement(org.eclipse.jdt.core.dom.Statement jdtStatement) { diff --git a/translator/src/main/java/com/google/devtools/j2objc/file/InputFile.java b/translator/src/main/java/com/google/devtools/j2objc/file/InputFile.java index d792594d7e..acb16ccdab 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/file/InputFile.java +++ b/translator/src/main/java/com/google/devtools/j2objc/file/InputFile.java @@ -52,5 +52,12 @@ public interface InputFile { */ String getUnitName(); + /** + * Gets name of the file stripped of any path components. + * For example, the basename of "package/path/SourceFile.java" is + * "SourceFile.java". + */ + String getBasename(); + long lastModified(); } diff --git a/translator/src/main/java/com/google/devtools/j2objc/file/JarredInputFile.java b/translator/src/main/java/com/google/devtools/j2objc/file/JarredInputFile.java index a8effb1ec4..2450008471 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/file/JarredInputFile.java +++ b/translator/src/main/java/com/google/devtools/j2objc/file/JarredInputFile.java @@ -71,6 +71,11 @@ public String getUnitName() { return internalPath; } + @Override + public String getBasename() { + return internalPath.substring(internalPath.lastIndexOf('/') + 1); + } + @Override public long lastModified() { return new File(jarPath).lastModified(); diff --git a/translator/src/main/java/com/google/devtools/j2objc/file/RegularInputFile.java b/translator/src/main/java/com/google/devtools/j2objc/file/RegularInputFile.java index 56a5871b66..4167732dd3 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/file/RegularInputFile.java +++ b/translator/src/main/java/com/google/devtools/j2objc/file/RegularInputFile.java @@ -61,6 +61,11 @@ public String getUnitName() { return unitPath; } + @Override + public String getBasename() { + return unitPath.substring(unitPath.lastIndexOf(File.separatorChar) + 1); + } + @Override public long lastModified() { return new File(path).lastModified(); diff --git a/translator/src/main/java/com/google/devtools/j2objc/util/FileUtil.java b/translator/src/main/java/com/google/devtools/j2objc/util/FileUtil.java index 9f106e1fe4..9447fa46a2 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/util/FileUtil.java +++ b/translator/src/main/java/com/google/devtools/j2objc/util/FileUtil.java @@ -40,23 +40,20 @@ */ public class FileUtil { - /** - * Gets the name of the file, stripped of any directory or extension. - */ - public static String getClassNameFromFilePath(String sourceFileName) { - int begin = sourceFileName.lastIndexOf(File.separatorChar) + 1; - // Also check for /, since this may be a jar'd source when translating on Windows. - int n = sourceFileName.lastIndexOf('/') + 1; - if (n > begin) { - begin = n; + public static String getMainTypeName(InputFile file) { + String basename = file.getBasename(); + int end = basename.lastIndexOf(".java"); + if (end == -1) { + end = basename.lastIndexOf(".class"); + } + if (end != -1) { + basename = basename.substring(0, end); } - int end = sourceFileName.lastIndexOf(".java"); - String className = sourceFileName.substring(begin, end); - return className; + return basename; } public static String getQualifiedMainTypeName(InputFile file, CompilationUnit unit) { - String qualifiedName = FileUtil.getClassNameFromFilePath(file.getUnitName()); + String qualifiedName = getMainTypeName(file); PackageDeclaration packageDecl = unit.getPackage(); if (packageDecl != null) { String packageName = packageDecl.getName().getFullyQualifiedName(); @@ -71,8 +68,8 @@ public static String getQualifiedMainTypeName(InputFile file, CompilationUnit un * Returns a file guaranteed to exist, or null. */ @Nullable - public static InputFile findOnSourcePath(String filename) throws IOException { - return findOnPaths(filename, Options.getSourcePathEntries()); + public static InputFile findOnSourcePath(String qualifiedName) throws IOException { + return findOnPaths(qualifiedName, Options.getSourcePathEntries(), ".java"); } /** @@ -81,22 +78,26 @@ public static InputFile findOnSourcePath(String filename) throws IOException { * Returns a file guaranteed to exist, or null. */ @Nullable - public static InputFile findOnClassPath(String filename) throws IOException { - return findOnPaths(filename, Options.getClassPathEntries()); + public static InputFile findOnClassPath(String qualifiedName) throws IOException { + return findOnPaths(qualifiedName, Options.getClassPathEntries(), ".class"); } - private static InputFile findOnPaths(String filename, List paths) throws IOException { + private static InputFile findOnPaths( + String qualifiedName, List paths, String extension) throws IOException { + String sourceFileName = qualifiedName.replace('.', File.separatorChar) + extension; + // Zip/jar files always use forward slashes. + String jarEntryName = qualifiedName.replace('.', '/') + extension; for (String pathEntry : paths) { File f = new File(pathEntry); if (f.isDirectory()) { RegularInputFile regularFile = new RegularInputFile( - pathEntry + File.separatorChar + filename, filename); + pathEntry + File.separatorChar + sourceFileName, sourceFileName); if (regularFile.exists()) { return regularFile; } } else { // Assume it's a jar file - JarredInputFile jarFile = new JarredInputFile(pathEntry, filename); + JarredInputFile jarFile = new JarredInputFile(pathEntry, jarEntryName); if (jarFile.exists()) { return jarFile; } diff --git a/translator/src/main/java/com/google/devtools/j2objc/util/NameTable.java b/translator/src/main/java/com/google/devtools/j2objc/util/NameTable.java index 0a5ab8f3b5..4062af3b97 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/util/NameTable.java +++ b/translator/src/main/java/com/google/devtools/j2objc/util/NameTable.java @@ -888,15 +888,13 @@ public String getPrefix(IPackageBinding packageBinding) { */ private static String getPrefixFromPackageInfoSource(IPackageBinding packageBinding) { try { - String expectedPackageInfoPath = packageBinding.getName(); + String qualifiedName = "package-info"; + String packageName = packageBinding.getName(); // Path will be null if this is the empty package. - if (expectedPackageInfoPath == null) { - expectedPackageInfoPath = "package-info.java"; - } else { - expectedPackageInfoPath = expectedPackageInfoPath.replace('.', File.separatorChar) - + File.separatorChar + "package-info.java"; + if (packageName != null) { + qualifiedName = packageName + '.' + qualifiedName; } - InputFile file = FileUtil.findOnSourcePath(expectedPackageInfoPath); + InputFile file = FileUtil.findOnSourcePath(qualifiedName); if (file != null) { String pkgInfo = FileUtil.readFile(file); int i = pkgInfo.indexOf("@ObjectiveCName");