aboutsummaryrefslogtreecommitdiff
path: root/src/delombok
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@zwitserloot.com>2010-11-03 00:42:32 +0100
committerReinier Zwitserloot <reinier@zwitserloot.com>2010-11-03 00:42:32 +0100
commitd9ba2a191ac71e7d8689f1ad0e99160b1c8dae3d (patch)
treef7b11103f82bf496beca40854520c8b47dc4bf93 /src/delombok
parent6e2924bcf2ceb390c0f8c712e8ee9c4428173ded (diff)
downloadlombok-d9ba2a191ac71e7d8689f1ad0e99160b1c8dae3d.tar.gz
lombok-d9ba2a191ac71e7d8689f1ad0e99160b1c8dae3d.tar.bz2
lombok-d9ba2a191ac71e7d8689f1ad0e99160b1c8dae3d.zip
big changes to delombok to prep for resolution, when sourcepath and classpath are relevant, and the flow needs to be parse all, then enter all, then transform all, instead of parse->enter->transform sequentially for each file in isolation.
Diffstat (limited to 'src/delombok')
-rw-r--r--src/delombok/lombok/delombok/CommentCollectingScanner.java2
-rw-r--r--src/delombok/lombok/delombok/CommentPreservingParser.java170
-rw-r--r--src/delombok/lombok/delombok/Delombok.java190
-rw-r--r--src/delombok/lombok/delombok/DelombokResult.java62
-rw-r--r--src/delombok/lombok/delombok/PrettyCommentsPrinter.java16
-rw-r--r--src/delombok/lombok/delombok/ant/DelombokTask.java51
6 files changed, 276 insertions, 215 deletions
diff --git a/src/delombok/lombok/delombok/CommentCollectingScanner.java b/src/delombok/lombok/delombok/CommentCollectingScanner.java
index 2552cbf7..c930bc62 100644
--- a/src/delombok/lombok/delombok/CommentCollectingScanner.java
+++ b/src/delombok/lombok/delombok/CommentCollectingScanner.java
@@ -25,7 +25,7 @@ import java.nio.CharBuffer;
import lombok.delombok.Comment.EndConnection;
import lombok.delombok.Comment.StartConnection;
-import lombok.delombok.CommentPreservingParser.Comments;
+import lombok.delombok.Delombok.Comments;
import com.sun.tools.javac.parser.Scanner;
import com.sun.tools.javac.util.Context;
diff --git a/src/delombok/lombok/delombok/CommentPreservingParser.java b/src/delombok/lombok/delombok/CommentPreservingParser.java
deleted file mode 100644
index 87c02dcd..00000000
--- a/src/delombok/lombok/delombok/CommentPreservingParser.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright © 2009-2010 Reinier Zwitserloot and Roel Spilker.
- *
- * 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.delombok;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collections;
-import java.util.Date;
-
-import javax.annotation.processing.Messager;
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.Element;
-import javax.tools.DiagnosticListener;
-import javax.tools.JavaFileObject;
-import javax.tools.Diagnostic.Kind;
-
-import lombok.javac.DeleteLombokAnnotations;
-import lombok.javac.JavacTransformer;
-
-import com.sun.tools.javac.main.JavaCompiler;
-import com.sun.tools.javac.main.OptionName;
-import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
-import com.sun.tools.javac.util.Context;
-import com.sun.tools.javac.util.List;
-import com.sun.tools.javac.util.Options;
-
-public class CommentPreservingParser {
- private final String encoding;
- private boolean deleteLombokAnnotations = false;
- private DiagnosticListener<JavaFileObject> diagnostics = null;
-
- public CommentPreservingParser() {
- this("utf-8");
- }
-
- public CommentPreservingParser(String encoding) {
- this.encoding = encoding;
- }
-
- public void setDeleteLombokAnnotations(boolean deleteLombokAnnotations) {
- this.deleteLombokAnnotations = deleteLombokAnnotations;
- }
-
- public void setDiagnosticsListener(DiagnosticListener<JavaFileObject> diagnostics) {
- this.diagnostics = diagnostics;
- }
-
- public ParseResult parse(JavaFileObject source, boolean forceProcessing) throws IOException {
- return doParse(source, forceProcessing);
- }
-
- public ParseResult parse(String fileName, boolean forceProcessing) throws IOException {
- return doParse(fileName, forceProcessing);
- }
-
- private ParseResult doParse(Object source, boolean forceProcessing) throws IOException {
- Context context = new Context();
-
- Options.instance(context).put(OptionName.ENCODING, encoding);
-
- if (diagnostics != null) context.put(DiagnosticListener.class, diagnostics);
-
- CommentCollectingScanner.Factory.preRegister(context);
-
- JavaCompiler compiler = new JavaCompiler(context) {
- @Override
- protected boolean keepComments() {
- return true;
- }
- };
-
- compiler.genEndPos = true;
-
- Comments comments = new Comments();
- context.put(Comments.class, comments);
- if (deleteLombokAnnotations) context.put(DeleteLombokAnnotations.class, new DeleteLombokAnnotations(true));
-
- comments.comments = List.nil();
-
- JCCompilationUnit cu;
- if (source instanceof JavaFileObject) {
- cu = compiler.parse((JavaFileObject) source);
- } else {
- @SuppressWarnings("deprecation")
- JCCompilationUnit unit = compiler.parse((String)source);
- cu = unit;
- }
-
- boolean changed = new JavacTransformer(messager).transform(context, Collections.singleton(cu));
- return new ParseResult(comments.comments, cu, forceProcessing || changed);
- }
-
- private static final Messager messager = new Messager() {
- @Override public void printMessage(Kind kind, CharSequence msg) {
- System.out.printf("%s: %s\n", kind, msg);
- }
-
- @Override public void printMessage(Kind kind, CharSequence msg, Element e) {
- System.out.printf("%s: %s\n", kind, msg);
- }
-
- @Override public void printMessage(Kind kind, CharSequence msg, Element e, AnnotationMirror a) {
- System.out.printf("%s: %s\n", kind, msg);
- }
-
- @Override public void printMessage(Kind kind, CharSequence msg, Element e, AnnotationMirror a, AnnotationValue v) {
- System.out.printf("%s: %s\n", kind, msg);
- }
- };
-
- static class Comments {
- List<Comment> comments = List.nil();
-
- void add(Comment comment) {
- comments = comments.append(comment);
- }
- }
-
- public static class ParseResult {
- private final List<Comment> comments;
- private final JCCompilationUnit compilationUnit;
- private final boolean changed;
-
- private ParseResult(List<Comment> comments, JCCompilationUnit compilationUnit, boolean changed) {
- this.comments = comments;
- this.compilationUnit = compilationUnit;
- this.changed = changed;
- }
-
- public void print(Writer out) throws IOException {
- if (!changed) {
- JavaFileObject sourceFile = compilationUnit.getSourceFile();
- if (sourceFile != null) {
- out.write(sourceFile.getCharContent(true).toString());
- return;
- }
- }
-
- out.write("// Generated by delombok at ");
- out.write(String.valueOf(new Date()));
- out.write(System.getProperty("line.separator"));
-
- compilationUnit.accept(new PrettyCommentsPrinter(out, compilationUnit, comments));
- }
-
- public boolean isChanged() {
- return changed;
- }
- }
-}
diff --git a/src/delombok/lombok/delombok/Delombok.java b/src/delombok/lombok/delombok/Delombok.java
index 56994f78..6866d97f 100644
--- a/src/delombok/lombok/delombok/Delombok.java
+++ b/src/delombok/lombok/delombok/Delombok.java
@@ -30,16 +30,33 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.Writer;
+import java.net.URI;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import javax.annotation.processing.Messager;
+import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.AnnotationValue;
+import javax.lang.model.element.Element;
import javax.tools.DiagnosticListener;
import javax.tools.JavaFileObject;
+import javax.tools.Diagnostic.Kind;
-import lombok.delombok.CommentPreservingParser.ParseResult;
+import lombok.javac.DeleteLombokAnnotations;
+import lombok.javac.JavacTransformer;
+import com.sun.tools.javac.main.JavaCompiler;
+import com.sun.tools.javac.main.OptionName;
+import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.Options;
import com.zwitserloot.cmdreader.CmdReader;
import com.zwitserloot.cmdreader.Description;
import com.zwitserloot.cmdreader.Excludes;
@@ -50,16 +67,24 @@ import com.zwitserloot.cmdreader.Shorthand;
public class Delombok {
private Charset charset = Charset.defaultCharset();
- private CommentPreservingParser parser = new CommentPreservingParser();
+ private Context context = new Context();
+ private Writer presetWriter;
- {
- parser.setDeleteLombokAnnotations(true);
+ public void setWriter(Writer writer) {
+ this.presetWriter = writer;
+ }
+
+ public Delombok() {
+ context.put(DeleteLombokAnnotations.class, new DeleteLombokAnnotations(true));
}
private PrintStream feedback = System.err;
private boolean verbose;
private boolean noCopy;
private boolean force = false;
+ private String classpath, sourcepath;
+ private LinkedHashMap<File, File> fileToBase = new LinkedHashMap<File, File>();
+ private List<File> filesToParse = new ArrayList<File>();
/** If null, output to standard out. */
private File output = null;
@@ -88,6 +113,14 @@ public class Delombok {
@Mandatory(onlyIfNot={"print", "help"})
private String target;
+ @Shorthand("c")
+ @Description("Classpath (analogous to javac -cp option)")
+ private String classpath;
+
+ @Shorthand("s")
+ @Description("Sourcepath (analogous to javac -sourcepath option)")
+ private String sourcepath;
+
@Description("Files to delombok. Provide either a file, or a directory. If you use a directory, all files in it (recursive) are delombok-ed")
@Sequential
private List<String> input = new ArrayList<String>();
@@ -138,21 +171,29 @@ public class Delombok {
if (args.verbose) delombok.setVerbose(true);
if (args.nocopy) delombok.setNoCopy(true);
- if (args.print) delombok.setOutputToStandardOut();
- else delombok.setOutput(new File(args.target));
+ if (args.print) {
+ delombok.setOutputToStandardOut();
+ } else {
+ delombok.setOutput(new File(args.target));
+ }
+
+ if (args.classpath != null) delombok.setClasspath(args.classpath);
+ if (args.sourcepath != null) delombok.setSourcepath(args.sourcepath);
for (String in : args.input) {
try {
File f = new File(in);
if (f.isFile()) {
- delombok.delombok(f.getParentFile(), f.getName());
+ delombok.addFile(f.getParentFile(), f.getName());
} else if (f.isDirectory()) {
- delombok.delombok(f);
+ delombok.addDirectory(f);
} else if (!f.exists()) {
if (!args.quiet) System.err.println("WARNING: does not exist - skipping: " + f);
} else {
if (!args.quiet) System.err.println("WARNING: not a standard file or directory - skipping: " + f);
}
+
+ delombok.delombok();
} catch (Exception e) {
if (!args.quiet) {
String msg = e.getMessage();
@@ -168,12 +209,12 @@ public class Delombok {
}
public void setCharset(String charsetName) throws UnsupportedCharsetException {
+
charset = Charset.forName(charsetName);
}
-
public void setDiagnosticsListener(DiagnosticListener<JavaFileObject> diagnostics) {
- parser.setDiagnosticsListener(diagnostics);
+ if (diagnostics != null) context.put(DiagnosticListener.class, diagnostics);
}
public void setForceProcess(boolean force) {
@@ -184,6 +225,14 @@ public class Delombok {
this.feedback = feedback;
}
+ public void setClasspath(String classpath) {
+ this.classpath = classpath;
+ }
+
+ public void setSourcepath(String sourcepath) {
+ this.sourcepath = sourcepath;
+ }
+
public void setVerbose(boolean verbose) {
this.verbose = verbose;
}
@@ -204,15 +253,15 @@ public class Delombok {
this.output = null;
}
- public void delombok(File base) throws IOException {
- delombok0(false, base, "", 0);
+ public void addDirectory(File base) throws IOException {
+ addDirectory0(false, base, "", 0);
}
- public void process(boolean copy, File base, String name) throws IOException {
+ public void addDirectory1(boolean copy, File base, String name) throws IOException {
File f = new File(base, name);
if (f.isFile()) {
String extension = getExtension(f);
- if (extension.equals("java")) delombok(base, name);
+ if (extension.equals("java")) addFile(base, name);
else if (extension.equals("class")) skipClass(name);
else copy(copy, base, name);
} else if (!f.exists()) {
@@ -222,7 +271,7 @@ public class Delombok {
}
}
- private void delombok0(boolean inHiddenDir, File base, String suffix, int loop) throws IOException {
+ private void addDirectory0(boolean inHiddenDir, File base, String suffix, int loop) throws IOException {
File dir = suffix.isEmpty() ? base : new File(base, suffix);
if (dir.isDirectory()) {
@@ -236,7 +285,7 @@ public class Delombok {
feedback.printf("Only processing java files (not copying non-java files) in %s because it's a hidden directory.\n", canonical(dir));
}
for (File f : list) {
- delombok0(inHiddenDir || thisDirIsHidden, base, suffix + (suffix.isEmpty() ? "" : File.separator) + f.getName(), loop + 1);
+ addDirectory0(inHiddenDir || thisDirIsHidden, base, suffix + (suffix.isEmpty() ? "" : File.separator) + f.getName(), loop + 1);
}
} else {
if (!thisDirIsHidden && !noCopy && !inHiddenDir && output != null && !suffix.isEmpty()) {
@@ -247,7 +296,7 @@ public class Delombok {
}
}
} else {
- process(!inHiddenDir && !noCopy, base, suffix);
+ addDirectory1(!inHiddenDir && !noCopy, base, suffix);
}
}
@@ -288,34 +337,96 @@ public class Delombok {
}
}
- public void delombok(JavaFileObject file, Writer writer) throws IOException {
- ParseResult result = parser.parse(file, force);
- result.print(writer);
+ public void addFile(File base, String fileName) throws IOException {
+ if (output != null && canonical(base).equals(canonical(output))) throw new IOException(
+ "DELOMBOK: Output file and input file refer to the same filesystem location. Specify a separate path for output.");
+
+ File f = new File(base, fileName);
+ filesToParse.add(f);
+ fileToBase.put(f, base);
}
- public void delombok(String file, Writer writer) throws IOException {
- ParseResult result = parser.parse(file, force);
- result.print(writer);
+ private static <T> com.sun.tools.javac.util.List<T> toJavacList(List<T> list) {
+ com.sun.tools.javac.util.List<T> out = com.sun.tools.javac.util.List.nil();
+ ListIterator<T> li = list.listIterator(list.size());
+ while (li.hasPrevious()) out = out.prepend(li.previous());
+ return out;
}
- public void delombok(File base, String fileName) throws IOException {
- if (output != null && canonical(base).equals(canonical(output))) throw new IOException(
- "DELOMBOK: Output file and input file refer to the same filesystem location. Specify a separate path for output.");
+ public boolean delombok() throws IOException {
+ Options options = Options.instance(context);
+ options.put(OptionName.ENCODING, charset.name());
+ if (classpath != null) options.put(OptionName.CLASSPATH, classpath);
+ if (sourcepath != null) options.put(OptionName.SOURCEPATH, sourcepath);
+ CommentCollectingScanner.Factory.preRegister(context);
- ParseResult result = parser.parse(new File(base, fileName).getAbsolutePath(), force);
+ JavaCompiler compiler = new JavaCompiler(context);
+ compiler.keepComments = true;
+ compiler.genEndPos = true;
- if (verbose) feedback.printf("File: %s [%s]\n", fileName, result.isChanged() ? "delombok-ed" : "unchanged");
+ List<JCCompilationUnit> roots = new ArrayList<JCCompilationUnit>();
+ Map<JCCompilationUnit, Comments> commentsMap = new IdentityHashMap<JCCompilationUnit, Comments>();
+ Map<JCCompilationUnit, File> baseMap = new IdentityHashMap<JCCompilationUnit, File>();
+ for (File fileToParse : filesToParse) {
+ Comments comments = new Comments();
+ context.put(Comments.class, comments);
+
+ @SuppressWarnings("deprecation")
+ JCCompilationUnit unit = compiler.parse(fileToParse.getAbsolutePath());
+
+ commentsMap.put(unit, comments);
+ baseMap.put(unit, fileToBase.get(fileToParse));
+ roots.add(unit);
+ }
- Writer rawWriter = output == null ? createStandardOutWriter() : createFileWriter(output, fileName);
- BufferedWriter writer = new BufferedWriter(rawWriter);
+ if (compiler.errorCount() > 0) return false;
+ compiler.enterTrees(toJavacList(roots));
- try {
- result.print(writer);
- } finally {
- writer.close();
+ for (JCCompilationUnit unit : roots) {
+ boolean changed = new JavacTransformer(messager).transform(context, Collections.singleton(unit));
+ DelombokResult result = new DelombokResult(commentsMap.get(unit).comments, unit, force || changed);
+ if (verbose) feedback.printf("File: %s [%s]\n", unit.sourcefile.getName(), result.isChanged() ? "delomboked" : "unchanged");
+ Writer rawWriter;
+ if (presetWriter != null) rawWriter = presetWriter;
+ else if (output == null) rawWriter = createStandardOutWriter();
+ else rawWriter = createFileWriter(output, baseMap.get(unit), unit.sourcefile.toUri());
+ BufferedWriter writer = new BufferedWriter(rawWriter);
+ try {
+ result.print(writer);
+ } finally {
+ writer.close();
+ }
+ }
+
+ return true;
+ }
+
+ public static class Comments {
+ public com.sun.tools.javac.util.List<Comment> comments = com.sun.tools.javac.util.List.nil();
+
+ void add(Comment comment) {
+ comments = comments.append(comment);
}
}
+ private static final Messager messager = new Messager() {
+ @Override public void printMessage(Kind kind, CharSequence msg) {
+ System.out.printf("%s: %s\n", kind, msg);
+ }
+
+ @Override public void printMessage(Kind kind, CharSequence msg, Element e) {
+ System.out.printf("%s: %s\n", kind, msg);
+ }
+
+ @Override public void printMessage(Kind kind, CharSequence msg, Element e, AnnotationMirror a) {
+ System.out.printf("%s: %s\n", kind, msg);
+ }
+
+ @Override public void printMessage(Kind kind, CharSequence msg, Element e, AnnotationMirror a, AnnotationValue v) {
+ System.out.printf("%s: %s\n", kind, msg);
+ }
+ };
+
private static String canonical(File dir) {
try {
return dir.getCanonicalPath();
@@ -330,8 +441,15 @@ public class Delombok {
return idx == -1 ? "" : name.substring(idx+1);
}
- private Writer createFileWriter(File base, String fileName) throws IOException {
- File outFile = new File(base, fileName);
+ private Writer createFileWriter(File outBase, File inBase, URI file) throws IOException {
+ URI relative = inBase.toURI().relativize(file);
+ File outFile;
+ if (relative.isAbsolute()) {
+ outFile = new File(outBase, new File(relative).getName());
+ } else {
+ outFile = new File(outBase, relative.getPath());
+ }
+
outFile.getParentFile().mkdirs();
FileOutputStream out = new FileOutputStream(outFile);
return createUnicodeEscapeWriter(out);
diff --git a/src/delombok/lombok/delombok/DelombokResult.java b/src/delombok/lombok/delombok/DelombokResult.java
new file mode 100644
index 00000000..717a3bf1
--- /dev/null
+++ b/src/delombok/lombok/delombok/DelombokResult.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright © 2009-2010 Reinier Zwitserloot and Roel Spilker.
+ *
+ * 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.delombok;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Date;
+
+import javax.tools.JavaFileObject;
+
+import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
+import com.sun.tools.javac.util.List;
+
+public class DelombokResult {
+ private final List<Comment> comments;
+ private final JCCompilationUnit compilationUnit;
+ private final boolean changed;
+
+ public DelombokResult(List<Comment> comments, JCCompilationUnit compilationUnit, boolean changed) {
+ this.comments = comments;
+ this.compilationUnit = compilationUnit;
+ this.changed = changed;
+ }
+
+ public void print(Writer out) throws IOException {
+ if (!changed) {
+ JavaFileObject sourceFile = compilationUnit.getSourceFile();
+ if (sourceFile != null) {
+ out.write(sourceFile.getCharContent(true).toString());
+ return;
+ }
+ }
+
+ out.write("// Generated by delombok at ");
+ out.write(String.valueOf(new Date()));
+ out.write(System.getProperty("line.separator"));
+
+ compilationUnit.accept(new PrettyCommentsPrinter(out, compilationUnit, comments));
+ }
+
+ public boolean isChanged() {
+ return changed;
+ }
+} \ No newline at end of file
diff --git a/src/delombok/lombok/delombok/PrettyCommentsPrinter.java b/src/delombok/lombok/delombok/PrettyCommentsPrinter.java
index 55c0e1bc..16c06f50 100644
--- a/src/delombok/lombok/delombok/PrettyCommentsPrinter.java
+++ b/src/delombok/lombok/delombok/PrettyCommentsPrinter.java
@@ -670,9 +670,11 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
public void visitMethodDef(JCMethodDecl tree) {
try {
+ boolean isConstructor = tree.name == tree.name.table.fromChars("<init>".toCharArray(), 0, 6);
// when producing source output, omit anonymous constructors
- if (tree.name == tree.name.table.fromChars("<init>".toCharArray(), 0, 6) &&
- enclClassName == null) return;
+ if (isConstructor && enclClassName == null) return;
+ boolean isGeneratedConstructor = isConstructor && ((tree.mods.flags & Flags.GENERATEDCONSTR) != 0);
+ if (isGeneratedConstructor) return;
println(); align();
printDocComment(tree);
printExpr(tree.mods);
@@ -1442,9 +1444,13 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
print("@");
printExpr(tree.annotationType);
if (tree.args.nonEmpty()) {
- print("(");
- printExprs(tree.args);
- print(")");
+ print("(");
+ if (tree.args.length() == 1 && tree.args.get(0) instanceof JCAssign) {
+ JCExpression lhs = ((JCAssign)tree.args.get(0)).lhs;
+ if (lhs instanceof JCIdent && ((JCIdent)lhs).name.toString().equals("value")) tree.args = List.of(((JCAssign)tree.args.get(0)).rhs);
+ }
+ printExprs(tree.args);
+ print(")");
}
} catch (IOException e) {
throw new UncheckedIOException(e);
diff --git a/src/delombok/lombok/delombok/ant/DelombokTask.java b/src/delombok/lombok/delombok/ant/DelombokTask.java
index 4a40b874..40c3c63e 100644
--- a/src/delombok/lombok/delombok/ant/DelombokTask.java
+++ b/src/delombok/lombok/delombok/ant/DelombokTask.java
@@ -32,14 +32,55 @@ import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.types.resources.FileResource;
public class DelombokTask extends Task {
private File fromDir, toDir;
+ private Path classpath;
+ private Path sourcepath;
private boolean verbose;
private String encoding;
private Path path;
+ public void setClasspath(Path classpath) {
+ if (this.classpath == null) {
+ this.classpath = classpath;
+ } else {
+ this.classpath.append(classpath);
+ }
+ }
+
+ public Path createClasspath() {
+ if (classpath == null) {
+ classpath = new Path(getProject());
+ }
+ return classpath.createPath();
+ }
+
+ public void setClasspathRef(Reference r) {
+ createClasspath().setRefid(r);
+ }
+
+ public void setSourcepath(Path sourcepath) {
+ if (this.sourcepath == null) {
+ this.sourcepath = sourcepath;
+ } else {
+ this.sourcepath.append(sourcepath);
+ }
+ }
+
+ public Path createSourcepath() {
+ if (sourcepath == null) {
+ sourcepath = new Path(getProject());
+ }
+ return sourcepath.createPath();
+ }
+
+ public void setSourcepathRef(Reference r) {
+ createSourcepath().setRefid(r);
+ }
+
public void setFrom(File dir) {
this.fromDir = dir;
}
@@ -75,9 +116,12 @@ public class DelombokTask extends Task {
throw new BuildException("Unknown charset: " + encoding, getLocation());
}
+ if (classpath != null) delombok.setClasspath(classpath.toString());
+ if (sourcepath != null) delombok.setSourcepath(sourcepath.toString());
+
delombok.setOutput(toDir);
try {
- if (fromDir != null) delombok.delombok(fromDir);
+ if (fromDir != null) delombok.addDirectory(fromDir);
else {
Iterator<?> it = path.iterator();
while (it.hasNext()) {
@@ -85,12 +129,13 @@ public class DelombokTask extends Task {
File baseDir = fileResource.getBaseDir();
if (baseDir == null) {
File file = fileResource.getFile();
- delombok.process(false, file.getParentFile(), file.getName());
+ delombok.addFile(file.getParentFile(), file.getName());
} else {
- delombok.process(false, baseDir, fileResource.getName());
+ delombok.addFile(baseDir, fileResource.getName());
}
}
}
+ delombok.delombok();
} catch (IOException e) {
throw new BuildException("I/O problem during delombok", e, getLocation());
}