diff options
author | Roel Spilker <r.spilker@gmail.com> | 2019-01-29 00:45:32 +0100 |
---|---|---|
committer | Roel Spilker <r.spilker@gmail.com> | 2019-01-29 00:46:57 +0100 |
commit | f2392ccd6214b8fd402af0e87d5afd94f4706737 (patch) | |
tree | ed81c1137cfc7eb2a9c02af6f200f031c4b1cf2a /src/core/lombok/javac | |
parent | 54dce4c83b57b78c75f471ec5978b87b2bbd464f (diff) | |
download | lombok-f2392ccd6214b8fd402af0e87d5afd94f4706737.tar.gz lombok-f2392ccd6214b8fd402af0e87d5afd94f4706737.tar.bz2 lombok-f2392ccd6214b8fd402af0e87d5afd94f4706737.zip |
New strategy to force new rounds. Possible fix for #1723, #1858 and #1946
Diffstat (limited to 'src/core/lombok/javac')
-rw-r--r-- | src/core/lombok/javac/apt/EmptyLombokFileObject.java | 123 | ||||
-rw-r--r-- | src/core/lombok/javac/apt/InterceptingJavaFileManager.java | 7 | ||||
-rw-r--r-- | src/core/lombok/javac/apt/LombokFileObjects.java | 10 | ||||
-rw-r--r-- | src/core/lombok/javac/apt/LombokProcessor.java | 20 |
4 files changed, 11 insertions, 149 deletions
diff --git a/src/core/lombok/javac/apt/EmptyLombokFileObject.java b/src/core/lombok/javac/apt/EmptyLombokFileObject.java deleted file mode 100644 index d1d00582..00000000 --- a/src/core/lombok/javac/apt/EmptyLombokFileObject.java +++ /dev/null @@ -1,123 +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.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Reader; -import java.io.StringReader; -import java.io.Writer; -import java.net.URI; -import java.nio.charset.Charset; -import java.nio.charset.CharsetDecoder; -import java.nio.charset.CodingErrorAction; - -import javax.lang.model.element.Modifier; -import javax.lang.model.element.NestingKind; - -// Can't use SimpleJavaFileObject so we copy/paste most of its content here, because javac doesn't follow the interface, -// and casts to its own BaseFileObject type. D'oh! -class EmptyLombokFileObject implements LombokFileObject { - private final String name; - private final Kind kind; - - public EmptyLombokFileObject(String name, Kind kind) { - this.name = name; - this.kind = kind; - } - - @Override public boolean isNameCompatible(String simpleName, Kind kind) { - String baseName = simpleName + kind.extension; - return kind.equals(getKind()) - && (baseName.equals(toUri().getPath()) || toUri().getPath().endsWith("/" + baseName)); - } - - @Override public URI toUri() { - return URI.create("file:///" + (name.startsWith("/") ? name.substring(1) : name)); - } - - @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { - return ""; - } - - @Override public InputStream openInputStream() throws IOException { - return new ByteArrayInputStream(new byte[0]); - } - - @Override public Reader openReader(boolean ignoreEncodingErrors) throws IOException { - return new StringReader(""); - } - - @Override public Writer openWriter() throws IOException { - return new OutputStreamWriter(openOutputStream()); - } - - @Override public OutputStream openOutputStream() throws IOException { - return new ByteArrayOutputStream(); - } - - @Override public long getLastModified() { - return 0L; - } - - @Override public boolean delete() { - return false; - } - - @Override public Kind getKind() { - return kind; - } - - @SuppressWarnings("all") - @Override public String getName() { - return toUri().getPath(); - } - - @Override public NestingKind getNestingKind() { - return null; - } - - @Override public Modifier getAccessLevel() { - return null; - } - - @Override public CharsetDecoder getDecoder(boolean ignoreEncodingErrors) { - CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); - CodingErrorAction action = ignoreEncodingErrors ? CodingErrorAction.REPLACE : CodingErrorAction.REPORT; - return decoder.onMalformedInput(action).onUnmappableCharacter(action); - } - - @Override public boolean equals(Object obj) { - if (!(obj instanceof EmptyLombokFileObject)) return false; - if (obj == this) return true; - EmptyLombokFileObject other = (EmptyLombokFileObject) obj; - return name.equals(other.name) && kind.equals(other.kind); - } - - @Override public int hashCode() { - return name.hashCode() ^ kind.hashCode(); - } -}
\ No newline at end of file diff --git a/src/core/lombok/javac/apt/InterceptingJavaFileManager.java b/src/core/lombok/javac/apt/InterceptingJavaFileManager.java index 9b58d111..3f4c6ef1 100644 --- a/src/core/lombok/javac/apt/InterceptingJavaFileManager.java +++ b/src/core/lombok/javac/apt/InterceptingJavaFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2018 The Project Lombok Authors. + * Copyright (C) 2010-2019 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 @@ -42,11 +42,6 @@ final class InterceptingJavaFileManager extends ForwardingJavaFileManager<JavaFi } @Override public JavaFileObject getJavaFileForOutput(Location location, String className, final Kind kind, FileObject sibling) throws IOException { - if (className.contains("lombok.dummy.ForceNewRound")) { - final String name = className.replace(".", "/") + kind.extension; - return LombokFileObjects.createEmpty(compiler, name, kind); - } - JavaFileObject fileObject = fileManager.getJavaFileForOutput(location, className, kind, sibling); if (kind != Kind.CLASS) return fileObject; diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java index d6c96480..f6643db3 100644 --- a/src/core/lombok/javac/apt/LombokFileObjects.java +++ b/src/core/lombok/javac/apt/LombokFileObjects.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2018 The Project Lombok Authors. + * Copyright (C) 2010-2019 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 @@ -38,11 +38,11 @@ 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; -import com.sun.tools.javac.file.BaseFileManager; - //Can't use SimpleJavaFileObject so we copy/paste most of its content here, because javac doesn't follow the interface, //and casts to its own BaseFileObject type. D'oh! final class LombokFileObjects { @@ -152,10 +152,6 @@ final class LombokFileObjects { throw new IllegalArgumentException(sb.toString()); } - static JavaFileObject createEmpty(Compiler compiler, String name, Kind kind) { - return compiler.wrap(new EmptyLombokFileObject(name, kind)); - } - static JavaFileObject createIntercepting(Compiler compiler, JavaFileObject delegate, String fileName, DiagnosticsReceiver diagnostics) { return compiler.wrap(new InterceptingJavaFileObject(delegate, fileName, diagnostics, compiler.getDecoderMethod())); } diff --git a/src/core/lombok/javac/apt/LombokProcessor.java b/src/core/lombok/javac/apt/LombokProcessor.java index d4f3504a..79db5dec 100644 --- a/src/core/lombok/javac/apt/LombokProcessor.java +++ b/src/core/lombok/javac/apt/LombokProcessor.java @@ -23,7 +23,6 @@ package lombok.javac.apt; import java.io.IOException; import java.io.InputStream; -import java.io.Writer; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; @@ -47,13 +46,6 @@ import javax.lang.model.element.QualifiedNameable; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic.Kind; import javax.tools.JavaFileManager; -import javax.tools.JavaFileObject; - -import lombok.Lombok; -import lombok.core.CleanupRegistry; -import lombok.core.DiagnosticsReceiver; -import lombok.javac.JavacTransformer; -import lombok.permit.Permit; import com.sun.source.util.TreePath; import com.sun.source.util.Trees; @@ -64,6 +56,12 @@ import com.sun.tools.javac.processing.JavacProcessingEnvironment; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.util.Context; +import lombok.Lombok; +import lombok.core.CleanupRegistry; +import lombok.core.DiagnosticsReceiver; +import lombok.javac.JavacTransformer; +import lombok.permit.Permit; + /** * This Annotation Processor is the standard injection mechanism for lombok-enabling the javac compiler. * @@ -362,11 +360,7 @@ public class LombokProcessor extends AbstractProcessor { private void forceNewRound(String randomModuleName, JavacFiler filer) { if (!filer.newFiles()) { try { - String name = "lombok.dummy.ForceNewRound" + (dummyCount++); - if (randomModuleName != null) name = randomModuleName + "/" + name; - JavaFileObject dummy = filer.createSourceFile(name); - Writer w = dummy.openWriter(); - w.close(); + filer.getGeneratedSourceNames().add("lombok.dummy.ForceNewRound" + (dummyCount++)); } catch (Exception e) { e.printStackTrace(); processingEnv.getMessager().printMessage(Kind.WARNING, |