aboutsummaryrefslogtreecommitdiff
path: root/src/delombok/lombok
diff options
context:
space:
mode:
Diffstat (limited to 'src/delombok/lombok')
-rw-r--r--src/delombok/lombok/delombok/Delombok.java112
-rw-r--r--src/delombok/lombok/delombok/DocCommentIntegrator.java4
-rw-r--r--src/delombok/lombok/delombok/LombokOptionsFactory.java13
-rw-r--r--src/delombok/lombok/delombok/PrettyPrinter.java30
4 files changed, 139 insertions, 20 deletions
diff --git a/src/delombok/lombok/delombok/Delombok.java b/src/delombok/lombok/delombok/Delombok.java
index ead4aa60..0d887cb9 100644
--- a/src/delombok/lombok/delombok/Delombok.java
+++ b/src/delombok/lombok/delombok/Delombok.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2015 The Project Lombok Authors.
+ * Copyright (C) 2009-2017 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
@@ -30,12 +30,14 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.Writer;
+import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.IdentityHashMap;
@@ -43,15 +45,23 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
import javax.tools.DiagnosticListener;
+import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import lombok.Lombok;
import lombok.javac.CommentCatcher;
+import lombok.javac.Javac;
import lombok.javac.LombokOptions;
+import lombok.javac.apt.LombokProcessor;
+import com.sun.tools.javac.code.Symtab;
import com.sun.tools.javac.comp.Todo;
+import com.sun.tools.javac.file.BaseFileManager;
+import com.sun.tools.javac.main.Arguments;
import com.sun.tools.javac.main.JavaCompiler;
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
import com.sun.tools.javac.util.Context;
@@ -466,26 +476,83 @@ public class Delombok {
return out;
}
+ private static final Field MODULE_FIELD = getModuleField();
+ private static Field getModuleField() {
+ try {
+ return JCCompilationUnit.class.getField("modle");
+ } catch (NoSuchFieldException e) {
+ return null;
+ } catch (SecurityException e) {
+ return null;
+ }
+ }
+
public boolean delombok() throws IOException {
LombokOptions options = LombokOptionsFactory.getDelombokOptions(context);
options.deleteLombokAnnotations();
options.putJavacOption("ENCODING", charset.name());
- if (classpath != null) options.putJavacOption("CLASSPATH", classpath);
+ if (classpath != null) options.putJavacOption("CLASSPATH", unpackClasspath(classpath));
if (sourcepath != null) options.putJavacOption("SOURCEPATH", sourcepath);
- if (bootclasspath != null) options.putJavacOption("BOOTCLASSPATH", bootclasspath);
+ if (bootclasspath != null) options.putJavacOption("BOOTCLASSPATH", unpackClasspath(bootclasspath));
options.setFormatPreferences(new FormatPreferences(formatPrefs));
options.put("compilePolicy", "check");
+ if (Javac.getJavaCompilerVersion() >= 9) {
+ Arguments args = Arguments.instance(context);
+ List<String> argsList = new ArrayList<String>();
+ if (classpath != null) {
+ argsList.add("--class-path");
+ argsList.add(options.get("--class-path"));
+ }
+ if (sourcepath != null) {
+ argsList.add("--source-path");
+ argsList.add(options.get("--source-path"));
+ }
+ if (bootclasspath != null) {
+ argsList.add("--boot-class-path");
+ argsList.add(options.get("--boot-class-path"));
+ }
+ if (charset != null) {
+ argsList.add("-encoding");
+ argsList.add(charset.name());
+ }
+ String[] argv = argsList.toArray(new String[0]);
+ args.init("javac", argv);
+ }
+
CommentCatcher catcher = CommentCatcher.create(context);
JavaCompiler compiler = catcher.getCompiler();
List<JCCompilationUnit> roots = new ArrayList<JCCompilationUnit>();
Map<JCCompilationUnit, File> baseMap = new IdentityHashMap<JCCompilationUnit, File>();
- compiler.initProcessAnnotations(Collections.singleton(new lombok.javac.apt.LombokProcessor()));
+ Set<LombokProcessor> processors = Collections.singleton(new lombok.javac.apt.LombokProcessor());
+
+ if (Javac.getJavaCompilerVersion() >= 9) {
+ JavaFileManager jfm_ = context.get(JavaFileManager.class);
+ if (jfm_ instanceof BaseFileManager) {
+ Arguments args = Arguments.instance(context);
+ ((BaseFileManager) jfm_).setContext(context); // reinit with options
+ ((BaseFileManager) jfm_).handleOptions(args.getDeferredFileManagerOptions());
+ }
+ }
+
+ if (Javac.getJavaCompilerVersion() < 9) {
+ compiler.initProcessAnnotations(processors);
+ } else {
+ compiler.initProcessAnnotations(processors, Collections.<JavaFileObject>emptySet(), Collections.<String>emptySet());
+ }
+
+ Object unnamedModule = null;
+ if (Javac.getJavaCompilerVersion() >= 9) unnamedModule = Symtab.instance(context).unnamedModule;
for (File fileToParse : filesToParse) {
- @SuppressWarnings("deprecation") JCCompilationUnit unit = compiler.parse(fileToParse.getAbsolutePath());
+ JCCompilationUnit unit = compiler.parse(fileToParse.getAbsolutePath());
+ if (Javac.getJavaCompilerVersion() >= 9) try {
+ MODULE_FIELD.set(unit, unnamedModule);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
baseMap.put(unit, fileToBase.get(fileToParse));
roots.add(unit);
}
@@ -498,9 +565,19 @@ public class Delombok {
catcher.setComments(unit, new DocCommentIntegrator().integrate(catcher.getComments(unit), unit));
}
+ if (Javac.getJavaCompilerVersion() >= 9) {
+ compiler.initModules(com.sun.tools.javac.util.List.from(roots.toArray(new JCCompilationUnit[0])));
+ }
com.sun.tools.javac.util.List<JCCompilationUnit> trees = compiler.enterTrees(toJavacList(roots));
- JavaCompiler delegate = compiler.processAnnotations(trees);
+ JavaCompiler delegate;
+ if (Javac.getJavaCompilerVersion() < 9) {
+ delegate = compiler.processAnnotations(trees, com.sun.tools.javac.util.List.<String>nil());
+ } else {
+ delegate = compiler;
+ Collection<String> c = com.sun.tools.javac.util.List.nil();
+ compiler.processAnnotations(trees, c);
+ }
Object care = callAttributeMethodOnJavaCompiler(delegate, delegate.todo);
@@ -529,6 +606,29 @@ public class Delombok {
return true;
}
+ private String unpackClasspath(String cp) {
+ String[] parts = cp.split(Pattern.quote(File.pathSeparator));
+ StringBuilder out = new StringBuilder();
+ for (String p : parts) {
+ if (!p.endsWith("*")) {
+ if (out.length() > 0) out.append(File.pathSeparator);
+ out.append(p);
+ continue;
+ }
+ File f = new File(p.substring(0, p.length() - 2));
+ File[] files = f.listFiles();
+ if (files == null) continue;
+ for (File file : files) {
+ if (file.isFile()) {
+ if (out.length() > 0) out.append(File.pathSeparator);
+ out.append(p, 0, p.length() - 1);
+ out.append(file.getName());
+ }
+ }
+ }
+ return out.toString();
+ }
+
private static Method attributeMethod;
/** Method is needed because the call signature has changed between javac6 and javac7; no matter what we compile against, using delombok in the other means VerifyErrors. */
private static Object callAttributeMethodOnJavaCompiler(JavaCompiler compiler, Todo arg) {
diff --git a/src/delombok/lombok/delombok/DocCommentIntegrator.java b/src/delombok/lombok/delombok/DocCommentIntegrator.java
index c66ff0ec..c3b07f32 100644
--- a/src/delombok/lombok/delombok/DocCommentIntegrator.java
+++ b/src/delombok/lombok/delombok/DocCommentIntegrator.java
@@ -29,6 +29,7 @@ import java.util.regex.Pattern;
import lombok.javac.CommentInfo;
import lombok.javac.Javac;
+import lombok.javac.PackageName;
import lombok.javac.handlers.JavacHandlerUtil;
import com.sun.tools.javac.parser.Tokens.Comment;
@@ -120,7 +121,8 @@ public class DocCommentIntegrator {
}
private JCTree findJavadocableNodeOnOrAfter(JCCompilationUnit unit, int endPos) {
- if (unit.pid != null && endPos <= unit.pid.pos) return null;
+ JCTree pid = PackageName.getPackageNode(unit);
+ if (pid != null && endPos <= pid.pos) return null;
Iterator<JCTree> it = unit.defs.iterator();
while (it.hasNext()) {
diff --git a/src/delombok/lombok/delombok/LombokOptionsFactory.java b/src/delombok/lombok/delombok/LombokOptionsFactory.java
index 47921931..62dc953a 100644
--- a/src/delombok/lombok/delombok/LombokOptionsFactory.java
+++ b/src/delombok/lombok/delombok/LombokOptionsFactory.java
@@ -24,6 +24,7 @@ package lombok.delombok;
import lombok.javac.Javac;
import lombok.javac.Javac6BasedLombokOptions;
import lombok.javac.Javac8BasedLombokOptions;
+import lombok.javac.Javac9BasedLombokOptions;
import lombok.javac.LombokOptions;
import com.sun.tools.javac.util.Context;
@@ -41,9 +42,15 @@ public class LombokOptionsFactory {
@Override LombokOptions createAndRegisterOptions(Context context) {
return Javac8BasedLombokOptions.replaceWithDelombokOptions(context);
}
+ },
+
+ JDK9 {
+ @Override LombokOptions createAndRegisterOptions(Context context) {
+ return Javac9BasedLombokOptions.replaceWithDelombokOptions(context);
+ }
};
- abstract LombokOptions createAndRegisterOptions(Context context);
+ abstract LombokOptions createAndRegisterOptions(Context context);
}
public static LombokOptions getDelombokOptions(Context context) {
@@ -53,8 +60,10 @@ public class LombokOptionsFactory {
LombokOptions options;
if (Javac.getJavaCompilerVersion() < 8) {
options = LombokOptionCompilerVersion.JDK7_AND_LOWER.createAndRegisterOptions(context);
- } else {
+ } else if (Javac.getJavaCompilerVersion() == 8) {
options = LombokOptionCompilerVersion.JDK8.createAndRegisterOptions(context);
+ } else {
+ options = LombokOptionCompilerVersion.JDK9.createAndRegisterOptions(context);
}
return options;
}
diff --git a/src/delombok/lombok/delombok/PrettyPrinter.java b/src/delombok/lombok/delombok/PrettyPrinter.java
index b5064a33..4261a558 100644
--- a/src/delombok/lombok/delombok/PrettyPrinter.java
+++ b/src/delombok/lombok/delombok/PrettyPrinter.java
@@ -92,6 +92,7 @@ import com.sun.tools.javac.util.Name;
import com.sun.tools.javac.util.Position;
import lombok.javac.CommentInfo;
+import lombok.javac.PackageName;
import lombok.javac.CommentInfo.EndConnection;
import lombok.javac.CommentInfo.StartConnection;
import lombok.javac.JavacTreeMaker.TreeTag;
@@ -457,11 +458,12 @@ public class PrettyPrinter extends JCTree.Visitor {
@Override public void visitTopLevel(JCCompilationUnit tree) {
printDocComment(tree);
- if (tree.pid != null) {
+ JCTree n = PackageName.getPackageNode(tree);
+ if (n != null) {
consumeComments(tree);
aPrint("package ");
- print(tree.pid);
- println(";", tree.pid);
+ print(n);
+ println(";", n);
}
boolean first = true;
@@ -811,6 +813,11 @@ public class PrettyPrinter extends JCTree.Visitor {
print(tree.encl);
print(".");
}
+ boolean moveFirstParameter = tree.args.nonEmpty() && tree.args.head instanceof JCUnary && tree.args.head.toString().startsWith("<*nullchk*>");
+ if (moveFirstParameter) {
+ print(((JCUnary) tree.args.head).arg);
+ print(".");
+ }
print("new ");
if (!tree.typeargs.isEmpty()) {
@@ -820,7 +827,11 @@ public class PrettyPrinter extends JCTree.Visitor {
}
print(tree.clazz);
print("(");
- print(tree.args, ", ");
+ if (moveFirstParameter) {
+ print(tree.args.tail, ", ");
+ } else {
+ print(tree.args, ", ");
+ }
print(")");
if (tree.def != null) {
Name previousTypeName = currentTypeName;
@@ -1431,22 +1442,19 @@ public class PrettyPrinter extends JCTree.Visitor {
if ("JCTypeUnion".equals(simpleName)) {
List<JCExpression> types = readObject(tree, "alternatives", List.<JCExpression>nil());
print(types, " | ");
- return;
} else if ("JCTypeIntersection".equals(simpleName)) {
print(readObject(tree, "bounds", List.<JCExpression>nil()), " & ");
- return;
} else if ("JCMemberReference".equals(simpleName)) {
printMemberReference0(tree);
- return;
} else if ("JCLambda".equals(simpleName)) {
printLambda0(tree);
- return;
} else if ("JCAnnotatedType".equals(simpleName)) {
printAnnotatedType0(tree);
- return;
+ } else if ("JCPackageDecl".equals(simpleName)) {
+ // Starting with JDK9, this is inside the import list, but we've already printed it. Just ignore it.
+ } else {
+ throw new AssertionError("Unhandled tree type: " + tree.getClass() + ": " + tree);
}
-
- throw new AssertionError("Unhandled tree type: " + tree.getClass() + ": " + tree);
}
private void printMemberReference0(JCTree tree) {