diff --git a/AUTHORS b/AUTHORS index 38ceadebec..27b3fcf525 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 cb2036e99a..917bfe9ede 100644 --- a/src/core/lombok/javac/apt/LombokFileObjects.java +++ b/src/core/lombok/javac/apt/LombokFileObjects.java @@ -22,16 +22,22 @@ 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.Charset; 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; +import javax.tools.StandardLocation; import lombok.core.DiagnosticsReceiver; @@ -120,6 +126,9 @@ static Compiler getCompiler(JavaFileManager jfm) { Class superType = Class.forName("com.sun.tools.javac.file.BaseFileManager"); 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)); } } catch (Exception e) {} @@ -142,6 +151,92 @@ static Compiler getCompiler(JavaFileManager jfm) { } 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); + 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)); diff --git a/src/stubs/com/sun/tools/javac/file/BaseFileManager.java b/src/stubs/com/sun/tools/javac/file/BaseFileManager.java index 7a2293d534..aae29c451f 100644 --- a/src/stubs/com/sun/tools/javac/file/BaseFileManager.java +++ b/src/stubs/com/sun/tools/javac/file/BaseFileManager.java @@ -4,5 +4,8 @@ package com.sun.tools.javac.file; import javax.tools.JavaFileManager; +import java.nio.charset.Charset; -public abstract class BaseFileManager implements JavaFileManager{} +public abstract class BaseFileManager implements JavaFileManager { + protected BaseFileManager(Charset charset) {} +}