aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@tipit.to>2009-11-27 09:49:48 +0100
committerReinier Zwitserloot <reinier@tipit.to>2009-11-27 09:49:48 +0100
commit2b61c2534b22f07a13d8cb4c97c2ad323c6c4597 (patch)
tree1aec17de05371b3a5ca02e25793e43e33c70e9b3
parent9b55af61dbd585a745e24a43ac27574a69ed15f2 (diff)
downloadlombok-2b61c2534b22f07a13d8cb4c97c2ad323c6c4597.tar.gz
lombok-2b61c2534b22f07a13d8cb4c97c2ad323c6c4597.tar.bz2
lombok-2b61c2534b22f07a13d8cb4c97c2ad323c6c4597.zip
Delombok now works from the command line as:
java -jar lombok.jar delombok (args)
-rw-r--r--src/delombok/lombok/delombok/CommentPreservingParser.java9
-rw-r--r--src/delombok/lombok/delombok/Delombok.java132
-rw-r--r--src/installer/lombok/installer/Installer.java7
3 files changed, 136 insertions, 12 deletions
diff --git a/src/delombok/lombok/delombok/CommentPreservingParser.java b/src/delombok/lombok/delombok/CommentPreservingParser.java
index d353a9a6..c776a224 100644
--- a/src/delombok/lombok/delombok/CommentPreservingParser.java
+++ b/src/delombok/lombok/delombok/CommentPreservingParser.java
@@ -82,19 +82,19 @@ public class CommentPreservingParser {
private static final Messager messager = new Messager() {
@Override public void printMessage(Kind kind, CharSequence msg) {
- System.out.printf("M: %s: %s\n", kind, msg);
+ System.out.printf("%s: %s\n", kind, msg);
}
@Override public void printMessage(Kind kind, CharSequence msg, Element e) {
- System.out.printf("E: %s: %s\n", kind, msg);
+ System.out.printf("%s: %s\n", kind, msg);
}
@Override public void printMessage(Kind kind, CharSequence msg, Element e, AnnotationMirror a) {
- System.out.printf("A: %s: %s\n", kind, msg);
+ 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("V: %s: %s\n", kind, msg);
+ System.out.printf("%s: %s\n", kind, msg);
}
};
@@ -122,7 +122,6 @@ public class CommentPreservingParser {
JavaFileObject sourceFile = compilationUnit.getSourceFile();
if (sourceFile != null) {
out.write(sourceFile.getCharContent(true).toString());
- System.out.println(out.toString());
return;
}
}
diff --git a/src/delombok/lombok/delombok/Delombok.java b/src/delombok/lombok/delombok/Delombok.java
index c6f9ecf9..e05f4982 100644
--- a/src/delombok/lombok/delombok/Delombok.java
+++ b/src/delombok/lombok/delombok/Delombok.java
@@ -5,14 +5,26 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.Writer;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
+import java.util.ArrayList;
+import java.util.List;
import lombok.delombok.CommentPreservingParser.ParseResult;
+import com.zwitserloot.cmdreader.CmdReader;
+import com.zwitserloot.cmdreader.Description;
+import com.zwitserloot.cmdreader.Excludes;
+import com.zwitserloot.cmdreader.InvalidCommandLineException;
+import com.zwitserloot.cmdreader.Mandatory;
+import com.zwitserloot.cmdreader.Parameterized;
+import com.zwitserloot.cmdreader.Sequential;
+import com.zwitserloot.cmdreader.Shorthand;
+
public class Delombok {
private Charset charset = Charset.defaultCharset();
private CommentPreservingParser parser = new CommentPreservingParser();
@@ -23,6 +35,107 @@ public class Delombok {
/** If null, output to standard out. */
private File output = null;
+ private static class CmdArgs {
+ @Shorthand("v")
+ @Description("Print the name of each file as it is being delombok-ed.")
+ @Excludes("quiet")
+ private boolean verbose;
+
+ @Shorthand("q")
+ @Description("No warnings or errors will be emitted to standard error")
+ @Excludes("verbose")
+ private boolean quiet;
+
+ @Shorthand("e")
+ @Description("Sets the encoding of your source files. Defaults to the system default charset. Example: \"UTF-8\"")
+ @Parameterized
+ private String encoding;
+
+ @Shorthand("p")
+ @Description("Print delombok-ed code to standard output instead of saving it in target directory")
+ private boolean print;
+
+ @Shorthand("d")
+ @Description("Directory to save delomboked files to")
+ @Mandatory(onlyIfNot="print")
+ @Parameterized
+ private String target;
+
+ @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
+ @Parameterized
+ private List<String> input = new ArrayList<String>();
+
+ private boolean help;
+ }
+
+ public static void main(String[] rawArgs) {
+ CmdReader<CmdArgs> reader = CmdReader.of(CmdArgs.class);
+ CmdArgs args;
+ try {
+ args = reader.make(rawArgs);
+ } catch (InvalidCommandLineException e) {
+ System.err.println("ERROR: " + e.getMessage());
+ System.err.println(reader.generateCommandLineHelp("delombok"));
+ System.exit(1);
+ return;
+ }
+
+ if (args.help || args.input.isEmpty()) {
+ if (args.input.isEmpty()) System.err.println("ERROR: no files or directories to delombok specified.");
+ System.err.println(reader.generateCommandLineHelp("delombok"));
+ System.exit(args.input.isEmpty() ? 1 : 0);
+ return;
+ }
+
+ Delombok delombok = new Delombok();
+
+ if (args.quiet) delombok.setFeedback(new PrintStream(new OutputStream() {
+ @Override public void write(int b) throws IOException {
+ //dummy - do nothing.
+ }
+ }));
+
+ if (args.encoding != null) {
+ try {
+ delombok.setCharset(args.encoding);
+ } catch (UnsupportedCharsetException e) {
+ System.err.println("ERROR: Not a known charset: " + args.encoding);
+ System.exit(1);
+ return;
+ }
+ }
+
+ if (args.verbose) delombok.setVerbose(true);
+ if (args.print) delombok.setOutputToStandardOut();
+ else delombok.setOutput(new File(args.target));
+
+ for (String in : args.input) {
+ try {
+ File f = new File(in);
+ if (f.isFile()) {
+ delombok.delombok(f.getParentFile(), f.getName());
+ } else if (f.isDirectory()) {
+ delombok.delombok(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);
+ }
+ } catch (Exception e) {
+ if (!args.quiet) {
+ String msg = e.getMessage();
+ if (msg != null && msg.startsWith("DELOMBOK: ")) System.err.println(msg.substring("DELOMBOK: ".length()));
+ else {
+ e.printStackTrace();
+ }
+ System.exit(1);
+ return;
+ }
+ }
+ }
+ }
+
public void setCharset(String charsetName) throws UnsupportedCharsetException {
charset = Charset.forName(charsetName);
}
@@ -40,7 +153,7 @@ public class Delombok {
}
public void setOutput(File dir) {
- if (dir.isFile()) throw new IllegalArgumentException(
+ if (dir.isFile() || (!dir.isDirectory() && dir.getName().endsWith(".java"))) throw new IllegalArgumentException(
"DELOMBOK: delombok will only write to a directory. " +
"If you want to delombok a single file, use -p to output to standard output, then redirect this to a file:\n" +
"delombok MyJavaFile.java -p >MyJavaFileDelombok.java");
@@ -57,20 +170,23 @@ public class Delombok {
private void delombok0(File base, String suffix, int loop) throws IOException {
File dir = suffix.isEmpty() ? base : new File(base, suffix);
- String name = suffix + File.separator + dir.getName();
+ String name = suffix;
if (dir.isDirectory()) {
if (loop >= 100) {
feedback.printf("Over 100 subdirectories? I'm guessing there's a loop in your directory structure. Skipping: %s\n", suffix);
} else {
- dir.mkdir();
- delombok0(base, name, loop + 1);
+ for (File f : dir.listFiles()) {
+ delombok0(base, suffix + (suffix.isEmpty() ? "" : File.separator) + f.getName(), loop + 1);
+ }
}
} else if (dir.isFile()) {
String extension = getExtension(dir);
- if (extension.equals(".java")) delombok(base, name);
- else if (extension.equals(".class")) skipClass(name);
+ if (extension.equals("java")) delombok(base, name);
+ else if (extension.equals("class")) skipClass(name);
else copy(base, name);
+ } else if (!dir.exists()) {
+ feedback.printf("Skipping %s because it does not exist.\n", canonical(dir));
} else {
feedback.printf("Skipping %s because it is a special file type.\n", canonical(dir));
}
@@ -87,7 +203,9 @@ public class Delombok {
}
if (verbose) feedback.printf("Copying resource file: %s\n", fileName);
byte[] b = new byte[65536];
- FileInputStream in = new FileInputStream(new File(base, fileName));
+ File outFile = new File(base, fileName);
+ outFile.getParentFile().mkdirs();
+ FileInputStream in = new FileInputStream(outFile);
try {
FileOutputStream out = new FileOutputStream(new File(output, fileName));
try {
diff --git a/src/installer/lombok/installer/Installer.java b/src/installer/lombok/installer/Installer.java
index e1da5d31..a823dd69 100644
--- a/src/installer/lombok/installer/Installer.java
+++ b/src/installer/lombok/installer/Installer.java
@@ -64,6 +64,7 @@ import javax.swing.UIManager;
import javax.swing.filechooser.FileFilter;
import lombok.core.Version;
+import lombok.delombok.Delombok;
import lombok.installer.EclipseFinder.OS;
import lombok.installer.EclipseLocation.InstallException;
import lombok.installer.EclipseLocation.NotAnEclipseException;
@@ -95,6 +96,12 @@ public class Installer {
private JButton installButton;
public static void main(String[] args) {
+ if (args.length > 0 && args[0].equals("delombok")) {
+ String[] newArgs = new String[args.length-1];
+ System.arraycopy(args, 1, newArgs, 0, newArgs.length);
+ Delombok.main(newArgs);
+ return;
+ }
if (args.length > 0 && (args[0].equals("install") || args[0].equals("uninstall"))) {
boolean uninstall = args[0].equals("uninstall");
if (args.length < 3 || !args[1].equals("eclipse")) {