aboutsummaryrefslogtreecommitdiff
path: root/src/core/lombok/javac/apt
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
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')
-rw-r--r--src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java111
-rw-r--r--src/core/lombok/javac/apt/LombokFileObjects.java154
-rw-r--r--src/core/lombok/javac/apt/LombokProcessor.java26
3 files changed, 42 insertions, 249 deletions
diff --git a/src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java b/src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java
deleted file mode 100644
index f71be366..00000000
--- a/src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2010-2018 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
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package lombok.javac.apt;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.URI;
-import java.nio.file.Path;
-
-import javax.lang.model.element.Modifier;
-import javax.lang.model.element.NestingKind;
-
-import com.sun.tools.javac.file.BaseFileManager;
-
-class Javac9BaseFileObjectWrapper extends com.sun.tools.javac.file.PathFileObject {
- private final LombokFileObject delegate;
-
- public Javac9BaseFileObjectWrapper(BaseFileManager fileManager, Path path, LombokFileObject delegate) {
- super(fileManager, path);
- this.delegate = delegate;
- }
-
- @Override public boolean isNameCompatible(String simpleName, Kind kind) {
- return delegate.isNameCompatible(simpleName, kind);
- }
-
- @Override public URI toUri() {
- return delegate.toUri();
- }
-
- @SuppressWarnings("all")
- @Override public String getName() {
- return delegate.getName();
- }
-
- @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
- return delegate.getCharContent(ignoreEncodingErrors);
- }
-
- @Override public InputStream openInputStream() throws IOException {
- return delegate.openInputStream();
- }
-
- @Override public Reader openReader(boolean ignoreEncodingErrors) throws IOException {
- return delegate.openReader(ignoreEncodingErrors);
- }
-
- @Override public Writer openWriter() throws IOException {
- return delegate.openWriter();
- }
-
- @Override public OutputStream openOutputStream() throws IOException {
- return delegate.openOutputStream();
- }
-
- @Override public long getLastModified() {
- return delegate.getLastModified();
- }
-
- @Override public boolean delete() {
- return delegate.delete();
- }
-
- @Override public Kind getKind() {
- return delegate.getKind();
- }
-
- @Override public NestingKind getNestingKind() {
- return delegate.getNestingKind();
- }
-
- @Override public Modifier getAccessLevel() {
- return delegate.getAccessLevel();
- }
-
- @Override public boolean equals(Object obj) {
- if (!(obj instanceof Javac9BaseFileObjectWrapper)) return false;
- return delegate.equals(((Javac9BaseFileObjectWrapper)obj).delegate);
- }
-
- @Override public int hashCode() {
- return delegate.hashCode();
- }
-
- @Override public String toString() {
- return delegate.toString();
- }
-} \ No newline at end of file
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);
}
}
}
diff --git a/src/core/lombok/javac/apt/LombokProcessor.java b/src/core/lombok/javac/apt/LombokProcessor.java
index c32e09d5..852e5de6 100644
--- a/src/core/lombok/javac/apt/LombokProcessor.java
+++ b/src/core/lombok/javac/apt/LombokProcessor.java
@@ -24,6 +24,7 @@ package lombok.javac.apt;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
@@ -42,7 +43,6 @@ import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
-import javax.lang.model.element.QualifiedNameable;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
import javax.tools.JavaFileManager;
@@ -371,7 +371,7 @@ public class LombokProcessor extends AbstractProcessor {
private String getModuleNameFor(Element element) {
while (element != null) {
- if (element.getKind().name().equals("MODULE")) return ModuleNameOracle.getModuleName(element);
+ if (element.getKind().name().equals("MODULE")) return getModuleName(element);
Element n = element.getEnclosingElement();
if (n == element) return null;
element = n;
@@ -379,12 +379,24 @@ public class LombokProcessor extends AbstractProcessor {
return null;
}
- // QualifiedNameable is a java7 thing, so to remain compatible with java6, shove this into an inner class to avoid the ClassNotFoundError.
- private static class ModuleNameOracle {
- static String getModuleName(Element element) {
- if (!(element instanceof QualifiedNameable)) return null;
- String name = ((QualifiedNameable) element).getQualifiedName().toString().trim();
+ private static Class<?> qualifiedNamableClass = null;
+ private static Method qualifiedNamableQualifiedNameMethod = null;
+ // QualifiedNameable isn't in java 6, so to remain compatible with java6, use reflection.
+ private static String getModuleName(Element element) {
+ try {
+ if (qualifiedNamableClass == null) qualifiedNamableClass = Class.forName("javax.lang.model.element.QualifiedNamable");
+ if (!qualifiedNamableClass.isInstance(element)) return null;
+ if (qualifiedNamableQualifiedNameMethod == null) qualifiedNamableQualifiedNameMethod = qualifiedNamableClass.getMethod("getQualifiedName");
+ String name = qualifiedNamableQualifiedNameMethod.invoke(element).toString().trim();
return name.isEmpty() ? null : name;
+ } catch (ClassNotFoundException e) {
+ return null;
+ } catch (NoSuchMethodException e) {
+ return null;
+ } catch (InvocationTargetException e) {
+ return null;
+ } catch (IllegalAccessException e) {
+ return null;
}
}