aboutsummaryrefslogtreecommitdiff
path: root/src/delombok
diff options
context:
space:
mode:
Diffstat (limited to 'src/delombok')
-rw-r--r--src/delombok/lombok/delombok/Delombok.java11
-rw-r--r--src/delombok/lombok/delombok/LombokOptionsFactory.java57
-rw-r--r--src/delombok/lombok/delombok/PrettyCommentsPrinter.java252
3 files changed, 197 insertions, 123 deletions
diff --git a/src/delombok/lombok/delombok/Delombok.java b/src/delombok/lombok/delombok/Delombok.java
index f4e02786..7291ac29 100644
--- a/src/delombok/lombok/delombok/Delombok.java
+++ b/src/delombok/lombok/delombok/Delombok.java
@@ -52,7 +52,6 @@ import lombok.javac.LombokOptions;
import com.sun.tools.javac.comp.Todo;
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.zwitserloot.cmdreader.CmdReader;
@@ -359,11 +358,11 @@ public class Delombok {
}
public boolean delombok() throws IOException {
- LombokOptions options = LombokOptions.replaceWithDelombokOptions(context);
- options.put(OptionName.ENCODING, charset.name());
- if (classpath != null) options.put(OptionName.CLASSPATH, classpath);
- if (sourcepath != null) options.put(OptionName.SOURCEPATH, sourcepath);
- if (bootclasspath != null) options.put(OptionName.BOOTCLASSPATH, bootclasspath);
+ LombokOptions options = LombokOptionsFactory.getDelombokOptions(context);
+ options.putJavacOption("ENCODING", charset.name());
+ if (classpath != null) options.putJavacOption("CLASSPATH", classpath);
+ if (sourcepath != null) options.putJavacOption("SOURCEPATH", sourcepath);
+ if (bootclasspath != null) options.putJavacOption("BOOTCLASSPATH", bootclasspath);
options.put("compilePolicy", "attr");
CommentCatcher catcher = CommentCatcher.create(context);
diff --git a/src/delombok/lombok/delombok/LombokOptionsFactory.java b/src/delombok/lombok/delombok/LombokOptionsFactory.java
new file mode 100644
index 00000000..e581593f
--- /dev/null
+++ b/src/delombok/lombok/delombok/LombokOptionsFactory.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2013 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.delombok;
+
+import lombok.javac.Javac;
+import lombok.javac.Javac6BasedLombokOptions;
+import lombok.javac.Javac8BasedLombokOptions;
+import lombok.javac.LombokOptions;
+
+import com.sun.tools.javac.util.Context;
+
+public class LombokOptionsFactory {
+ enum LombokOptionCompilerVersion {
+ JDK7_AND_LOWER {
+ @Override LombokOptions createAndRegisterOptions(Context context) {
+ return Javac6BasedLombokOptions.replaceWithDelombokOptions(context);
+ }
+ },
+
+ JDK8 {
+ @Override LombokOptions createAndRegisterOptions(Context context) {
+ return Javac8BasedLombokOptions.replaceWithDelombokOptions(context);
+ }
+ };
+
+ abstract LombokOptions createAndRegisterOptions(Context context);
+ }
+
+ public static LombokOptions getDelombokOptions(Context context) {
+ LombokOptions options;
+ if (Javac.getJavaCompilerVersion() < 8) {
+ options = LombokOptionCompilerVersion.JDK7_AND_LOWER.createAndRegisterOptions(context);
+ } else {
+ options = LombokOptionCompilerVersion.JDK8.createAndRegisterOptions(context);
+ }
+ return options;
+ }
+}
diff --git a/src/delombok/lombok/delombok/PrettyCommentsPrinter.java b/src/delombok/lombok/delombok/PrettyCommentsPrinter.java
index 1bb2ce23..075cc64f 100644
--- a/src/delombok/lombok/delombok/PrettyCommentsPrinter.java
+++ b/src/delombok/lombok/delombok/PrettyCommentsPrinter.java
@@ -53,7 +53,8 @@ import com.sun.source.tree.Tree;
import com.sun.tools.javac.code.BoundKind;
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Symbol;
-import com.sun.tools.javac.code.TypeTags;
+//import com.sun.tools.javac.code.TypeTags;
+import com.sun.tools.javac.main.JavaCompiler;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.TreeInfo;
import com.sun.tools.javac.tree.TreeScanner;
@@ -126,12 +127,12 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
private static final Method GET_TAG_METHOD;
private static final Field TAG_FIELD;
- private static final int PARENS = Javac.getCtcInt(JCTree.class, "PARENS");
- private static final int IMPORT = Javac.getCtcInt(JCTree.class, "IMPORT");
- private static final int VARDEF = Javac.getCtcInt(JCTree.class, "VARDEF");
- private static final int SELECT = Javac.getCtcInt(JCTree.class, "SELECT");
+ private static final Object PARENS = Javac.getTreeTag("PARENS");
+ private static final Object IMPORT = Javac.getTreeTag("IMPORT");
+ private static final Object VARDEF = Javac.getTreeTag("VARDEF");
+ private static final Object SELECT = Javac.getTreeTag("SELECT");
- private static final Map<Integer, String> OPERATORS;
+ private static final Map<Object, String> OPERATORS;
static {
Method m = null;
@@ -150,44 +151,44 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
GET_TAG_METHOD = m;
TAG_FIELD = f;
- Map<Integer, String> map = new HashMap<Integer, String>();
+ Map<Object, String> map = new HashMap<Object, String>();
- map.put(Javac.getCtcInt(JCTree.class, "POS"), "+");
- map.put(Javac.getCtcInt(JCTree.class, "NEG"), "-");
- map.put(Javac.getCtcInt(JCTree.class, "NOT"), "!");
- map.put(Javac.getCtcInt(JCTree.class, "COMPL"), "~");
- map.put(Javac.getCtcInt(JCTree.class, "PREINC"), "++");
- map.put(Javac.getCtcInt(JCTree.class, "PREDEC"), "--");
- map.put(Javac.getCtcInt(JCTree.class, "POSTINC"), "++");
- map.put(Javac.getCtcInt(JCTree.class, "POSTDEC"), "--");
- map.put(Javac.getCtcInt(JCTree.class, "NULLCHK"), "<*nullchk*>");
- map.put(Javac.getCtcInt(JCTree.class, "OR"), "||");
- map.put(Javac.getCtcInt(JCTree.class, "AND"), "&&");
- map.put(Javac.getCtcInt(JCTree.class, "EQ"), "==");
- map.put(Javac.getCtcInt(JCTree.class, "NE"), "!=");
- map.put(Javac.getCtcInt(JCTree.class, "LT"), "<");
- map.put(Javac.getCtcInt(JCTree.class, "GT"), ">");
- map.put(Javac.getCtcInt(JCTree.class, "LE"), "<=");
- map.put(Javac.getCtcInt(JCTree.class, "GE"), ">=");
- map.put(Javac.getCtcInt(JCTree.class, "BITOR"), "|");
- map.put(Javac.getCtcInt(JCTree.class, "BITXOR"), "^");
- map.put(Javac.getCtcInt(JCTree.class, "BITAND"), "&");
- map.put(Javac.getCtcInt(JCTree.class, "SL"), "<<");
- map.put(Javac.getCtcInt(JCTree.class, "SR"), ">>");
- map.put(Javac.getCtcInt(JCTree.class, "USR"), ">>>");
- map.put(Javac.getCtcInt(JCTree.class, "PLUS"), "+");
- map.put(Javac.getCtcInt(JCTree.class, "MINUS"), "-");
- map.put(Javac.getCtcInt(JCTree.class, "MUL"), "*");
- map.put(Javac.getCtcInt(JCTree.class, "DIV"), "/");
- map.put(Javac.getCtcInt(JCTree.class, "MOD"), "%");
+ map.put(Javac.getTreeTag("POS"), "+");
+ map.put(Javac.getTreeTag("NEG"), "-");
+ map.put(Javac.getTreeTag("NOT"), "!");
+ map.put(Javac.getTreeTag("COMPL"), "~");
+ map.put(Javac.getTreeTag("PREINC"), "++");
+ map.put(Javac.getTreeTag("PREDEC"), "--");
+ map.put(Javac.getTreeTag("POSTINC"), "++");
+ map.put(Javac.getTreeTag("POSTDEC"), "--");
+ map.put(Javac.getTreeTag("NULLCHK"), "<*nullchk*>");
+ map.put(Javac.getTreeTag("OR"), "||");
+ map.put(Javac.getTreeTag("AND"), "&&");
+ map.put(Javac.getTreeTag("EQ"), "==");
+ map.put(Javac.getTreeTag("NE"), "!=");
+ map.put(Javac.getTreeTag("LT"), "<");
+ map.put(Javac.getTreeTag("GT"), ">");
+ map.put(Javac.getTreeTag("LE"), "<=");
+ map.put(Javac.getTreeTag("GE"), ">=");
+ map.put(Javac.getTreeTag("BITOR"), "|");
+ map.put(Javac.getTreeTag("BITXOR"), "^");
+ map.put(Javac.getTreeTag("BITAND"), "&");
+ map.put(Javac.getTreeTag("SL"), "<<");
+ map.put(Javac.getTreeTag("SR"), ">>");
+ map.put(Javac.getTreeTag("USR"), ">>>");
+ map.put(Javac.getTreeTag("PLUS"), "+");
+ map.put(Javac.getTreeTag("MINUS"), "-");
+ map.put(Javac.getTreeTag("MUL"), "*");
+ map.put(Javac.getTreeTag("DIV"), "/");
+ map.put(Javac.getTreeTag("MOD"), "%");
OPERATORS = map;
}
- static int getTag(JCTree tree) {
+ static Object getTag(JCTree tree) {
if (GET_TAG_METHOD != null) {
try {
- return (Integer)GET_TAG_METHOD.invoke(tree);
+ return GET_TAG_METHOD.invoke(tree);
}
catch (IllegalAccessException e) {
throw new RuntimeException(e);
@@ -197,7 +198,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
}
}
try {
- return TAG_FIELD.getInt(tree);
+ return TAG_FIELD.get(tree);
}
catch (IllegalAccessException e) {
throw new RuntimeException(e);
@@ -633,7 +634,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
/** Is the given tree an enumerator definition? */
boolean isEnumerator(JCTree t) {
- return getTag(t) == VARDEF && (((JCVariableDecl) t).mods.flags & ENUM) != 0;
+ return Javac.compareCTC(getTag(t), VARDEF) && (((JCVariableDecl) t).mods.flags & ENUM) != 0;
}
/** Print unit consisting of package clause and import statements in toplevel,
@@ -657,7 +658,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
for (List<JCTree> l = tree.defs;
l.nonEmpty() && (cdef == null || getTag(l.head) == IMPORT);
l = l.tail) {
- if (getTag(l.head) == IMPORT) {
+ if (Javac.compareCTC(getTag(l.head), IMPORT)) {
JCImport imp = (JCImport)l.head;
Name name = TreeInfo.name(imp.qualid);
if (name == name.table.fromChars(new char[] {'*'}, 0, 1) ||
@@ -876,7 +877,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
printStat(tree.body);
align();
print(" while ");
- if (getTag(tree.cond) == PARENS) {
+ if (Javac.compareCTC(getTag(tree.cond), PARENS)) {
printExpr(tree.cond);
} else {
print("(");
@@ -892,7 +893,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
public void visitWhileLoop(JCWhileLoop tree) {
try {
print("while ");
- if (getTag(tree.cond) == PARENS) {
+ if (Javac.compareCTC(getTag(tree.cond), PARENS)) {
printExpr(tree.cond);
} else {
print("(");
@@ -910,7 +911,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
try {
print("for (");
if (tree.init.nonEmpty()) {
- if (getTag(tree.init.head) == VARDEF) {
+ if (Javac.compareCTC(getTag(tree.init.head), VARDEF)) {
printExpr(tree.init.head);
for (List<JCStatement> l = tree.init.tail; l.nonEmpty(); l = l.tail) {
JCVariableDecl vdef = (JCVariableDecl)l.head;
@@ -957,7 +958,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
public void visitSwitch(JCSwitch tree) {
try {
print("switch ");
- if (getTag(tree.selector) == PARENS) {
+ if (Javac.compareCTC(getTag(tree.selector), PARENS)) {
printExpr(tree.selector);
} else {
print("(");
@@ -996,7 +997,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
public void visitSynchronized(JCSynchronized tree) {
try {
print("synchronized ");
- if (getTag(tree.lock) == PARENS) {
+ if (Javac.compareCTC(getTag(tree.lock), PARENS)) {
printExpr(tree.lock);
} else {
print("(");
@@ -1077,7 +1078,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
public void visitIf(JCIf tree) {
try {
print("if ");
- if (getTag(tree.cond) == PARENS) {
+ if (Javac.compareCTC(getTag(tree.cond), PARENS)) {
printExpr(tree.cond);
} else {
print("(");
@@ -1173,7 +1174,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
public void visitApply(JCMethodInvocation tree) {
try {
if (!tree.typeargs.isEmpty()) {
- if (getTag(tree.meth) == SELECT) {
+ if (Javac.compareCTC(getTag(tree.meth), SELECT)) {
JCFieldAccess left = (JCFieldAccess)tree.meth;
printExpr(left.selected);
print(".<");
@@ -1277,7 +1278,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
}
}
- public String operatorName(int tag) {
+ public String operatorName(Object tag) {
String result = OPERATORS.get(tag);
if (result == null) throw new Error();
return result;
@@ -1287,7 +1288,8 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
try {
open(prec, TreeInfo.assignopPrec);
printExpr(tree.lhs, TreeInfo.assignopPrec + 1);
- print(" " + operatorName(getTag(tree) - JCTree.ASGOffset) + "= ");
+// print(" " + operatorName(getTag(tree) - JCTree.ASGOffset) + "= ");
+ print(" = ");
printExpr(tree.rhs, TreeInfo.assignopPrec);
close(prec, TreeInfo.assignopPrec);
} catch (IOException e) {
@@ -1297,10 +1299,10 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
public void visitUnary(JCUnary tree) {
try {
- int ownprec = TreeInfo.opPrec(getTag(tree));
+ int ownprec = isOwnPrec(tree);
String opname = operatorName(getTag(tree));
open(prec, ownprec);
- if (getTag(tree) <= Javac.getCtcInt(JCTree.class, "PREDEC")) {
+ if (isPostUnary(tree)) {
print(opname);
printExpr(tree.arg, ownprec);
} else {
@@ -1312,10 +1314,63 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
throw new UncheckedIOException(e);
}
}
+
+ private String assignOpName(JCExpression tree) {
+ try {
+ Object tag = getTag(tree);
+ if (JavaCompiler.version().startsWith("1.8")) {
+ return operatorName(tag.getClass().getMethod("noAssignOp").invoke(tree));
+ } else {
+ return operatorName((Integer)((Integer)tag - (Integer)JCTree.class.getField("ASGOffset").get(null)));
+ }
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ } catch (Exception e) {
+ if (e instanceof RuntimeException) throw (RuntimeException) e;
+ throw new RuntimeException(e);
+ }
+ }
+
+ private int isOwnPrec(JCExpression tree) {
+ try {
+ if (JavaCompiler.version().startsWith("1.8")) {
+ return (Integer)TreeInfo.class.getMethod("opPrec", Class.forName("com.sun.tools.javac.code.TypeTag")).invoke(null, getTag(tree));
+ } else {
+ return (Integer)TreeInfo.class.getMethod("opPrec", Integer.TYPE).invoke(null, getTag(tree));
+ }
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ } catch (Exception e) {
+ if (e instanceof RuntimeException) throw (RuntimeException) e;
+ throw new RuntimeException(e);
+ }
+ }
+
+ private boolean isPostUnary(JCUnary tree) {
+ try {
+ Object tag = getTag(tree);
+ if (JavaCompiler.version().startsWith("1.8")) {
+ return (Boolean) tag.getClass().getMethod("isPostUnaryOp").invoke(tree);
+ } else {
+ return ((Integer) tag) <= ((Integer) Javac.getTreeTag("PREDEC"));
+ }
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ } catch (Exception e) {
+ if (e instanceof RuntimeException) throw (RuntimeException) e;
+ throw new RuntimeException(e);
+ }
+ }
public void visitBinary(JCBinary tree) {
try {
- int ownprec = TreeInfo.opPrec(getTag(tree));
+ int ownprec = isOwnPrec(tree);
String opname = operatorName(getTag(tree));
open(prec, ownprec);
printExpr(tree.lhs, ownprec);
@@ -1382,77 +1437,40 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
public void visitLiteral(JCLiteral tree) {
try {
- switch (tree.typetag) {
- case TypeTags.INT:
- print(tree.value.toString());
- break;
- case TypeTags.LONG:
- print(tree.value + "L");
- break;
- case TypeTags.FLOAT:
- print(tree.value + "F");
- break;
- case TypeTags.DOUBLE:
- print(tree.value.toString());
- break;
- case TypeTags.CHAR:
- print("\'" +
- Convert.quote(
- String.valueOf((char)((Number)tree.value).intValue())) +
- "\'");
- break;
- case TypeTags.BOOLEAN:
- print(((Number)tree.value).intValue() == 1 ? "true" : "false");
- break;
- case TypeTags.BOT:
- print("null");
- break;
- default:
- print("\"" + Convert.quote(tree.value.toString()) + "\"");
- break;
+ if (Javac.compareCTC(Javac.getTreeTypeTag(tree), Javac.CTC_INT)) print(tree.value.toString());
+ else if (Javac.compareCTC(Javac.getTreeTypeTag(tree), Javac.CTC_LONG)) print(tree.value + "L");
+ else if (Javac.compareCTC(Javac.getTreeTypeTag(tree), Javac.CTC_FLOAT)) print(tree.value + "F");
+ else if (Javac.compareCTC(Javac.getTreeTypeTag(tree), Javac.CTC_DOUBLE)) print(tree.value.toString());
+ else if (Javac.compareCTC(Javac.getTreeTypeTag(tree), Javac.CTC_CHAR)) {
+ print("\'" +
+ Convert.quote(
+ String.valueOf((char)((Number)tree.value).intValue()))+
+ "\'");
}
+ else if (Javac.compareCTC(Javac.getTreeTypeTag(tree), Javac.CTC_BOOLEAN)) print(((Number)tree.value).intValue() == 1 ? "true" : "false");
+ else if (Javac.compareCTC(Javac.getTreeTypeTag(tree), Javac.CTC_BOT)) print("null");
+ else print("\"" + Convert.quote(tree.value.toString()) + "\"");
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
- public void visitTypeIdent(JCPrimitiveTypeTree tree) {
- try {
- switch(tree.typetag) {
- case TypeTags.BYTE:
- print("byte");
- break;
- case TypeTags.CHAR:
- print("char");
- break;
- case TypeTags.SHORT:
- print("short");
- break;
- case TypeTags.INT:
- print("int");
- break;
- case TypeTags.LONG:
- print("long");
- break;
- case TypeTags.FLOAT:
- print("float");
- break;
- case TypeTags.DOUBLE:
- print("double");
- break;
- case TypeTags.BOOLEAN:
- print("boolean");
- break;
- case TypeTags.VOID:
- print("void");
- break;
- default:
- print("error");
- break;
- }
- } catch (IOException e) {
- throw new UncheckedIOException(e);
- }
+ public void visitTypeIdent(JCPrimitiveTypeTree tree) {
+ Object typetag = Javac.getTreeTypeTag(tree);
+ try {
+ if (Javac.compareCTC(typetag, Javac.CTC_BYTE)) print("byte");
+ else if (Javac.compareCTC(typetag, Javac.CTC_CHAR)) print("char");
+ else if (Javac.compareCTC(typetag, Javac.CTC_SHORT)) print("short");
+ else if (Javac.compareCTC(typetag, Javac.CTC_INT)) print("int");
+ else if (Javac.compareCTC(typetag, Javac.CTC_LONG)) print("long");
+ else if (Javac.compareCTC(typetag, Javac.CTC_FLOAT)) print("float");
+ else if (Javac.compareCTC(typetag, Javac.CTC_DOUBLE)) print("double");
+ else if (Javac.compareCTC(typetag, Javac.CTC_BOOLEAN)) print("boolean");
+ else if (Javac.compareCTC(typetag, Javac.CTC_VOID)) print("void");
+ else print("error");
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
}
public void visitTypeArray(JCArrayTypeTree tree) {