src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SmartFileManager.java

Print this page
rev 2819 : imported patch my-classpath-deps-00

@@ -89,23 +89,30 @@
         if (!(fileManager instanceof JavacFileManager))
             throw new IllegalStateException();
         ((JavacFileManager) fileManager).setSymbolFileEnabled(b);
     }
 
+    @DefinedBy(Api.COMPILER)
+    public String inferBinaryName(Location location, JavaFileObject file) {
+        return super.inferBinaryName(location, locUnwrap(file));
+    }
+
+
     public Map<String,Set<URI>> getPackageArtifacts() {
         return packageArtifacts;
     }
 
     @Override @DefinedBy(Api.COMPILER)
     public Iterable<JavaFileObject> list(Location location,
                                          String packageName,
                                          Set<Kind> kinds,
                                          boolean recurse) throws IOException {
+        // TODO: Do this lazily by returning an iterable with a filtering Iterator
         // Acquire the list of files.
         Iterable<JavaFileObject> files = super.list(location, packageName, kinds, recurse);
         if (visibleSources.isEmpty()) {
-            return files;
+            return locWrapMany(files, location);
         }
         // Now filter!
         ListBuffer<JavaFileObject> filteredFiles = new ListBuffer<>();
         for (JavaFileObject f : files) {
             URI uri = f.toUri();

@@ -114,23 +121,20 @@
                 || t.endsWith(".class")
                 || visibleSources.contains(uri)) {
                 filteredFiles.add(f);
             }
         }
-        return filteredFiles;
-    }
 
-    @Override @DefinedBy(Api.COMPILER)
-    public boolean hasLocation(Location location) {
-        return super.hasLocation(location);
+        return locWrapMany(filteredFiles, location);
     }
 
     @Override @DefinedBy(Api.COMPILER)
     public JavaFileObject getJavaFileForInput(Location location,
                                               String className,
                                               Kind kind) throws IOException {
         JavaFileObject file = super.getJavaFileForInput(location, className, kind);
+        file = locWrap(file, location);
         if (file == null || visibleSources.isEmpty()) {
             return file;
         }
 
         if (visibleSources.contains(file.toUri())) {

@@ -143,10 +147,11 @@
     public JavaFileObject getJavaFileForOutput(Location location,
                                                String className,
                                                Kind kind,
                                                FileObject sibling) throws IOException {
         JavaFileObject file = super.getJavaFileForOutput(location, className, kind, sibling);
+        file = locWrap(file, location);
         if (file == null) return file;
         int dp = className.lastIndexOf('.');
         String pkg_name = "";
         if (dp != -1) {
             pkg_name = className.substring(0, dp);

@@ -160,10 +165,11 @@
     @Override @DefinedBy(Api.COMPILER)
     public FileObject getFileForInput(Location location,
                                       String packageName,
                                       String relativeName) throws IOException {
         FileObject file =  super.getFileForInput(location, packageName, relativeName);
+        file = locWrap(file, location);
         if (file == null || visibleSources.isEmpty()) {
             return file;
         }
 
         if (visibleSources.contains(file.toUri())) {

@@ -175,25 +181,26 @@
     @Override @DefinedBy(Api.COMPILER)
     public FileObject getFileForOutput(Location location,
                                        String packageName,
                                        String relativeName,
                                        FileObject sibling) throws IOException {
-        FileObject file = super.getFileForOutput(location, packageName, relativeName, sibling);
+        FileObject superFile = super.getFileForOutput(location, packageName, relativeName, sibling);
+        FileObject file = locWrap(superFile, location);
         if (file == null) return file;
-        if (location.equals(StandardLocation.NATIVE_HEADER_OUTPUT) &&
-                file instanceof JavaFileObject) {
-           file = new SmartFileObject((JavaFileObject)file, stdout);
+
+        if (location.equals(StandardLocation.NATIVE_HEADER_OUTPUT) && superFile instanceof JavaFileObject) {
+           file = new SmartFileObject((JavaFileObject) file, stdout);
            packageName = ":" + packageNameFromFileName(relativeName);
         }
         if (packageName.equals("")) {
             packageName = ":";
         }
         addArtifact(packageName, file.toUri());
         return file;
     }
 
-    private String packageNameFromFileName(String fn) {
+    private static String packageNameFromFileName(String fn) {
         StringBuilder sb = new StringBuilder();
         int p = fn.indexOf('_'), pp = 0;
         while (p != -1) {
             if (sb.length() > 0) sb.append('.');
             sb.append(fn.substring(pp,p));

@@ -202,24 +209,52 @@
             p = fn.indexOf('_',pp);
         }
         return sb.toString();
     }
 
-    @Override @DefinedBy(Api.COMPILER)
-    public void flush() throws IOException {
-        super.flush();
-    }
-
-    @Override @DefinedBy(Api.COMPILER)
-    public void close() throws IOException {
-        super.close();
-    }
-
     void addArtifact(String pkgName, URI art) {
         Set<URI> s = packageArtifacts.get(pkgName);
         if (s == null) {
             s = new HashSet<>();
             packageArtifacts.put(pkgName, s);
         }
         s.add(art);
     }
+
+    private static JavaFileObject locWrap(JavaFileObject jfo, Location loc) {
+        return jfo == null ? null : new JavaFileObjectWithLocation<>(jfo, loc);
+    }
+
+    private static FileObject locWrap(FileObject fo, Location loc) {
+        if (fo instanceof JavaFileObject)
+            return locWrap((JavaFileObject) fo, loc);
+        return fo == null ? null : new FileObjectWithLocation<>(fo, loc);
+    }
+
+    @DefinedBy(Api.COMPILER)
+    @Override
+    public boolean isSameFile(FileObject a, FileObject b) {
+        return super.isSameFile(locUnwrap(a), locUnwrap(b));
+    }
+
+    private static ListBuffer<JavaFileObject> locWrapMany(Iterable<JavaFileObject> jfos,
+                                                          Location loc) {
+        ListBuffer<JavaFileObject> locWrapped = new ListBuffer<>();
+        for (JavaFileObject f : jfos)
+            locWrapped.add(locWrap(f, loc));
+        return locWrapped;
+    }
+
+    private static FileObject locUnwrap(FileObject fo) {
+        if (fo instanceof FileObjectWithLocation<?>)
+            return ((FileObjectWithLocation<?>) fo).getDelegate();
+        if (fo instanceof JavaFileObjectWithLocation<?>)
+            return ((JavaFileObjectWithLocation<?>) fo).getDelegate();
+        return fo;
+    }
+
+    private static JavaFileObject locUnwrap(JavaFileObject fo) {
+        if (fo instanceof JavaFileObjectWithLocation<?>)
+            return ((JavaFileObjectWithLocation<?>) fo).getDelegate();
+        return fo;
+    }
 }