From d92bc59eb0323dd38d760dae4f9ff6058543b6be Mon Sep 17 00:00:00 2001 From: Takuya Murakami Date: Sun, 15 Oct 2017 21:42:10 +0900 Subject: fix issue #1440, #1472: wrap BasedFileManager for jdk9 --- src/core/lombok/javac/apt/LombokFileObjects.java | 81 ++++++++++++++++++++++++ 1 file changed, 81 insertions(+) (limited to 'src/core') diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java index cb2036e9..f9a0e9b4 100644 --- a/src/core/lombok/javac/apt/LombokFileObjects.java +++ b/src/core/lombok/javac/apt/LombokFileObjects.java @@ -22,13 +22,18 @@ package lombok.javac.apt; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URI; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Iterator; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; +import javax.tools.FileObject; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.JavaFileObject.Kind; @@ -120,6 +125,8 @@ final class LombokFileObjects { Class superType = Class.forName("com.sun.tools.javac.file.BaseFileManager"); if (superType.isInstance(wrappedManager)) { return new Java9Compiler(wrappedManager); + } else { + return new Java9Compiler(new BaseFileManagerWrapper(wrappedManager)); } } catch (Exception e) {} @@ -142,6 +149,80 @@ final class LombokFileObjects { } throw new IllegalArgumentException(sb.toString()); } + + static class BaseFileManagerWrapper extends BaseFileManager { + JavaFileManager manager; + + public BaseFileManagerWrapper(JavaFileManager manager) { + super(StandardCharsets.UTF_8); // TODO: + this.manager = manager; + } + + @Override + public int isSupportedOption(String option) { + return manager.isSupportedOption(option); + } + + @Override + public ClassLoader getClassLoader(Location location) { + return manager.getClassLoader(location); + } + + @Override + public Iterable list(Location location, String packageName, Set kinds, boolean recurse) throws IOException { + return manager.list(location, packageName, kinds, recurse); + } + + @Override + public String inferBinaryName(Location location, JavaFileObject file) { + return manager.inferBinaryName(location, file); + } + + @Override + public boolean isSameFile(FileObject a, FileObject b) { + return manager.isSameFile(a, b); + } + + @Override + public boolean handleOption(String current, Iterator remaining) { + return manager.handleOption(current, remaining); + } + + @Override + public boolean hasLocation(Location location) { + return manager.hasLocation(location); + } + + @Override + public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException { + return manager.getJavaFileForInput(location, className, kind); + } + + @Override + public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException { + return manager.getJavaFileForOutput(location, className, kind, sibling); + } + + @Override + public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException { + return manager.getFileForInput(location, packageName, relativeName); + } + + @Override + public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException { + return manager.getFileForOutput(location, packageName, relativeName, sibling); + } + + @Override + public void flush() throws IOException { + manager.flush(); + } + + @Override + public void close() throws IOException { + manager.close(); + } + } static JavaFileObject createEmpty(Compiler compiler, String name, Kind kind) { return compiler.wrap(new EmptyLombokFileObject(name, kind)); -- cgit From 08e5773d0ab82ef91c925243e3192166d73be463 Mon Sep 17 00:00:00 2001 From: Takuya Murakami Date: Mon, 16 Oct 2017 00:21:59 +0900 Subject: Add my name to AUTHORS, remove TODO --- AUTHORS | 1 + src/core/lombok/javac/apt/LombokFileObjects.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'src/core') diff --git a/AUTHORS b/AUTHORS index 38ceadeb..27b3fcf5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -20,6 +20,7 @@ Robbert Jan Grootjans Roel Spilker Sander Koning Szymon Pacanowski +Takuya Murakami Taiki Sugawara Thomas Darimont Yun Zhi Lin diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java index f9a0e9b4..f1045a3e 100644 --- a/src/core/lombok/javac/apt/LombokFileObjects.java +++ b/src/core/lombok/javac/apt/LombokFileObjects.java @@ -154,7 +154,7 @@ final class LombokFileObjects { JavaFileManager manager; public BaseFileManagerWrapper(JavaFileManager manager) { - super(StandardCharsets.UTF_8); // TODO: + super(StandardCharsets.UTF_8); this.manager = manager; } -- cgit From f55ebbe710f8d8065520225dc78ebf6d7ecd7616 Mon Sep 17 00:00:00 2001 From: Takuya Murakami Date: Mon, 16 Oct 2017 01:03:12 +0900 Subject: LombokFileObjects: use default charset in BaseFileManager wrapper. --- src/core/lombok/javac/apt/LombokFileObjects.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core') diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java index f1045a3e..8b6d4c2e 100644 --- a/src/core/lombok/javac/apt/LombokFileObjects.java +++ b/src/core/lombok/javac/apt/LombokFileObjects.java @@ -154,7 +154,7 @@ final class LombokFileObjects { JavaFileManager manager; public BaseFileManagerWrapper(JavaFileManager manager) { - super(StandardCharsets.UTF_8); + super(null); // use default encoding this.manager = manager; } -- cgit From 4298d97be8c2a3e1034619601719a493fcf17d48 Mon Sep 17 00:00:00 2001 From: Takuya Murakami Date: Mon, 16 Oct 2017 23:38:57 +0900 Subject: LombokFileObjects: get encoding from wrappedManager. --- src/core/lombok/javac/apt/LombokFileObjects.java | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/core') diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java index 8b6d4c2e..917bfe9e 100644 --- a/src/core/lombok/javac/apt/LombokFileObjects.java +++ b/src/core/lombok/javac/apt/LombokFileObjects.java @@ -26,7 +26,7 @@ import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URI; -import java.nio.charset.StandardCharsets; +import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Iterator; @@ -37,6 +37,7 @@ import javax.tools.FileObject; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.JavaFileObject.Kind; +import javax.tools.StandardLocation; import lombok.core.DiagnosticsReceiver; @@ -126,7 +127,8 @@ final class LombokFileObjects { if (superType.isInstance(wrappedManager)) { return new Java9Compiler(wrappedManager); } else { - return new Java9Compiler(new BaseFileManagerWrapper(wrappedManager)); + String encoding = getEncodingOf(wrappedManager); + return new Java9Compiler(new BaseFileManagerWrapper(wrappedManager, encoding != null ? Charset.forName(encoding) : null)); } } catch (Exception e) {} @@ -150,11 +152,23 @@ final class LombokFileObjects { throw new IllegalArgumentException(sb.toString()); } + private static String getEncodingOf(JavaFileManager manager) { + try { + // FileObject may be instance of org.jetbrains.jps.javac.OutputFileObject + FileObject fo = manager.getFileForOutput(StandardLocation.CLASS_OUTPUT, "", "dummy", null); + Field encodingField = fo.getClass().getDeclaredField("myEncodingName"); + encodingField.setAccessible(true); + return (String)encodingField.get(fo); + } catch (Exception e) { + return null; + } + } + static class BaseFileManagerWrapper extends BaseFileManager { JavaFileManager manager; - public BaseFileManagerWrapper(JavaFileManager manager) { - super(null); // use default encoding + public BaseFileManagerWrapper(JavaFileManager manager, Charset charset) { + super(charset); this.manager = manager; } -- cgit From f7066e43d8434f374d75e87cba4fba9c40ae2215 Mon Sep 17 00:00:00 2001 From: Roel Spilker Date: Wed, 25 Oct 2017 22:26:55 +0200 Subject: Turns out we don't need the encoding after all since all methods are overridden --- src/core/lombok/javac/apt/LombokFileObjects.java | 49 ++++++++---------------- 1 file changed, 17 insertions(+), 32 deletions(-) (limited to 'src/core') diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java index 917bfe9e..71d1a95c 100644 --- a/src/core/lombok/javac/apt/LombokFileObjects.java +++ b/src/core/lombok/javac/apt/LombokFileObjects.java @@ -26,7 +26,6 @@ import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URI; -import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Iterator; @@ -37,7 +36,6 @@ import javax.tools.FileObject; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.JavaFileObject.Kind; -import javax.tools.StandardLocation; import lombok.core.DiagnosticsReceiver; @@ -127,8 +125,7 @@ final class LombokFileObjects { if (superType.isInstance(wrappedManager)) { return new Java9Compiler(wrappedManager); } else { - String encoding = getEncodingOf(wrappedManager); - return new Java9Compiler(new BaseFileManagerWrapper(wrappedManager, encoding != null ? Charset.forName(encoding) : null)); + return new Java9Compiler(new BaseFileManagerWrapper(wrappedManager)); } } catch (Exception e) {} @@ -151,24 +148,12 @@ final class LombokFileObjects { } throw new IllegalArgumentException(sb.toString()); } - - private static String getEncodingOf(JavaFileManager manager) { - try { - // FileObject may be instance of org.jetbrains.jps.javac.OutputFileObject - FileObject fo = manager.getFileForOutput(StandardLocation.CLASS_OUTPUT, "", "dummy", null); - Field encodingField = fo.getClass().getDeclaredField("myEncodingName"); - encodingField.setAccessible(true); - return (String)encodingField.get(fo); - } catch (Exception e) { - return null; - } - } - + static class BaseFileManagerWrapper extends BaseFileManager { JavaFileManager manager; - - public BaseFileManagerWrapper(JavaFileManager manager, Charset charset) { - super(charset); + + public BaseFileManagerWrapper(JavaFileManager manager) { + super(null); this.manager = manager; } @@ -176,62 +161,62 @@ final class LombokFileObjects { public int isSupportedOption(String option) { return manager.isSupportedOption(option); } - + @Override public ClassLoader getClassLoader(Location location) { return manager.getClassLoader(location); } - + @Override public Iterable list(Location location, String packageName, Set kinds, boolean recurse) throws IOException { return manager.list(location, packageName, kinds, recurse); } - + @Override public String inferBinaryName(Location location, JavaFileObject file) { return manager.inferBinaryName(location, file); } - + @Override public boolean isSameFile(FileObject a, FileObject b) { return manager.isSameFile(a, b); } - + @Override public boolean handleOption(String current, Iterator remaining) { return manager.handleOption(current, remaining); } - + @Override public boolean hasLocation(Location location) { return manager.hasLocation(location); } - + @Override public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException { return manager.getJavaFileForInput(location, className, kind); } - + @Override public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException { return manager.getJavaFileForOutput(location, className, kind, sibling); } - + @Override public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException { return manager.getFileForInput(location, packageName, relativeName); } - + @Override public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException { return manager.getFileForOutput(location, packageName, relativeName, sibling); } - + @Override public void flush() throws IOException { manager.flush(); } - + @Override public void close() throws IOException { manager.close(); -- cgit From d301a18870db3e4e1a6ca32fb7ed7e5c61fc3dbf Mon Sep 17 00:00:00 2001 From: Roel Spilker Date: Wed, 25 Oct 2017 23:02:49 +0200 Subject: code cleanup --- src/core/lombok/javac/apt/LombokFileObjects.java | 178 +++++++++++---------- .../com/sun/tools/javac/file/BaseFileManager.java | 2 +- 2 files changed, 92 insertions(+), 88 deletions(-) (limited to 'src/core') diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java index 71d1a95c..d0d67b17 100644 --- a/src/core/lombok/javac/apt/LombokFileObjects.java +++ b/src/core/lombok/javac/apt/LombokFileObjects.java @@ -120,13 +120,8 @@ final class LombokFileObjects { try { Field wrappedField = Class.forName("com.sun.tools.javac.api.ClientCodeWrapper$WrappedJavaFileManager").getDeclaredField("clientJavaFileManager"); wrappedField.setAccessible(true); - JavaFileManager wrappedManager = (JavaFileManager)wrappedField.get(jfm); - Class superType = Class.forName("com.sun.tools.javac.file.BaseFileManager"); - if (superType.isInstance(wrappedManager)) { - return new Java9Compiler(wrappedManager); - } else { - return new Java9Compiler(new BaseFileManagerWrapper(wrappedManager)); - } + JavaFileManager wrappedManager = (JavaFileManager) wrappedField.get(jfm); + return new Java9Compiler(wrappedManager); } catch (Exception e) {} } @@ -149,80 +144,6 @@ final class LombokFileObjects { throw new IllegalArgumentException(sb.toString()); } - static class BaseFileManagerWrapper extends BaseFileManager { - JavaFileManager manager; - - public BaseFileManagerWrapper(JavaFileManager manager) { - super(null); - this.manager = manager; - } - - @Override - public int isSupportedOption(String option) { - return manager.isSupportedOption(option); - } - - @Override - public ClassLoader getClassLoader(Location location) { - return manager.getClassLoader(location); - } - - @Override - public Iterable list(Location location, String packageName, Set kinds, boolean recurse) throws IOException { - return manager.list(location, packageName, kinds, recurse); - } - - @Override - public String inferBinaryName(Location location, JavaFileObject file) { - return manager.inferBinaryName(location, file); - } - - @Override - public boolean isSameFile(FileObject a, FileObject b) { - return manager.isSameFile(a, b); - } - - @Override - public boolean handleOption(String current, Iterator remaining) { - return manager.handleOption(current, remaining); - } - - @Override - public boolean hasLocation(Location location) { - return manager.hasLocation(location); - } - - @Override - public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException { - return manager.getJavaFileForInput(location, className, kind); - } - - @Override - public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException { - return manager.getJavaFileForOutput(location, className, kind, sibling); - } - - @Override - public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException { - return manager.getFileForInput(location, packageName, relativeName); - } - - @Override - public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException { - return manager.getFileForOutput(location, packageName, relativeName, sibling); - } - - @Override - public void flush() throws IOException { - manager.flush(); - } - - @Override - public void close() throws IOException { - manager.close(); - } - } - static JavaFileObject createEmpty(Compiler compiler, String name, Kind kind) { return compiler.wrap(new EmptyLombokFileObject(name, kind)); } @@ -235,25 +156,108 @@ final class LombokFileObjects { private final BaseFileManager fileManager; public Java9Compiler(JavaFileManager jfm) { - fileManager = (BaseFileManager) jfm; + fileManager = asBaseFileManager(jfm); } @Override public JavaFileObject wrap(LombokFileObject fileObject) { + return new Javac9BaseFileObjectWrapper(fileManager, toPath(fileObject), fileObject); + } + + @Override public Method getDecoderMethod() { + return null; + } + + private static Path toPath(LombokFileObject fileObject) { URI uri = fileObject.toUri(); if (uri.getScheme() == null) { uri = URI.create("file:///" + uri); } - Path path; try { - path = Paths.get(uri); + return Paths.get(uri); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("Problems in URI '" + uri + "' (" + fileObject.toUri() + ")", e); } - return new Javac9BaseFileObjectWrapper(fileManager, path, fileObject); } - @Override public Method getDecoderMethod() { - throw new UnsupportedOperationException(); + private static BaseFileManager asBaseFileManager(JavaFileManager jfm) { + if (jfm instanceof BaseFileManager) { + return (BaseFileManager) jfm; + } + return new FileManagerWrapper(jfm); + } + + static class FileManagerWrapper extends BaseFileManager { + JavaFileManager manager; + + public FileManagerWrapper(JavaFileManager manager) { + super(null); + this.manager = manager; + } + + @Override + public int isSupportedOption(String option) { + return manager.isSupportedOption(option); + } + + @Override + public ClassLoader getClassLoader(Location location) { + return manager.getClassLoader(location); + } + + @Override + public Iterable list(Location location, String packageName, Set kinds, boolean recurse) throws IOException { + return manager.list(location, packageName, kinds, recurse); + } + + @Override + public String inferBinaryName(Location location, JavaFileObject file) { + return manager.inferBinaryName(location, file); + } + + @Override + public boolean isSameFile(FileObject a, FileObject b) { + return manager.isSameFile(a, b); + } + + @Override + public boolean handleOption(String current, Iterator remaining) { + return manager.handleOption(current, remaining); + } + + @Override + public boolean hasLocation(Location location) { + return manager.hasLocation(location); + } + + @Override + public JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException { + return manager.getJavaFileForInput(location, className, kind); + } + + @Override + public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException { + return manager.getJavaFileForOutput(location, className, kind, sibling); + } + + @Override + public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException { + return manager.getFileForInput(location, packageName, relativeName); + } + + @Override + public FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException { + return manager.getFileForOutput(location, packageName, relativeName, sibling); + } + + @Override + public void flush() throws IOException { + manager.flush(); + } + + @Override + public void close() throws IOException { + manager.close(); + } } } } diff --git a/src/stubs/com/sun/tools/javac/file/BaseFileManager.java b/src/stubs/com/sun/tools/javac/file/BaseFileManager.java index aae29c45..df24ca3c 100644 --- a/src/stubs/com/sun/tools/javac/file/BaseFileManager.java +++ b/src/stubs/com/sun/tools/javac/file/BaseFileManager.java @@ -7,5 +7,5 @@ import javax.tools.JavaFileManager; import java.nio.charset.Charset; public abstract class BaseFileManager implements JavaFileManager { - protected BaseFileManager(Charset charset) {} + protected BaseFileManager(Charset charset) {} } -- cgit