From 79c3d383fd7d46ec1c6c5cf83d8b05f2238529a2 Mon Sep 17 00:00:00 2001
From: Rostislav Krasny <45571812+rosti-il@users.noreply.github.com>
Date: Tue, 18 Aug 2020 04:03:23 +0300
Subject: [PATCH 01/18] Fix tests under Windows, fix test.javac11 and
test.javac14, fix issue #1745
The change of the TestConfiguration.java is based on the fact that
Git for Windows is configured with 'core.autocrlf=true' by default.
---
AUTHORS | 1 +
buildScripts/tests.ant.xml | 1 +
.../javac/handlers/JavacHandlerUtil.java | 19 ++++++++------
.../lombok/delombok/PrettyPrinter.java | 26 ++++++++-----------
.../core/configuration/TestConfiguration.java | 4 +--
5 files changed, 26 insertions(+), 25 deletions(-)
diff --git a/AUTHORS b/AUTHORS
index 8a2902ad..9adf2005 100755
--- a/AUTHORS
+++ b/AUTHORS
@@ -35,6 +35,7 @@ Robbert Jan Grootjans
Robert Wertman
Roel Spilker
Roland Praml
+Rostislav Krasny <45571812+rosti-il@users.noreply.github.com>
Samuel Pereira
Sander Koning
Szymon Pacanowski
diff --git a/buildScripts/tests.ant.xml b/buildScripts/tests.ant.xml
index f78bfae9..cb840048 100644
--- a/buildScripts/tests.ant.xml
+++ b/buildScripts/tests.ant.xml
@@ -119,6 +119,7 @@ This buildfile is part of projectlombok.org. It takes care of compiling and runn
+
diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
index e0af0e52..2523103f 100644
--- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java
+++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
@@ -1964,6 +1964,7 @@ public class JavacHandlerUtil {
}
private static final Pattern SECTION_FINDER = Pattern.compile("^\\s*\\**\\s*[-*][-*]+\\s*([GS]ETTER|WITH(?:ER)?)\\s*[-*][-*]+\\s*\\**\\s*$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
+ private static final Pattern LINE_BREAK_FINDER = Pattern.compile("(\\r?\\n)?");
public static String stripLinesWithTagFromJavadoc(String javadoc, String regexpFragment) {
Pattern p = Pattern.compile("^\\s*\\**\\s*" + regexpFragment + "\\s*\\**\\s*$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
@@ -1972,27 +1973,29 @@ public class JavacHandlerUtil {
}
public static String stripSectionsFromJavadoc(String javadoc) {
- Matcher m = SECTION_FINDER.matcher(javadoc);
- if (!m.find()) return javadoc;
+ Matcher sectionMatcher = SECTION_FINDER.matcher(javadoc);
+ if (!sectionMatcher.find()) return javadoc;
- return javadoc.substring(0, m.start());
+ return javadoc.substring(0, sectionMatcher.start());
}
public static String getJavadocSection(String javadoc, String sectionNameSpec) {
String[] sectionNames = sectionNameSpec.split("\\|");
- Matcher m = SECTION_FINDER.matcher(javadoc);
+ Matcher sectionMatcher = SECTION_FINDER.matcher(javadoc);
+ Matcher lineBreakMatcher = LINE_BREAK_FINDER.matcher(javadoc);
int sectionStart = -1;
int sectionEnd = -1;
- while (m.find()) {
+ while (sectionMatcher.find()) {
boolean found = false;
- for (String sectionName : sectionNames) if (m.group(1).equalsIgnoreCase(sectionName)) {
+ for (String sectionName : sectionNames) if (sectionMatcher.group(1).equalsIgnoreCase(sectionName)) {
found = true;
break;
}
if (found) {
- sectionStart = m.end() + 1;
+ lineBreakMatcher.find(sectionMatcher.end());
+ sectionStart = lineBreakMatcher.end();
} else if (sectionStart != -1) {
- sectionEnd = m.start();
+ sectionEnd = sectionMatcher.start();
}
}
diff --git a/src/delombok/lombok/delombok/PrettyPrinter.java b/src/delombok/lombok/delombok/PrettyPrinter.java
index 208b215f..54fa4ebf 100644
--- a/src/delombok/lombok/delombok/PrettyPrinter.java
+++ b/src/delombok/lombok/delombok/PrettyPrinter.java
@@ -188,12 +188,6 @@ public class PrettyPrinter extends JCTree.Visitor {
return getEndPosition(tree, compilationUnit);
}
- private static int lineEndPos(String s, int start) {
- int pos = s.indexOf('\n', start);
- if (pos < 0) pos = s.length();
- return pos;
- }
-
private boolean needsAlign, needsNewLine, onNewLine = true, needsSpace, aligned;
public static final class UncheckedIOException extends RuntimeException {
@@ -434,23 +428,25 @@ public class PrettyPrinter extends JCTree.Visitor {
private void printDocComment(JCTree tree) {
String dc = getJavadocFor(tree);
if (dc == null) return;
+
aPrintln("/**");
- int pos = 0;
- int endpos = lineEndPos(dc, pos);
boolean atStart = true;
- while (pos < dc.length()) {
- String line = dc.substring(pos, endpos);
- if (line.trim().isEmpty() && atStart) {
+
+ for (String line : dc.split("\\r?\\n")) {
+ if (atStart && line.trim().isEmpty()) {
atStart = false;
continue;
}
+
atStart = false;
aPrint(" *");
- if (pos < dc.length() && dc.charAt(pos) > ' ') print(" ");
- println(dc.substring(pos, endpos));
- pos = endpos + 1;
- endpos = lineEndPos(dc, pos);
+ if (!line.isEmpty() && !Character.isWhitespace(line.charAt(0))) {
+ print(" ");
+ }
+
+ println(line);
}
+
aPrintln(" */");
}
diff --git a/test/configuration/src/lombok/core/configuration/TestConfiguration.java b/test/configuration/src/lombok/core/configuration/TestConfiguration.java
index 3032daf3..504c36b2 100644
--- a/test/configuration/src/lombok/core/configuration/TestConfiguration.java
+++ b/test/configuration/src/lombok/core/configuration/TestConfiguration.java
@@ -65,8 +65,8 @@ public class TestConfiguration {
outStream.flush();
errStream.flush();
- String out = new String(rawOut.toByteArray()).replace("\r\n", "\n").replace('\\', '/').replaceAll(Pattern.quote(normalizedName) + "|" + Pattern.quote(baseName), "BASE/").trim();
- String err = new String(rawErr.toByteArray()).replace("\r\n", "\n").replace('\\', '/').replaceAll(Pattern.quote(normalizedName) + "|" + Pattern.quote(baseName), "BASE/").trim();
+ String out = new String(rawOut.toByteArray()).replace('\\', '/').replaceAll(Pattern.quote(normalizedName) + "|" + Pattern.quote(baseName), "BASE/").trim();
+ String err = new String(rawErr.toByteArray()).replace('\\', '/').replaceAll(Pattern.quote(normalizedName) + "|" + Pattern.quote(baseName), "BASE/").trim();
checkContent(directory, out, "out");
checkContent(directory, err, "err");
From 613ecb091054fe0a2aad304226717be20ec2cf83 Mon Sep 17 00:00:00 2001
From: Reinier Zwitserloot
Date: Thu, 20 Aug 2020 23:56:36 +0200
Subject: [PATCH 02/18] [docs] typo-fixes
---
website/templates/features/Builder.html | 2 +-
website/templates/setup/kobalt.html | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/website/templates/features/Builder.html b/website/templates/features/Builder.html
index f9897d03..1b6c6e62 100644
--- a/website/templates/features/Builder.html
+++ b/website/templates/features/Builder.html
@@ -132,7 +132,7 @@
- If your identifiers are written in common english, lombok assumes that the name of any collection with @Singular on it is an english plural and will attempt to automatically singularize that name. If this is possible, the add-one method will use this name. For example, if your collection is called statuses, then the add-one method will automatically be called status. You can also specify the singular form of your identifier explictly by passing the singular form as argument to the annotation like so: @Singular("axis") List<Line> axes;.
+ If your identifiers are written in common english, lombok assumes that the name of any collection with @Singular on it is an english plural and will attempt to automatically singularize that name. If this is possible, the add-one method will use this name. For example, if your collection is called statuses, then the add-one method will automatically be called status. You can also specify the singular form of your identifier explicitly by passing the singular form as argument to the annotation like so: @Singular("axis") List<Line> axes;.
If lombok cannot singularize your identifier, or it is ambiguous, lombok will generate an error and force you to explicitly specify the singular name.
The snippet below does not show what lombok generates for a @Singular field/parameter because it is rather complicated. You can view a snippet here.
diff --git a/website/templates/setup/kobalt.html b/website/templates/setup/kobalt.html
index 26adf23d..beb60d8c 100644
--- a/website/templates/setup/kobalt.html
+++ b/website/templates/setup/kobalt.html
@@ -3,7 +3,7 @@
<@s.scaffold title="Kobalt">
<@s.introduction>
- To set up lombok with any build tool, you have to specify that the lombok dependency is required to compile your source code, but does not need to be present when running/testing/jarring/otherwise deploying your code. Generally this is called a 'provided' dependency. This page explains how to integrate lombok with the Kobalt buid tool.
+ To set up lombok with any build tool, you have to specify that the lombok dependency is required to compile your source code, but does not need to be present when running/testing/jarring/otherwise deploying your code. Generally this is called a 'provided' dependency. This page explains how to integrate lombok with the Kobalt build tool.
Lombok is available in maven central, so telling Kobalt to download lombok is easy.
From 2ac4faf14cfb4e82b771f8691704efd3c36299ea Mon Sep 17 00:00:00 2001
From: Reinier Zwitserloot
Date: Fri, 21 Aug 2020 00:00:16 +0200
Subject: [PATCH 03/18] [trivial] [changelog]
---
doc/changelog.markdown | 1 -
1 file changed, 1 deletion(-)
diff --git a/doc/changelog.markdown b/doc/changelog.markdown
index b7fbdd7d..91fdd6a5 100644
--- a/doc/changelog.markdown
+++ b/doc/changelog.markdown
@@ -2,7 +2,6 @@ Lombok Changelog
----------------
### v1.18.13 "Edgy Guinea Pig"
-* POTENTIAL FIX: Kotlin incremental compiler on gradle 3.6.1 [Issue #2412](https://github.com/rzwitserloot/lombok/issues/2412)
* PERFORMANCE: Several performance improvements during parsing/compilation, both using javac and Eclipse. Thanks __@Rawi01__!
* PERFORMANCE: The generated equals method will first compare primitives, then primitive wrappers and then reference fields. Manual re-ordering is possible using `@Include(rank=n)`. [Pull Request #2485](https://github.com/rzwitserloot/lombok/pull/2485), [Issue #1543](https://github.com/rzwitserloot/lombok/issues/1543)
* IMPROBABLE BREAKING CHANGE: The generated hashcode has changed for classes that include both primitive fields and reference fields.
From 0736f291747b1fc4d3ce3b7d9ccbaa129d15ed20 Mon Sep 17 00:00:00 2001
From: Rawi01
Date: Thu, 13 Aug 2020 09:02:13 +0200
Subject: [PATCH 04/18] Skip PostCompiler for empty byte arrays
---
src/core/lombok/core/PostCompiler.java | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/core/lombok/core/PostCompiler.java b/src/core/lombok/core/PostCompiler.java
index e17f806e..72f4b3a2 100644
--- a/src/core/lombok/core/PostCompiler.java
+++ b/src/core/lombok/core/PostCompiler.java
@@ -72,10 +72,12 @@ public final class PostCompiler {
// no need to call super
byte[] original = toByteArray();
byte[] copy = null;
- try {
- copy = applyTransformations(original, fileName, diagnostics);
- } catch (Exception e) {
- diagnostics.addWarning(String.format("Error during the transformation of '%s'; no post-compilation has been applied", fileName));
+ if (original.length > 0) {
+ try {
+ copy = applyTransformations(original, fileName, diagnostics);
+ } catch (Exception e) {
+ diagnostics.addWarning(String.format("Error during the transformation of '%s'; no post-compilation has been applied", fileName));
+ }
}
if (copy == null) {
From 355ea57b8075eacca39d3e0cbcdec67585d095fe Mon Sep 17 00:00:00 2001
From: Rawi01
Date: Tue, 14 Jul 2020 11:17:38 +0200
Subject: [PATCH 05/18] Handle each Eclipse ASTs not more than two times (diet
+ full)
---
src/core/lombok/eclipse/EclipseAST.java | 2 +-
.../lombok/eclipse/TransformEclipseAST.java | 27 +++++++++++++++++++
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/src/core/lombok/eclipse/EclipseAST.java b/src/core/lombok/eclipse/EclipseAST.java
index b45ac72d..d53856af 100644
--- a/src/core/lombok/eclipse/EclipseAST.java
+++ b/src/core/lombok/eclipse/EclipseAST.java
@@ -350,7 +350,7 @@ public class EclipseAST extends AST {
if (!changed) clearChanged();
}
- private static boolean isComplete(CompilationUnitDeclaration unit) {
+ public static boolean isComplete(CompilationUnitDeclaration unit) {
return (unit.bits & ASTNode.HasAllMethodBodies) != 0;
}
diff --git a/src/core/lombok/eclipse/TransformEclipseAST.java b/src/core/lombok/eclipse/TransformEclipseAST.java
index 6fcde937..f7b6976f 100644
--- a/src/core/lombok/eclipse/TransformEclipseAST.java
+++ b/src/core/lombok/eclipse/TransformEclipseAST.java
@@ -24,6 +24,7 @@ package lombok.eclipse;
import static lombok.eclipse.handlers.EclipseHandlerUtil.*;
import java.lang.reflect.Field;
+import java.util.WeakHashMap;
import lombok.ConfigurationKeys;
import lombok.core.LombokConfiguration;
@@ -63,6 +64,7 @@ public class TransformEclipseAST {
public static boolean disableLombok = false;
private static final HistogramTracker lombokTracker;
+ private static WeakHashMap completlyHandled = new WeakHashMap();
static {
String v = System.getProperty("lombok.histogram");
@@ -129,6 +131,30 @@ public class TransformEclipseAST {
return existing;
}
+ /**
+ * Check if lombok already handled the given AST. This method will return
+ * true once for diet mode and once for full mode.
+ *
+ * The reason for this is that Eclipse invokes the transform method multiple
+ * times during compilation and it is enough to transform it once and not
+ * repeat the whole thing over and over again.
+ *
+ * @param ast The AST node belonging to the compilation unit (java speak for a single source file).
+ * @return true if this AST was already handled by lombok.
+ */
+ public static boolean alreadyTransformed(CompilationUnitDeclaration ast) {
+ Boolean state = completlyHandled.get(ast);
+ if (state != null) {
+ if (state) return true;
+ if (!EclipseAST.isComplete(ast)) return true;
+
+ completlyHandled.put(ast, Boolean.TRUE);
+ } else {
+ completlyHandled.put(ast, Boolean.FALSE);
+ }
+ return false;
+ }
+
/**
* This method is called immediately after Eclipse finishes building a CompilationUnitDeclaration, which is
* the top-level AST node when Eclipse parses a source file. The signature is 'magic' - you should not
@@ -144,6 +170,7 @@ public class TransformEclipseAST {
if (disableLombok) return;
if (Symbols.hasSymbol("lombok.disable")) return;
+ if (alreadyTransformed(ast)) return;
// Do NOT abort if (ast.bits & ASTNode.HasAllMethodBodies) != 0 - that doesn't work.
From f44c642d406c2ad9ca6d679ca1b336e68ff28853 Mon Sep 17 00:00:00 2001
From: Rawi01
Date: Mon, 27 Jul 2020 13:37:59 +0200
Subject: [PATCH 06/18] Use enum instead of Boolean; switch to synchronized map
---
.../lombok/eclipse/TransformEclipseAST.java | 23 ++++++++++++-------
1 file changed, 15 insertions(+), 8 deletions(-)
diff --git a/src/core/lombok/eclipse/TransformEclipseAST.java b/src/core/lombok/eclipse/TransformEclipseAST.java
index f7b6976f..59a0709e 100644
--- a/src/core/lombok/eclipse/TransformEclipseAST.java
+++ b/src/core/lombok/eclipse/TransformEclipseAST.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2019 The Project Lombok Authors.
+ * Copyright (C) 2009-2020 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
@@ -24,6 +24,8 @@ package lombok.eclipse;
import static lombok.eclipse.handlers.EclipseHandlerUtil.*;
import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.Map;
import java.util.WeakHashMap;
import lombok.ConfigurationKeys;
@@ -64,7 +66,7 @@ public class TransformEclipseAST {
public static boolean disableLombok = false;
private static final HistogramTracker lombokTracker;
- private static WeakHashMap completlyHandled = new WeakHashMap();
+ private static Map transformationStates = Collections.synchronizedMap(new WeakHashMap());
static {
String v = System.getProperty("lombok.histogram");
@@ -143,14 +145,14 @@ public class TransformEclipseAST {
* @return true if this AST was already handled by lombok.
*/
public static boolean alreadyTransformed(CompilationUnitDeclaration ast) {
- Boolean state = completlyHandled.get(ast);
- if (state != null) {
- if (state) return true;
+ State state = transformationStates.get(ast);
+
+ if (state == State.FULL) return true;
+ if (state == State.DIET) {
if (!EclipseAST.isComplete(ast)) return true;
-
- completlyHandled.put(ast, Boolean.TRUE);
+ transformationStates.put(ast, State.FULL);
} else {
- completlyHandled.put(ast, Boolean.FALSE);
+ transformationStates.put(ast, State.DIET);
}
return false;
}
@@ -270,4 +272,9 @@ public class TransformEclipseAST {
nextPriority = Math.min(nextPriority, handlers.handleAnnotation(top, annotationNode, annotation, priority));
}
}
+
+ private static enum State {
+ DIET,
+ FULL
+ }
}
From d4bd359d21c223d6f8dc012c409f7262c4f51bb4 Mon Sep 17 00:00:00 2001
From: Rawi01
Date: Wed, 29 Jul 2020 09:42:07 +0200
Subject: [PATCH 07/18] [test] [bugfix] Compare full line instead of ignoring
the last character
---
test/core/src/lombok/AbstractRunTests.java | 2 +-
test/transform/resource/after-delombok/GetterSetterJavadoc.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/core/src/lombok/AbstractRunTests.java b/test/core/src/lombok/AbstractRunTests.java
index 8e73e122..448f77ab 100644
--- a/test/core/src/lombok/AbstractRunTests.java
+++ b/test/core/src/lombok/AbstractRunTests.java
@@ -285,7 +285,7 @@ public abstract class AbstractRunTests {
endIdx--;
}
- return in.substring(0, endIdx);
+ return in.substring(0, endIdx + 1);
}
private static String[] removeBlanks(String[] in) {
diff --git a/test/transform/resource/after-delombok/GetterSetterJavadoc.java b/test/transform/resource/after-delombok/GetterSetterJavadoc.java
index ae662da7..78d120a4 100644
--- a/test/transform/resource/after-delombok/GetterSetterJavadoc.java
+++ b/test/transform/resource/after-delombok/GetterSetterJavadoc.java
@@ -115,7 +115,7 @@ class GetterSetterJavadoc4 {
/**
* Some text
*
- * @param fieldName Hello, World5
+ * @param fieldName Hello, World4
* @return {@code this}.
*/
@java.lang.SuppressWarnings("all")
From 74211eb0ae63a916c6ecc7be4b92ba521e0cef34 Mon Sep 17 00:00:00 2001
From: Rawi01
Date: Thu, 27 Aug 2020 09:46:41 +0200
Subject: [PATCH 08/18] [fixes #2566] Reset constant value set during type
resolution
---
.../lombok/eclipse/agent/PatchVal.java | 25 +++++++++++++------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java b/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java
index 056852c8..f22e78a8 100644
--- a/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java
+++ b/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java
@@ -35,11 +35,13 @@ import org.eclipse.jdt.internal.compiler.ast.FunctionalExpression;
import org.eclipse.jdt.internal.compiler.ast.ImportReference;
import org.eclipse.jdt.internal.compiler.ast.LambdaExpression;
import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.MessageSend;
import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
import org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
import org.eclipse.jdt.internal.compiler.ast.TypeReference;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.eclipse.jdt.internal.compiler.impl.Constant;
import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
import org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
import org.eclipse.jdt.internal.compiler.lookup.Binding;
@@ -227,14 +229,16 @@ public class PatchVal {
boolean var = isVar(local, scope);
if (!(val || var)) return false;
- StackTraceElement[] st = new Throwable().getStackTrace();
- for (int i = 0; i < st.length - 2 && i < 10; i++) {
- if (st[i].getClassName().equals("lombok.launch.PatchFixesHider$Val")) {
- boolean valInForStatement = val &&
- st[i + 1].getClassName().equals("org.eclipse.jdt.internal.compiler.ast.LocalDeclaration") &&
- st[i + 2].getClassName().equals("org.eclipse.jdt.internal.compiler.ast.ForStatement");
- if (valInForStatement) return false;
- break;
+ if (val) {
+ StackTraceElement[] st = new Throwable().getStackTrace();
+ for (int i = 0; i < st.length - 2 && i < 10; i++) {
+ if (st[i].getClassName().equals("lombok.launch.PatchFixesHider$Val")) {
+ boolean valInForStatement =
+ st[i + 1].getClassName().equals("org.eclipse.jdt.internal.compiler.ast.LocalDeclaration") &&
+ st[i + 2].getClassName().equals("org.eclipse.jdt.internal.compiler.ast.ForStatement");
+ if (valInForStatement) return false;
+ break;
+ }
}
}
@@ -264,6 +268,7 @@ public class PatchVal {
}
TypeBinding resolved = null;
+ Constant oldConstant = init.constant;
try {
resolved = decomponent ? getForEachComponentType(init, scope) : resolveForExpression(init, scope);
} catch (NullPointerException e) {
@@ -280,6 +285,10 @@ public class PatchVal {
} catch (Exception e) {
// Some type thing failed.
}
+ } else {
+ if (init instanceof MessageSend && ((MessageSend) init).actualReceiverType == null) {
+ init.constant = oldConstant;
+ }
}
}
From eb78f5c7665833c8e7dedce75fbe102774e370ae Mon Sep 17 00:00:00 2001
From: Denis Stepanov
Date: Wed, 19 Aug 2020 20:34:45 +0700
Subject: [PATCH 09/18] Fix missing parameter names, annotations in following
annotation processors 2
---
.../javac/handlers/JavacHandlerUtil.java | 58 ++++++++++++++++---
.../com/sun/tools/javac/code/Symbol.java | 8 ++-
.../com/sun/tools/javac/code/Symtab.java | 2 +
3 files changed, 59 insertions(+), 9 deletions(-)
diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
index e0af0e52..a8189562 100644
--- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java
+++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
@@ -40,6 +40,7 @@ import java.util.regex.Pattern;
import javax.lang.model.element.Element;
+import com.sun.tools.javac.code.Attribute;
import com.sun.tools.javac.code.BoundKind;
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Scope;
@@ -1127,7 +1128,25 @@ public class JavacHandlerUtil {
}
}
}
-
+
+ static class JCAnnotationReflect {
+ private static Field ATTRIBUTE;
+
+ static {
+ try {
+ ATTRIBUTE = Permit.getField(JCAnnotation.class, "attribute");
+ } catch (Exception ignore) {}
+ }
+
+ static Attribute.Compound getAttribute(JCAnnotation jcAnnotation) {
+ try {
+ return (Attribute.Compound) ATTRIBUTE.get(jcAnnotation);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+ }
+
// jdk9 support, types have changed, names stay the same
static class ClassSymbolMembersField {
private static final Field membersField;
@@ -1178,8 +1197,10 @@ public class JavacHandlerUtil {
* Also takes care of updating the JavacAST.
*/
public static void injectMethod(JavacNode typeNode, JCMethodDecl method, List paramTypes, Type returnType) {
+ Context context = typeNode.getContext();
+ Symtab symtab = Symtab.instance(context);
JCClassDecl type = (JCClassDecl) typeNode.get();
-
+
if (method.getName().contentEquals("")) {
//Scan for default constructor, and remove it.
int idx = 0;
@@ -1196,7 +1217,7 @@ public class JavacHandlerUtil {
idx++;
}
}
-
+
addSuppressWarningsAll(method.mods, typeNode, method.pos, getGeneratedBy(method), typeNode.getContext());
addGenerated(method.mods, typeNode, method.pos, getGeneratedBy(method), typeNode.getContext());
type.defs = type.defs.append(method);
@@ -1204,18 +1225,41 @@ public class JavacHandlerUtil {
List params = null;
if (method.getParameters() != null && !method.getParameters().isEmpty()) {
ListBuffer newParams = new ListBuffer();
- for (JCTree.JCVariableDecl param : method.getParameters()) {
- if (param.sym != null) newParams.append(param.sym);
+ for (int i = 0; i < method.getParameters().size(); i++) {
+ JCTree.JCVariableDecl param = method.getParameters().get(i);
+ if (param.sym == null) {
+ Type paramType = param.getType().type;
+ if (paramTypes != null) {
+ paramType = paramTypes.get(i);
+ }
+ VarSymbol varSymbol = new VarSymbol(param.mods.flags, param.name, paramType, symtab.noSymbol);
+ List annotations = param.getModifiers().getAnnotations();
+ if (annotations != null && !annotations.isEmpty()) {
+ ListBuffer newAnnotations = new ListBuffer();
+ for (JCAnnotation jcAnnotation : annotations) {
+ Attribute.Compound attribute = JCAnnotationReflect.getAttribute(jcAnnotation);
+ if (attribute != null) {
+ newAnnotations.append(attribute);
+ }
+ }
+ if (annotations.length() == newAnnotations.length()) {
+ varSymbol.appendAttributes(newAnnotations.toList());
+ }
+ }
+ newParams.append(varSymbol);
+ } else {
+ newParams.append(param.sym);
+ }
}
params = newParams.toList();
if (params.length() != method.getParameters().length()) params = null;
}
fixMethodMirror(typeNode.getContext(), typeNode.getElement(), method.getModifiers().flags, method.getName(), paramTypes, params, returnType);
-
+
typeNode.add(method, Kind.METHOD);
}
-
+
private static void fixMethodMirror(Context context, Element typeMirror, long access, Name methodName, List paramTypes, List params, Type returnType) {
if (typeMirror == null || paramTypes == null || returnType == null) return;
ClassSymbol cs = (ClassSymbol) typeMirror;
diff --git a/src/stubs/com/sun/tools/javac/code/Symbol.java b/src/stubs/com/sun/tools/javac/code/Symbol.java
index 7324cb8e..15b04148 100644
--- a/src/stubs/com/sun/tools/javac/code/Symbol.java
+++ b/src/stubs/com/sun/tools/javac/code/Symbol.java
@@ -24,7 +24,7 @@ import com.sun.tools.javac.util.Name;
public abstract class Symbol implements Element {
public Type type;
public Name name;
-
+
public long flags() { return 0; }
public boolean isStatic() { return false; }
public boolean isConstructor() { return false; }
@@ -38,7 +38,9 @@ public abstract class Symbol implements Element {
@Override public Name getSimpleName() { return null; }
@Override public java.util.List getEnclosedElements() { return null; }
@Override public Element getEnclosingElement() { return null; }
-
+ public void appendAttributes(List l) {
+ }
+
public static abstract class TypeSymbol extends Symbol {}
public static class MethodSymbol extends Symbol implements ExecutableElement {
@@ -60,6 +62,8 @@ public abstract class Symbol implements Element {
public static class VarSymbol extends Symbol implements VariableElement {
public Type type;
+ public VarSymbol(long flags, Name name, Type type, Symbol owner) {
+ }
@Override public ElementKind getKind() { return null; }
@Override public Set getModifiers() { return null; }
@Override public R accept(ElementVisitor v, P p) { return null; }
diff --git a/src/stubs/com/sun/tools/javac/code/Symtab.java b/src/stubs/com/sun/tools/javac/code/Symtab.java
index 2b524e4c..8d823531 100644
--- a/src/stubs/com/sun/tools/javac/code/Symtab.java
+++ b/src/stubs/com/sun/tools/javac/code/Symtab.java
@@ -5,6 +5,7 @@ package com.sun.tools.javac.code;
import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.code.Symbol.ModuleSymbol;
+import com.sun.tools.javac.code.Symbol.TypeSymbol;
import com.sun.tools.javac.util.Context;
public class Symtab {
@@ -14,6 +15,7 @@ public class Symtab {
public Type objectType;
public static Symtab instance(Context context) {return null;}
public Type unknownType;
+ public TypeSymbol noSymbol;
// JDK 9
public ModuleSymbol unnamedModule;
From 9f6c2203c9fd277256ccd9012d7075e7244b7fb6 Mon Sep 17 00:00:00 2001
From: Roel Spilker
Date: Thu, 27 Aug 2020 23:15:11 +0200
Subject: [PATCH 10/18] trivial - Only assign variable once
---
src/core/lombok/javac/handlers/JavacHandlerUtil.java | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
index a8189562..40b729b2 100644
--- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java
+++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
@@ -1228,10 +1228,7 @@ public class JavacHandlerUtil {
for (int i = 0; i < method.getParameters().size(); i++) {
JCTree.JCVariableDecl param = method.getParameters().get(i);
if (param.sym == null) {
- Type paramType = param.getType().type;
- if (paramTypes != null) {
- paramType = paramTypes.get(i);
- }
+ Type paramType = paramTypes == null ? param.getType().type : paramTypes.get(i);
VarSymbol varSymbol = new VarSymbol(param.mods.flags, param.name, paramType, symtab.noSymbol);
List annotations = param.getModifiers().getAnnotations();
if (annotations != null && !annotations.isEmpty()) {
From 273d8fc53ccbcf0e5e9b3a74489e8ebf8220b546 Mon Sep 17 00:00:00 2001
From: Le Beier
Date: Mon, 3 Aug 2020 08:47:46 +0800
Subject: [PATCH 11/18] changed arraylist to set
---
website/usageExamples/BuilderExample_post.jpage | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/website/usageExamples/BuilderExample_post.jpage b/website/usageExamples/BuilderExample_post.jpage
index 24d326b3..638e9e14 100644
--- a/website/usageExamples/BuilderExample_post.jpage
+++ b/website/usageExamples/BuilderExample_post.jpage
@@ -25,7 +25,7 @@ public class BuilderExample {
private boolean created$set;
private String name;
private int age;
- private java.util.ArrayList occupations;
+ private Set occupations;
BuilderExampleBuilder() {
}
@@ -48,7 +48,7 @@ public class BuilderExample {
public BuilderExampleBuilder occupation(String occupation) {
if (this.occupations == null) {
- this.occupations = new java.util.ArrayList();
+ this.occupations = new Set();
}
this.occupations.add(occupation);
@@ -57,7 +57,7 @@ public class BuilderExample {
public BuilderExampleBuilder occupations(Collection extends String> occupations) {
if (this.occupations == null) {
- this.occupations = new java.util.ArrayList();
+ this.occupations = new Set();
}
this.occupations.addAll(occupations);
@@ -83,4 +83,4 @@ public class BuilderExample {
return "BuilderExample.BuilderExampleBuilder(created = " + this.created + ", name = " + this.name + ", age = " + this.age + ", occupations = " + this.occupations + ")";
}
}
-}
\ No newline at end of file
+}
From 60a9799c24f182b3c7e262754b6cc2e3400a4993 Mon Sep 17 00:00:00 2001
From: Roel Spilker
Date: Thu, 27 Aug 2020 23:43:15 +0200
Subject: [PATCH 12/18] Revert "changed arraylist to set"
This reverts commit 273d8fc53ccbcf0e5e9b3a74489e8ebf8220b546.
---
website/usageExamples/BuilderExample_post.jpage | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/website/usageExamples/BuilderExample_post.jpage b/website/usageExamples/BuilderExample_post.jpage
index 638e9e14..24d326b3 100644
--- a/website/usageExamples/BuilderExample_post.jpage
+++ b/website/usageExamples/BuilderExample_post.jpage
@@ -25,7 +25,7 @@ public class BuilderExample {
private boolean created$set;
private String name;
private int age;
- private Set occupations;
+ private java.util.ArrayList occupations;
BuilderExampleBuilder() {
}
@@ -48,7 +48,7 @@ public class BuilderExample {
public BuilderExampleBuilder occupation(String occupation) {
if (this.occupations == null) {
- this.occupations = new Set();
+ this.occupations = new java.util.ArrayList();
}
this.occupations.add(occupation);
@@ -57,7 +57,7 @@ public class BuilderExample {
public BuilderExampleBuilder occupations(Collection extends String> occupations) {
if (this.occupations == null) {
- this.occupations = new Set();
+ this.occupations = new java.util.ArrayList();
}
this.occupations.addAll(occupations);
@@ -83,4 +83,4 @@ public class BuilderExample {
return "BuilderExample.BuilderExampleBuilder(created = " + this.created + ", name = " + this.name + ", age = " + this.age + ", occupations = " + this.occupations + ")";
}
}
-}
+}
\ No newline at end of file
From edbfdfe8c52c17a38bf2b526d14a4f622c5402f7 Mon Sep 17 00:00:00 2001
From: Kay Schubert
Date: Mon, 17 Aug 2020 15:57:45 +0200
Subject: [PATCH 13/18] Issue 2552 - generate class initializer body only after
field member injection
---
.../lombok/eclipse/handlers/HandleFieldNameConstants.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java b/src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java
index 9343011f..cee3912c 100644
--- a/src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java
+++ b/src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java
@@ -171,10 +171,10 @@ public class HandleFieldNameConstants extends EclipseAnnotationHandler
Date: Fri, 28 Aug 2020 00:14:10 +0200
Subject: [PATCH 14/18] [build] added ant website.open
this serves the site locally and opens your browser
---
buildScripts/info.ant.xml | 5 ++
buildScripts/ivy.xml | 1 +
buildScripts/website.ant.xml | 13 +++
src/support/lombok/website/RunSite.java | 107 ++++++++++++++++++++++++
4 files changed, 126 insertions(+)
create mode 100644 src/support/lombok/website/RunSite.java
diff --git a/buildScripts/info.ant.xml b/buildScripts/info.ant.xml
index 55fea8af..fe6e0ee3 100644
--- a/buildScripts/info.ant.xml
+++ b/buildScripts/info.ant.xml
@@ -258,6 +258,11 @@ build/website.
'pack' bzips this up, ready to ship to the server.
'publish' sends this to the server and runs a script to deploy.
+ > ant website.open
+
+ First builds the website, then hosts it locally and opens it in your browser so
+ you can see the website in its full, template-applied form.
+
> ant latest-changes.build
Makes a changelog variant that lists only the newest changes; it is included
diff --git a/buildScripts/ivy.xml b/buildScripts/ivy.xml
index 14530f06..40bbad08 100644
--- a/buildScripts/ivy.xml
+++ b/buildScripts/ivy.xml
@@ -58,6 +58,7 @@
+
diff --git a/buildScripts/website.ant.xml b/buildScripts/website.ant.xml
index 9efb2668..730b79c2 100644
--- a/buildScripts/website.ant.xml
+++ b/buildScripts/website.ant.xml
@@ -150,6 +150,19 @@ such as applying the templates to produce the website, converting the changelog
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/support/lombok/website/RunSite.java b/src/support/lombok/website/RunSite.java
new file mode 100644
index 00000000..ad4a3731
--- /dev/null
+++ b/src/support/lombok/website/RunSite.java
@@ -0,0 +1,107 @@
+package lombok.website;
+
+import static spark.Spark.*;
+
+import java.awt.Desktop;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import spark.Request;
+import spark.Response;
+import spark.Route;
+import spark.resource.InputStreamResource;
+
+public class RunSite {
+ private static final int DEFAULT_PORT = 4569;
+ private final Path base;
+
+ public RunSite(Path base) {
+ this.base = base;
+ }
+
+ public static void main(String[] args) throws Exception {
+ boolean open = args.length > 1 && args[1].equals("open");
+ new RunSite(Paths.get(args[0])).go(open);
+ }
+
+ private void go(boolean open) throws Exception {
+ port(DEFAULT_PORT);
+ get("/", serve("main.html"));
+ get("/setup/overview", serve("setup/main.html"));
+ get("/setup", serve("setup/main.html"));
+ get("/features", serve("features/index.html"));
+ get("/features/all", serve("features/index.html"));
+ get("/features/experimental/all", serve("features/experimental/index.html"));
+ get("/features/experimental", serve("features/experimental/index.html"));
+
+ serveDir("/", base);
+
+ System.out.println("Serving page from " + base + " -- hit enter to stop");
+ if (open) Opener.open("http://localhost:" + DEFAULT_PORT + "/");
+ System.in.read();
+ System.exit(0);
+ }
+
+ private void serveDir(String sub, Path dir) throws IOException {
+ DirectoryStream ds = Files.newDirectoryStream(dir);
+ try {
+ for (Path c : ds) {
+ String n = c.getFileName().toString();
+ if (n.equals(".") || n.equals("..")) continue;
+ if (Files.isDirectory(c)) {
+ serveDir(sub + n + "/", c);
+ continue;
+ }
+ String rel = base.relativize(c).toString();
+ get(sub + n, serve(rel));
+ if (n.endsWith(".html")) get(sub + n.substring(0, n.length() - 5), serve(rel));
+ }
+ } finally {
+ ds.close();
+ }
+ }
+
+ private static class Opener {
+ public static void open(String url) throws Exception {
+ Desktop.getDesktop().browse(new URI(url));
+ }
+ }
+
+ private Route serve(final String path) {
+ final Path tgt = base.resolve(path);
+
+ return new Route() {
+ @Override public Object handle(Request req, Response res) throws Exception {
+ res.type(mapMime(path));
+ return Files.readAllBytes(tgt);
+ }
+ };
+ }
+
+ private String mapMime(String path) {
+ if (path.endsWith(".css")) return "text/css; charset=UTF-8";
+ if (path.endsWith(".js")) return "text/javascript; charset=UTF-8";
+ if (path.endsWith(".png")) return "image/png";
+ if (path.endsWith(".gif")) return "image/gif";
+ if (path.endsWith(".jpg")) return "image/jpeg";
+ if (path.endsWith(".mp4")) return "video/mp4";
+ if (path.endsWith(".m4v")) return "video/mp4";
+ if (path.endsWith(".ogv")) return "video/ogg";
+ if (path.endsWith(".webm")) return "video/webm";
+ if (path.endsWith(".ico")) return "image/x-icon";
+ if (path.endsWith(".pdf")) return "application/pdf";
+ if (path.endsWith(".json")) return "application/json";
+ if (path.endsWith(".xml")) return "text/xml";
+ if (path.endsWith(".woff")) return "font/woff";
+ if (path.endsWith(".woff2")) return "font/woff2";
+ if (path.endsWith(".html")) return "text/html; charset=UTF-8";
+ return "text/plain; charset=UTF-8";
+ }
+}
From 7f8e15762d4f3428d38579f702e65a4a302b1dac Mon Sep 17 00:00:00 2001
From: Reinier Zwitserloot
Date: Fri, 28 Aug 2020 00:15:43 +0200
Subject: [PATCH 15/18] [website] [#397] [#2371] added docs for installing in
eclipse via p2
---
website/resources/img/eclipse-p2-step1.png | Bin 0 -> 645640 bytes
website/resources/img/eclipse-p2-step2.png | Bin 0 -> 56195 bytes
website/templates/setup/eclipse.html | 12 ++++++++++++
3 files changed, 12 insertions(+)
create mode 100644 website/resources/img/eclipse-p2-step1.png
create mode 100644 website/resources/img/eclipse-p2-step2.png
diff --git a/website/resources/img/eclipse-p2-step1.png b/website/resources/img/eclipse-p2-step1.png
new file mode 100644
index 0000000000000000000000000000000000000000..92cdef8669570741a800752f254bc762b5b91a1a
GIT binary patch
literal 645640
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