aboutsummaryrefslogtreecommitdiff
path: root/src/core/lombok/javac/apt/LombokFileObjects.java
diff options
context:
space:
mode:
authorReinier Zwitserloot <r.zwitserloot@projectlombok.org>2020-05-29 00:17:20 +0200
committerReinier Zwitserloot <r.zwitserloot@projectlombok.org>2020-06-23 15:55:18 +0200
commit0bbedd092a1f0f506d106943b4b400c7986c5f36 (patch)
treef07bdd4d4c2d69bd7e204d8e15e99209106aee3b /src/core/lombok/javac/apt/LombokFileObjects.java
parent22ac024abb3680b298bef78052f5a13239513b29 (diff)
downloadlombok-0bbedd092a1f0f506d106943b4b400c7986c5f36.tar.gz
lombok-0bbedd092a1f0f506d106943b4b400c7986c5f36.tar.bz2
lombok-0bbedd092a1f0f506d106943b4b400c7986c5f36.zip
[build] rewriting the build system
Diffstat (limited to 'src/core/lombok/javac/apt/LombokFileObjects.java')
-rw-r--r--src/core/lombok/javac/apt/LombokFileObjects.java154
1 files changed, 23 insertions, 131 deletions
diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java
index f6643db3..880ef1fd 100644
--- a/src/core/lombok/javac/apt/LombokFileObjects.java
+++ b/src/core/lombok/javac/apt/LombokFileObjects.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010-2019 The Project Lombok Authors.
+ * Copyright (C) 2010-2020 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -22,23 +22,15 @@
package lombok.javac.apt;
-import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.net.URI;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.Arrays;
-import java.util.Iterator;
import java.util.List;
-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 com.sun.tools.javac.file.BaseFileManager;
import lombok.core.DiagnosticsReceiver;
import lombok.permit.Permit;
@@ -116,22 +108,20 @@ final class LombokFileObjects {
if (jfmClassName.equals("com.sun.tools.javac.file.JavacFileManager")) {
try {
Class<?> superType = Class.forName("com.sun.tools.javac.file.BaseFileManager");
- if (superType.isInstance(jfm)) {
- return new Java9Compiler(jfm);
- }
+ if (superType.isInstance(jfm)) return java9Compiler(jfm);
}
catch (Throwable e) {}
return Compiler.JAVAC7;
}
if (KNOWN_JAVA9_FILE_MANAGERS.contains(jfmClassName)) {
try {
- return new Java9Compiler(jfm);
+ return java9Compiler(jfm);
}
catch (Throwable e) {}
}
try {
if (Class.forName("com.sun.tools.javac.file.PathFileObject") == null) throw new NullPointerException();
- return new Java9Compiler(jfm);
+ return java9Compiler(jfm);
} catch (Throwable e) {}
try {
if (Class.forName("com.sun.tools.javac.file.BaseFileObject") == null) throw new NullPointerException();
@@ -156,122 +146,24 @@ final class LombokFileObjects {
return compiler.wrap(new InterceptingJavaFileObject(delegate, fileName, diagnostics, compiler.getDecoderMethod()));
}
- static class Java9Compiler implements Compiler {
- private final BaseFileManager fileManager;
-
- public Java9Compiler(JavaFileManager jfm) {
- fileManager = asBaseFileManager(jfm);
- }
-
- @Override public JavaFileObject wrap(LombokFileObject fileObject) {
- Path p; try {
- p = toPath(fileObject);
- } catch (Exception e) {
- p = null;
- }
-
- // J9BFOW extends javac's internal file base impl of javax.tools.JavaFileObject.
- // J9JFOW just straight implements it. Probably J9JFOW is fine, but we decided to extend java's internal impl possibly for a reason.
- // Some exotic build environments don't _have_ file objects and crash with FileNotFoundEx, so if that happens, let's try the alternative.
- if (p != null) return new Javac9BaseFileObjectWrapper(fileManager, p, fileObject);
- return new Javac9JavaFileObjectWrapper(fileObject);
- }
-
- @Override public Method getDecoderMethod() {
+ private static Constructor<?> j9CompilerConstructor = null;
+ private static Compiler java9Compiler(JavaFileManager jfm) {
+ try {
+ if (j9CompilerConstructor == null) j9CompilerConstructor = Class.forName("lombok.javac.apt.Java9Compiler").getConstructor(JavaFileManager.class);
+ return (Compiler) j9CompilerConstructor.newInstance(jfm);
+ } catch (ClassNotFoundException e) {
return null;
- }
-
- private static Path toPath(LombokFileObject fileObject) {
- URI uri = fileObject.toUri();
- if (uri.getScheme() == null) {
- uri = URI.create("file:///" + uri);
- }
- try {
- return Paths.get(uri);
- } catch (IllegalArgumentException e) {
- throw new IllegalArgumentException("Problems in URI '" + uri + "' (" + fileObject.toUri() + ")", e);
- }
- }
-
- 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<JavaFileObject> list(Location location, String packageName, Set<Kind> 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<String> 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();
- }
+ } catch (NoSuchMethodException e) {
+ return null;
+ } catch (InvocationTargetException e) {
+ Throwable t = e.getCause();
+ if (t instanceof RuntimeException) throw (RuntimeException) t;
+ if (t instanceof Error) throw (Error) t;
+ throw new RuntimeException(t);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ } catch (InstantiationException e) {
+ throw new RuntimeException(e);
}
}
}