aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/delombok/lombok/delombok/Delombok.java8
-rw-r--r--src/delombok/lombok/delombok/DelombokApp.java167
2 files changed, 95 insertions, 80 deletions
diff --git a/src/delombok/lombok/delombok/Delombok.java b/src/delombok/lombok/delombok/Delombok.java
index f6a62bef..d9d21d95 100644
--- a/src/delombok/lombok/delombok/Delombok.java
+++ b/src/delombok/lombok/delombok/Delombok.java
@@ -35,6 +35,8 @@ import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
import java.util.List;
+import javax.tools.JavaFileObject;
+
import lombok.delombok.CommentPreservingParser.ParseResult;
import com.zwitserloot.cmdreader.CmdReader;
@@ -248,10 +250,14 @@ public class Delombok {
in.close();
}
}
+
+ public void delombok(JavaFileObject file, Writer writer) throws IOException {
+ ParseResult result = parser.parse(file, force);
+ result.print(writer);
+ }
public void delombok(String file, Writer writer) throws IOException {
ParseResult result = parser.parse(file, force);
-
result.print(writer);
}
diff --git a/src/delombok/lombok/delombok/DelombokApp.java b/src/delombok/lombok/delombok/DelombokApp.java
index 76d5aed3..b48337c8 100644
--- a/src/delombok/lombok/delombok/DelombokApp.java
+++ b/src/delombok/lombok/delombok/DelombokApp.java
@@ -25,98 +25,107 @@ public class DelombokApp implements LombokApp {
runDirectly(args);
return 0;
} catch (ClassNotFoundException e) {
- //tools.jar is probably not on the classpath. We're going to try and find it, and then load the rest via a ClassLoader that includes tools.jar.
- final File toolsJar = findToolsJar();
- if (toolsJar == null) {
+ Class<?> delombokClass = loadDelombok();
+ if (delombokClass == null) {
System.err.println("Can't find tools.jar. Rerun delombok with tools.jar on the classpath.");
return 1;
}
-
- final JarFile toolsJarFile = new JarFile(toolsJar);
-
- ClassLoader loader = new ClassLoader() {
- private Class<?>loadStreamAsClass(String name, boolean resolve, InputStream in) throws ClassNotFoundException {
+ try {
+ loadDelombok().getMethod("main", String[].class).invoke(null, new Object[] {args.toArray(new String[0])});
+ } catch (InvocationTargetException e1) {
+ Throwable t = e1.getCause();
+ if (t instanceof Error) throw (Error)t;
+ if (t instanceof Exception) throw (Exception)t;
+ throw e1;
+ }
+ return 0;
+ }
+ }
+
+ public static Class<?> loadDelombok() throws Exception {
+ //tools.jar is probably not on the classpath. We're going to try and find it, and then load the rest via a ClassLoader that includes tools.jar.
+ final File toolsJar = findToolsJar();
+ if (toolsJar == null) {
+ System.err.println("Can't find tools.jar. Rerun delombok with tools.jar on the classpath.");
+ return null;
+ }
+
+ final JarFile toolsJarFile = new JarFile(toolsJar);
+
+ ClassLoader loader = new ClassLoader() {
+ private Class<?>loadStreamAsClass(String name, boolean resolve, InputStream in) throws ClassNotFoundException {
+ try {
try {
- try {
- byte[] b = new byte[65536];
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- while (true) {
- int r = in.read(b);
- if (r == -1) break;
- out.write(b, 0, r);
- }
- in.close();
- byte[] data = out.toByteArray();
- Class<?> c = defineClass(name, data, 0, data.length);
- if (resolve) resolveClass(c);
- return c;
- } finally {
- in.close();
+ byte[] b = new byte[65536];
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ while (true) {
+ int r = in.read(b);
+ if (r == -1) break;
+ out.write(b, 0, r);
}
- } catch (IOException e2) {
- throw new ClassNotFoundException(name, e2);
+ in.close();
+ byte[] data = out.toByteArray();
+ Class<?> c = defineClass(name, data, 0, data.length);
+ if (resolve) resolveClass(c);
+ return c;
+ } finally {
+ in.close();
}
+ } catch (IOException e2) {
+ throw new ClassNotFoundException(name, e2);
}
-
- @Override protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
- String rawName = name.replace(".", "/") + ".class";
- JarEntry entry = toolsJarFile.getJarEntry(rawName);
- if (entry == null) {
- if (name.startsWith("lombok.")) return loadStreamAsClass(name, resolve, super.getResourceAsStream(rawName));
- return super.loadClass(name, resolve);
- }
-
- try {
- return loadStreamAsClass(name, resolve, toolsJarFile.getInputStream(entry));
- } catch (IOException e2) {
- throw new ClassNotFoundException(name, e2);
- }
+ }
+
+ @Override protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+ String rawName = name.replace(".", "/") + ".class";
+ JarEntry entry = toolsJarFile.getJarEntry(rawName);
+ if (entry == null) {
+ if (name.startsWith("lombok.")) return loadStreamAsClass(name, resolve, super.getResourceAsStream(rawName));
+ return super.loadClass(name, resolve);
}
- @Override public URL getResource(String name) {
- JarEntry entry = toolsJarFile.getJarEntry(name);
- if (entry == null) return super.getResource(name);
- try {
- return new URL("jar:file:" + toolsJar.getAbsolutePath() + "!" + name);
- } catch (MalformedURLException ignore) {
- return null;
- }
+ try {
+ return loadStreamAsClass(name, resolve, toolsJarFile.getInputStream(entry));
+ } catch (IOException e2) {
+ throw new ClassNotFoundException(name, e2);
}
-
- @Override public Enumeration<URL> getResources(final String name) throws IOException {
- JarEntry entry = toolsJarFile.getJarEntry(name);
- final Enumeration<URL> parent = super.getResources(name);
- if (entry == null) return super.getResources(name);
- return new Enumeration<URL>() {
- private boolean first = false;
- @Override public boolean hasMoreElements() {
- return !first || parent.hasMoreElements();
- }
-
- @Override public URL nextElement() {
- if (!first) {
- first = true;
- try {
- return new URL("jar:file:" + toolsJar.getAbsolutePath() + "!" + name);
- } catch (MalformedURLException ignore) {
- return parent.nextElement();
- }
+ }
+
+ @Override public URL getResource(String name) {
+ JarEntry entry = toolsJarFile.getJarEntry(name);
+ if (entry == null) return super.getResource(name);
+ try {
+ return new URL("jar:file:" + toolsJar.getAbsolutePath() + "!" + name);
+ } catch (MalformedURLException ignore) {
+ return null;
+ }
+ }
+
+ @Override public Enumeration<URL> getResources(final String name) throws IOException {
+ JarEntry entry = toolsJarFile.getJarEntry(name);
+ final Enumeration<URL> parent = super.getResources(name);
+ if (entry == null) return super.getResources(name);
+ return new Enumeration<URL>() {
+ private boolean first = false;
+ @Override public boolean hasMoreElements() {
+ return !first || parent.hasMoreElements();
+ }
+
+ @Override public URL nextElement() {
+ if (!first) {
+ first = true;
+ try {
+ return new URL("jar:file:" + toolsJar.getAbsolutePath() + "!" + name);
+ } catch (MalformedURLException ignore) {
+ return parent.nextElement();
}
- return parent.nextElement();
}
- };
- }
- };
- try {
- loader.loadClass("lombok.delombok.Delombok").getMethod("main", String[].class).invoke(null, new Object[] {args.toArray(new String[0])});
- } catch (InvocationTargetException e1) {
- Throwable t = e1.getCause();
- if (t instanceof Error) throw (Error)t;
- if (t instanceof Exception) throw (Exception)t;
- throw e1;
+ return parent.nextElement();
+ }
+ };
}
- return 0;
- }
+ };
+ return loader.loadClass("lombok.delombok.Delombok");
}
private void runDirectly(List<String> args) {