diff --git a/build.xml b/build.xml
index f20973cf..654c23ea 100644
--- a/build.xml
+++ b/build.xml
@@ -232,7 +232,13 @@ lombok.launch.AnnotationProcessorHider$ClaimingProcessor
lombok.launch.AnnotationProcessorHider$AstModificationNotifier
-
+
+
+
+
+
+
+
@@ -240,7 +246,7 @@ lombok.launch.AnnotationProcessorHider$ClaimingProcessor
${releaseTimestamp}
-
+
diff --git a/buildScripts/src/lombok/website/CompileChangelog.java b/buildScripts/src/lombok/website/CompileChangelog.java
index 60b70aa3..276842be 100644
--- a/buildScripts/src/lombok/website/CompileChangelog.java
+++ b/buildScripts/src/lombok/website/CompileChangelog.java
@@ -1,18 +1,20 @@
package lombok.website;
-import com.petebevin.markdown.MarkdownProcessor;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import com.petebevin.markdown.MarkdownProcessor;
+
public class CompileChangelog {
public static void main(String[] args) {
String fileIn = args[0];
String fileOut = args[1];
boolean edge = args.length > 3 && "-edge".equals(args[2]);
- String version = edge ? args[3] : null;
+ boolean latest = args.length > 3 && "-latest".equals(args[2]);
+ String version = args.length > 3 ? args[3] : null;
try {
FileInputStream in = new FileInputStream(fileIn);
@@ -27,7 +29,14 @@ public class CompileChangelog {
in.close();
String markdown = new String(out.toByteArray(), "UTF-8");
- String result = edge ? buildEdge(markdown, version) : build(markdown);
+ String result;
+ if (edge) {
+ result = buildEdge(sectionByVersion(markdown, version));
+ } else if (latest) {
+ result = buildLatest(sectionByVersion(markdown, version));
+ } else {
+ result = build(markdown);
+ }
FileOutputStream file = new FileOutputStream(fileOut);
file.write(result.getBytes("UTF-8"));
@@ -43,9 +52,19 @@ public class CompileChangelog {
return new MarkdownProcessor().markdown(markdown);
}
- private static final Pattern LAST_CHANGELOG = Pattern.compile(
- "^.*### v$", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
- private static String buildEdge(String markdown, String version) {
+ private static String buildEdge(String section) {
+ String latest = section != null ? section : "* No changelog records for this edge release.";
+ return new MarkdownProcessor().markdown(latest);
+ }
+
+ private static String buildLatest(String section) {
+ String latest = section != null ? section : "* No changelog records for this release.";
+ String noIssueLinks = latest.replaceAll("\\[[^]]*[Ii]ssue[^]]*\\]\\([^)]*\\)", "");
+ String noLinks = noIssueLinks.replaceAll("\\[([^]]*)\\]\\([^)]*\\)", "$1");
+ return new MarkdownProcessor().markdown(noLinks);
+ }
+
+ private static String sectionByVersion(String markdown, String version) {
if (version.toUpperCase().endsWith("-HEAD") || version.toUpperCase().endsWith("-EDGE")) {
version = version.substring(0, version.length() - 5);
}
@@ -53,7 +72,6 @@ public class CompileChangelog {
Pattern p = Pattern.compile(
"(?is-m)^.*###\\s*v" + version + ".*?\n(.*?)(?:###\\s*v.*)?$");
Matcher m = p.matcher(markdown);
- String subMarkdown = m.matches() ? m.group(1) : "* No changelog records for this edge release.";
- return new MarkdownProcessor().markdown(subMarkdown);
+ return m.matches() ? m.group(1) : null;
}
-}
+}
\ No newline at end of file
diff --git a/buildScripts/website.ant.xml b/buildScripts/website.ant.xml
index 19b995d3..c1c780ae 100644
--- a/buildScripts/website.ant.xml
+++ b/buildScripts/website.ant.xml
@@ -243,6 +243,19 @@ such as converting the changelog into HTML, and creating javadoc.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/changelog.markdown b/doc/changelog.markdown
index f29da540..6fc3af38 100644
--- a/doc/changelog.markdown
+++ b/doc/changelog.markdown
@@ -1,11 +1,16 @@
Lombok Changelog
----------------
-### v1.16.13 "Edgy Guinea Pig"
-* v1.16.12 is the latest stable release of Project Lombok.
-* FEATURE: Generated classes, methods and fields are now also annotated with `@lombok.Generated` [Issue #1014](https://github.com/rzwitserloot/lombok/issues/1014)
-* PLATFORM: Lombok can now be used together with other annotation processors that are looking for lombok-generated methods, but only if lombok is the first annotation processor executed. The most commonly used annotation processor affected by this change is [MapStruct](http://mapstruct.org/); we've worked with the mapstruct team specifically to allow any order. Other annotation processors might follow the framework we've built to make this possible; point the authors of any such processor to us and we'll get it sorted. [MapStruct issue #510](https://github.com/mapstruct/mapstruct/issues/510) [Lombok issue #973](https://github.com/rzwitserloot/lombok/issues/973).
-* PLATFORM: Eclipse: Refactor script 'rename field' when lombok has also generated getters and/or setters for this field is nicer now [Issue #210](https://github.com/rzwitserloot/lombok/issues/210).
+### v1.16.15 "Edgy Guinea Pig"
+* v1.16.14 is the latest stable release of Project Lombok.
+* PLATFORM: Improved jdk9 support, work in progress.
+* BUGFIX: The `onX` feature (which lets you add annotations to generated methods) did not work if the annotation you added contained named parameters, and you are compiling with JDK8's javac. We can't fix this (it's a bug in javac), but we have provided an alternate, prettier way to do `onX` on javac8+. [Issue #778](https://github.com/rzwitserloot/lombok/issues/778) [onX documentation](https://projectlombok.org/features/experimental/onX.html)
+
+### v1.16.14 (February 10th, 2017)
+* FEATURE: Generated classes, methods and fields can now also annotated with `@lombok.Generated` [Issue #1014](https://github.com/rzwitserloot/lombok/issues/1014)
+* PLATFORM: Lombok can now be used together with other annotation processors that are looking for lombok-generated methods, but only if lombok is the first annotation processor executed. The most commonly used annotation processor affected by this change is [MapStruct](http://mapstruct.org/); we've worked with the mapstruct team specifically to allow any order. Other annotation processors might follow the framework we've built to make this possible; point the authors of any such processor to us and we'll get it sorted [MapStruct issue #510](https://github.com/mapstruct/mapstruct/issues/510) [Lombok issue #973](https://github.com/rzwitserloot/lombok/issues/973)
+* PLATFORM: Eclipse: Refactor script 'rename field' when lombok has also generated getters and/or setters for this field is nicer now [Issue #210](https://github.com/rzwitserloot/lombok/issues/210)
+* BUGFIX: Something you never encountered. [Issue #1274](https://github.com/rzwitserloot/lombok/issues/1274)
### v1.16.12 (December 5th, 2016)
* FEATURE: `var` is the mutable sister of `val`. For now experimental, and opt-in using `ALLOW` in the flagUsage configuration key. Thanks for the contribution, Bulgakov Alexander.
diff --git a/src/core/lombok/AllArgsConstructor.java b/src/core/lombok/AllArgsConstructor.java
index 3037c9db..75f87211 100644
--- a/src/core/lombok/AllArgsConstructor.java
+++ b/src/core/lombok/AllArgsConstructor.java
@@ -49,7 +49,12 @@ public @interface AllArgsConstructor {
String staticName() default "";
/**
- * Any annotations listed here are put on the generated constructor. The syntax for this feature is: {@code @AllArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}
+ * Any annotations listed here are put on the generated constructor.
+ * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).
+ * up to JDK7:
+ * {@code @AllArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}
+ * from JDK8:
+ * {@code @AllArgsConstructor(onConstructor_={@AnnotationsGohere})} // note the underscore after {@code onConstructor}.
*/
AnyAnnotation[] onConstructor() default {};
@@ -58,16 +63,6 @@ public @interface AllArgsConstructor {
*/
AccessLevel access() default lombok.AccessLevel.PUBLIC;
- /**
- * Constructors are generated with the {@link java.beans.ConstructorProperties} annotation.
- * However, this annotation is new in 1.6 which means those compiling for 1.5 will need
- * to set this value to true.
- *
- * @deprecated THIS FEATURE WILL BE REMOVED after March 31st 2015. Use configuration key {@link ConfigurationKeys#ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES} instead.
- */
- @Deprecated
- boolean suppressConstructorProperties() default false;
-
/**
* Placeholder annotation to enable the placement of annotations on the generated code.
* @deprecated Don't use this annotation, ever - Read the documentation.
diff --git a/src/core/lombok/ConfigurationKeys.java b/src/core/lombok/ConfigurationKeys.java
index ff17ca09..f0e070e2 100644
--- a/src/core/lombok/ConfigurationKeys.java
+++ b/src/core/lombok/ConfigurationKeys.java
@@ -41,30 +41,28 @@ public class ConfigurationKeys {
/**
* lombok configuration: {@code lombok.addGeneratedAnnotation} = {@code true} | {@code false}.
*
- * If unset or {@code true}, lombok generates various annotations to mark generated code like {@code @javax.annotation.Generated("lombok")} and {@code @lombok.Generated}.
+ * If unset or {@code true}, lombok generates {@code @javax.annotation.Generated("lombok")} on all fields, methods, and types that are generated, unless {@code lombok.addJavaxGeneratedAnnotation} is set.
*
* @see ConfigurationKeys#ADD_JAVAX_GENERATED_ANNOTATIONS
* @see ConfigurationKeys#ADD_LOMBOK_GENERATED_ANNOTATIONS
+ * @deprecated Since version 1.16.14, use {@link #ADD_JAVAX_GENERATED_ANNOTATIONS} instead.
*/
- public static final ConfigurationKey ADD_GENERATED_ANNOTATIONS = new ConfigurationKey("lombok.addGeneratedAnnotation", "Generate @javax.annotation.Generated on all generated code (default: true).") {};
+ @Deprecated
+ public static final ConfigurationKey ADD_GENERATED_ANNOTATIONS = new ConfigurationKey("lombok.addGeneratedAnnotation", "Generate @javax.annotation.Generated on all generated code (default: true). Deprecated, use 'lombok.addJavaxGeneratedAnnotation' instead.") {};
/**
* lombok configuration: {@code lombok.addJavaxGeneratedAnnotation} = {@code true} | {@code false}.
*
* If unset or {@code true}, lombok generates {@code @javax.annotation.Generated("lombok")} on all fields, methods, and types that are generated, unless {@code lombok.addGeneratedAnnotation} is set to {@code false}.
- *
- * @see ConfigurationKeys#ADD_GENERATED_ANNOTATIONS
*/
public static final ConfigurationKey ADD_JAVAX_GENERATED_ANNOTATIONS = new ConfigurationKey("lombok.addJavaxGeneratedAnnotation", "Generate @javax.annotation.Generated on all generated code (default: follow lombok.addGeneratedAnnotation).") {};
/**
* lombok configuration: {@code lombok.addLombokGeneratedAnnotation} = {@code true} | {@code false}.
*
- * If unset or {@code true}, lombok generates {@code @lombok.Generated} on all fields, methods, and types that are generated, unless {@code lombok.addGeneratedAnnotation} is set to {@code false}.
- *
- * @see ConfigurationKeys#ADD_GENERATED_ANNOTATIONS
+ * If {@code true}, lombok generates {@code @lombok.Generated} on all fields, methods, and types that are generated.
*/
- public static final ConfigurationKey ADD_LOMBOK_GENERATED_ANNOTATIONS = new ConfigurationKey("lombok.addLombokGeneratedAnnotation", "Generate @lombok.Generated on all generated code (default: follow lombok.addGeneratedAnnotation).") {};
+ public static final ConfigurationKey ADD_LOMBOK_GENERATED_ANNOTATIONS = new ConfigurationKey("lombok.addLombokGeneratedAnnotation", "Generate @lombok.Generated on all generated code (default: false).") {};
/**
* lombok configuration: {@code lombok.extern.findbugs.addSuppressFBWarnings} = {@code true} | {@code false}.
diff --git a/src/core/lombok/EqualsAndHashCode.java b/src/core/lombok/EqualsAndHashCode.java
index 605815ed..34f4ffc6 100644
--- a/src/core/lombok/EqualsAndHashCode.java
+++ b/src/core/lombok/EqualsAndHashCode.java
@@ -63,8 +63,13 @@ public @interface EqualsAndHashCode {
boolean doNotUseGetters() default false;
/**
- * Any annotations listed here are put on the generated parameter of {@code equals} and {@code canEqual}. The syntax for this feature is: {@code @EqualsAndHashCode(onParam=@__({@AnnotationsGoHere}))}
- * This is useful to add for example a {@code Nullable} annotation.
+ * Any annotations listed here are put on the generated parameter of {@code equals} and {@code canEqual}.
+ * This is useful to add for example a {@code Nullable} annotation.
+ * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).
+ * up to JDK7:
+ * {@code @EqualsAndHashCode(onParam=@__({@AnnotationsGoHere}))}
+ * from JDK8:
+ * {@code @EqualsAndHashCode(onParam_={@AnnotationsGohere})} // note the underscore after {@code onParam}.
*/
AnyAnnotation[] onParam() default {};
diff --git a/src/core/lombok/Getter.java b/src/core/lombok/Getter.java
index 906ae60f..5a4056fa 100644
--- a/src/core/lombok/Getter.java
+++ b/src/core/lombok/Getter.java
@@ -58,9 +58,14 @@ public @interface Getter {
lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
/**
- * Any annotations listed here are put on the generated method. The syntax for this feature is: {@code @Getter(onMethod=@__({@AnnotationsGoHere}))}
+ * Any annotations listed here are put on the generated method.
+ * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).
+ * up to JDK7:
+ * {@code @Getter(onMethod=@__({@AnnotationsGoHere}))}
+ * from JDK8:
+ * {@code @Getter(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}.
*/
- AnyAnnotation[] onMethod() default @AnyAnnotation;
+ AnyAnnotation[] onMethod() default {};
boolean lazy() default false;
diff --git a/src/core/lombok/NoArgsConstructor.java b/src/core/lombok/NoArgsConstructor.java
index ff437bba..5f2268a8 100644
--- a/src/core/lombok/NoArgsConstructor.java
+++ b/src/core/lombok/NoArgsConstructor.java
@@ -51,7 +51,12 @@ public @interface NoArgsConstructor {
String staticName() default "";
/**
- * Any annotations listed here are put on the generated constructor. The syntax for this feature is: {@code @NoArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}
+ * Any annotations listed here are put on the generated constructor.
+ * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).
+ * up to JDK7:
+ * {@code @NoArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}
+ * from JDK8:
+ * {@code @NoArgsConstructor(onConstructor_={@AnnotationsGohere})} // note the underscore after {@code onConstructor}.
*/
AnyAnnotation[] onConstructor() default {};
diff --git a/src/core/lombok/RequiredArgsConstructor.java b/src/core/lombok/RequiredArgsConstructor.java
index 7a9da3f9..2f4d0aaf 100644
--- a/src/core/lombok/RequiredArgsConstructor.java
+++ b/src/core/lombok/RequiredArgsConstructor.java
@@ -49,7 +49,12 @@ public @interface RequiredArgsConstructor {
String staticName() default "";
/**
- * Any annotations listed here are put on the generated constructor. The syntax for this feature is: {@code @RequiredArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}
+ * Any annotations listed here are put on the generated constructor.
+ * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).
+ * up to JDK7:
+ * {@code @RequiredArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}
+ * from JDK8:
+ * {@code @RequiredArgsConstructor(onConstructor_={@AnnotationsGohere})} // note the underscore after {@code onConstructor}.
*/
AnyAnnotation[] onConstructor() default {};
@@ -58,16 +63,6 @@ public @interface RequiredArgsConstructor {
*/
AccessLevel access() default lombok.AccessLevel.PUBLIC;
- /**
- * Constructors are generated with the {@link java.beans.ConstructorProperties} annotation.
- * However, this annotation is new in 1.6 which means those compiling for 1.5 will need
- * to set this value to true.
- *
- * @deprecated THIS FEATURE WILL BE REMOVED after March 31st 2015. Use configuration key {@link ConfigurationKeys#ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES} instead.
- */
- @Deprecated
- boolean suppressConstructorProperties() default false;
-
/**
* Placeholder annotation to enable the placement of annotations on the generated code.
* @deprecated Don't use this annotation, ever - Read the documentation.
diff --git a/src/core/lombok/Setter.java b/src/core/lombok/Setter.java
index ba9e9759..f2ebe5b3 100644
--- a/src/core/lombok/Setter.java
+++ b/src/core/lombok/Setter.java
@@ -59,12 +59,22 @@ public @interface Setter {
lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
/**
- * Any annotations listed here are put on the generated method. The syntax for this feature is: {@code @Setter(onMethod=@__({@AnnotationsGoHere}))}
+ * Any annotations listed here are put on the generated method.
+ * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).
+ * up to JDK7:
+ * {@code @Setter(onMethod=@__({@AnnotationsGoHere}))}
+ * from JDK8:
+ * {@code @Setter(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}.
*/
AnyAnnotation[] onMethod() default {};
/**
- * Any annotations listed here are put on the generated method's parameter. The syntax for this feature is: {@code @Setter(onParam=@__({@AnnotationsGoHere}))}
+ * Any annotations listed here are put on the generated method's parameter.
+ * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).
+ * up to JDK7:
+ * {@code @Setter(onParam=@__({@AnnotationsGoHere}))}
+ * from JDK8:
+ * {@code @Setter(onParam_={@AnnotationsGohere})} // note the underscore after {@code onParam}.
*/
AnyAnnotation[] onParam() default {};
diff --git a/src/core/lombok/core/Version.java b/src/core/lombok/core/Version.java
index 4fdb7216..a50b72d5 100644
--- a/src/core/lombok/core/Version.java
+++ b/src/core/lombok/core/Version.java
@@ -30,7 +30,7 @@ public class Version {
// ** CAREFUL ** - this class must always compile with 0 dependencies (it must not refer to any other sources or libraries).
// Note: In 'X.Y.Z', if Z is odd, its a snapshot build built from the repository, so many different 0.10.3 versions can exist, for example.
// Official builds always end in an even number. (Since 0.10.2).
- private static final String VERSION = "1.16.13";
+ private static final String VERSION = "1.16.15";
private static final String RELEASE_NAME = "Edgy Guinea Pig";
// private static final String RELEASE_NAME = "Candid Duck";
diff --git a/src/core/lombok/core/handlers/HandlerUtil.java b/src/core/lombok/core/handlers/HandlerUtil.java
index a05578d4..6c3a0b79 100644
--- a/src/core/lombok/core/handlers/HandlerUtil.java
+++ b/src/core/lombok/core/handlers/HandlerUtil.java
@@ -109,8 +109,9 @@ public class HandlerUtil {
}
}
- public static boolean shouldAddGenerated(LombokNode, ?, ?> node, ConfigurationKey key) {
- Boolean add = node.getAst().readConfiguration(key);
+ @SuppressWarnings("deprecation")
+ public static boolean shouldAddGenerated(LombokNode, ?, ?> node) {
+ Boolean add = node.getAst().readConfiguration(ConfigurationKeys.ADD_JAVAX_GENERATED_ANNOTATIONS);
if (add != null) return add;
return !Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_GENERATED_ANNOTATIONS));
}
diff --git a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
index f822e095..4726b17e 100644
--- a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
+++ b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
@@ -1345,10 +1345,10 @@ public class EclipseHandlerUtil {
public static Annotation[] addGenerated(EclipseNode node, ASTNode source, Annotation[] originalAnnotationArray) {
Annotation[] result = originalAnnotationArray;
- if (HandlerUtil.shouldAddGenerated(node, ConfigurationKeys.ADD_JAVAX_GENERATED_ANNOTATIONS)) {
+ if (HandlerUtil.shouldAddGenerated(node)) {
result = addAnnotation(source, result, JAVAX_ANNOTATION_GENERATED, new StringLiteral(LOMBOK, 0, 0, 0));
}
- if (HandlerUtil.shouldAddGenerated(node, ConfigurationKeys.ADD_LOMBOK_GENERATED_ANNOTATIONS)) {
+ if (Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_LOMBOK_GENERATED_ANNOTATIONS))) {
result = addAnnotation(source, result, LOMBOK_GENERATED, null);
}
return result;
@@ -1616,6 +1616,14 @@ public class EclipseHandlerUtil {
return true;
}
+ public static void addError(String errorName, EclipseNode node) {
+ if (node.getLatestJavaSpecSupported() < 8) {
+ node.addError("The correct format is " + errorName + "_={@SomeAnnotation, @SomeOtherAnnotation})");
+ } else {
+ node.addError("The correct format is " + errorName + "=@__({@SomeAnnotation, @SomeOtherAnnotation}))");
+ }
+ }
+
public static List unboxAndRemoveAnnotationParameter(Annotation annotation, String annotationName, String errorName, EclipseNode errorNode) {
if ("value".equals(annotationName)) {
// We can't unbox this, because SingleMemberAnnotation REQUIRES a value, and this method
@@ -1638,51 +1646,70 @@ public class EclipseHandlerUtil {
char[] nameAsCharArray = annotationName.toCharArray();
+ top:
for (int i = 0; i < pairs.length; i++) {
- if (pairs[i].name == null || !Arrays.equals(nameAsCharArray, pairs[i].name)) continue;
+ boolean allowRaw;
+ char[] name = pairs[i].name;
+ if (name == null) continue;
+ if (name.length < nameAsCharArray.length) continue;
+ for (int j = 0; j < nameAsCharArray.length; j++) {
+ if (name[j] != nameAsCharArray[j]) continue top;
+ }
+ allowRaw = name.length > nameAsCharArray.length;
+ for (int j = nameAsCharArray.length; j < name.length; j++) {
+ if (name[j] != '_') continue top;
+ }
+ // If we're still here it's the targeted annotation param.
Expression value = pairs[i].value;
MemberValuePair[] newPairs = new MemberValuePair[pairs.length - 1];
if (i > 0) System.arraycopy(pairs, 0, newPairs, 0, i);
if (i < pairs.length - 1) System.arraycopy(pairs, i + 1, newPairs, i, pairs.length - i - 1);
normalAnnotation.memberValuePairs = newPairs;
- // We have now removed the annotation parameter and stored '@__({... annotations ...})',
- // which we must now unbox.
- if (!(value instanceof Annotation)) {
- errorNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
- return Collections.emptyList();
- }
-
- Annotation atDummyIdentifier = (Annotation) value;
- if (!(atDummyIdentifier.type instanceof SingleTypeReference) ||
- !isAllValidOnXCharacters(((SingleTypeReference) atDummyIdentifier.type).token)) {
- errorNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
- return Collections.emptyList();
- }
-
- if (atDummyIdentifier instanceof MarkerAnnotation) {
- // It's @Getter(onMethod=@__). This is weird, but fine.
- return Collections.emptyList();
- }
+ // We have now removed the annotation parameter and stored the value,
+ // which we must now unbox. It's either annotations, or @__(annotations).
Expression content = null;
- if (atDummyIdentifier instanceof NormalAnnotation) {
- MemberValuePair[] mvps = ((NormalAnnotation) atDummyIdentifier).memberValuePairs;
- if (mvps == null || mvps.length == 0) {
- // It's @Getter(onMethod=@__()). This is weird, but fine.
+ if (value instanceof ArrayInitializer) {
+ if (!allowRaw) {
+ addError(errorName, errorNode);
return Collections.emptyList();
}
- if (mvps.length == 1 && Arrays.equals("value".toCharArray(), mvps[0].name)) {
- content = mvps[0].value;
+ content = value;
+ } else if (!(value instanceof Annotation)) {
+ addError(errorName, errorNode);
+ return Collections.emptyList();
+ } else {
+ Annotation atDummyIdentifier = (Annotation) value;
+ if (atDummyIdentifier.type instanceof SingleTypeReference && isAllValidOnXCharacters(((SingleTypeReference) atDummyIdentifier.type).token)) {
+ if (atDummyIdentifier instanceof MarkerAnnotation) {
+ return Collections.emptyList();
+ } else if (atDummyIdentifier instanceof NormalAnnotation) {
+ MemberValuePair[] mvps = ((NormalAnnotation) atDummyIdentifier).memberValuePairs;
+ if (mvps == null || mvps.length == 0) {
+ return Collections.emptyList();
+ }
+ if (mvps.length == 1 && Arrays.equals("value".toCharArray(), mvps[0].name)) {
+ content = mvps[0].value;
+ }
+ } else if (atDummyIdentifier instanceof SingleMemberAnnotation) {
+ content = ((SingleMemberAnnotation) atDummyIdentifier).memberValue;
+ } else {
+ addError(errorName, errorNode);
+ return Collections.emptyList();
+ }
+ } else {
+ if (allowRaw) {
+ content = atDummyIdentifier;
+ } else {
+ addError(errorName, errorNode);
+ return Collections.emptyList();
+ }
}
}
- if (atDummyIdentifier instanceof SingleMemberAnnotation) {
- content = ((SingleMemberAnnotation) atDummyIdentifier).memberValue;
- }
-
if (content == null) {
- errorNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
+ addError(errorName, errorNode);
return Collections.emptyList();
}
@@ -1694,13 +1721,13 @@ public class EclipseHandlerUtil {
if (expressions != null) for (Expression ex : expressions) {
if (ex instanceof Annotation) result.add((Annotation) ex);
else {
- errorNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
+ addError(errorName, errorNode);
return Collections.emptyList();
}
}
return result;
} else {
- errorNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
+ addError(errorName, errorNode);
return Collections.emptyList();
}
}
diff --git a/src/core/lombok/eclipse/handlers/HandleBuilder.java b/src/core/lombok/eclipse/handlers/HandleBuilder.java
index 74ef57a7..58e08b0d 100644
--- a/src/core/lombok/eclipse/handlers/HandleBuilder.java
+++ b/src/core/lombok/eclipse/handlers/HandleBuilder.java
@@ -205,7 +205,7 @@ public class HandleBuilder extends EclipseAnnotationHandler {
}
boolean callBuilderBasedSuperConstructor = inherit && td.superclass != null;
- new HandleConstructor().generateConstructor(tdParent, AccessLevel.PROTECTED, allFields, false, null, SkipIfConstructorExists.I_AM_BUILDER, true,
+ new HandleConstructor().generateConstructor(tdParent, extendable ? AccessLevel.PROTECTED : AccessLevel.PACKAGE, allFields, false, null, SkipIfConstructorExists.I_AM_BUILDER,
Collections.emptyList(), annotationNode, extendable ? builderClassName : null, callBuilderBasedSuperConstructor);
returnType = namePlusTypeParamsToTypeReference(td.name, td.typeParameters, p);
@@ -426,7 +426,7 @@ public class HandleBuilder extends EclipseAnnotationHandler {
if (constructorExists(builderType) == MemberExistsResult.NOT_EXISTS) {
ConstructorDeclaration cd = HandleConstructor.createConstructor(
- AccessLevel.PACKAGE, builderType, Collections.emptyList(), false, null,
+ AccessLevel.PACKAGE, builderType, Collections.emptyList(), false,
annotationNode, Collections.emptyList(), null, false);
if (cd != null) injectMethod(builderType, cd);
}
diff --git a/src/core/lombok/eclipse/handlers/HandleConstructor.java b/src/core/lombok/eclipse/handlers/HandleConstructor.java
index eb11e6e4..a8b823b2 100644
--- a/src/core/lombok/eclipse/handlers/HandleConstructor.java
+++ b/src/core/lombok/eclipse/handlers/HandleConstructor.java
@@ -95,9 +95,9 @@ public class HandleConstructor {
boolean force = ann.force();
List fields = force ? findFinalFields(typeNode) : Collections.emptyList();
- List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@NoArgsConstructor(onConstructor=", annotationNode);
+ List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@NoArgsConstructor(onConstructor", annotationNode);
- new HandleConstructor().generateConstructor(typeNode, level, fields, force, staticName, SkipIfConstructorExists.NO, null, onConstructor, annotationNode, null, false);
+ new HandleConstructor().generateConstructor(typeNode, level, fields, force, staticName, SkipIfConstructorExists.NO, onConstructor, annotationNode, null, false);
}
}
@@ -112,18 +112,15 @@ public class HandleConstructor {
AccessLevel level = ann.access();
if (level == AccessLevel.NONE) return;
String staticName = ann.staticName();
- Boolean suppressConstructorProperties = null;
if (annotation.isExplicit("suppressConstructorProperties")) {
- @SuppressWarnings("deprecation")
- boolean suppress = ann.suppressConstructorProperties();
- suppressConstructorProperties = suppress;
+ annotationNode.addError("This deprecated feature is no longer supported. Remove it; you can create a lombok.config file with 'lombok.anyConstructor.suppressConstructorProperties = true'.");
}
- List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@RequiredArgsConstructor(onConstructor=", annotationNode);
+ List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@RequiredArgsConstructor(onConstructor", annotationNode);
new HandleConstructor().generateConstructor(
typeNode, level, findRequiredFields(typeNode), false, staticName, SkipIfConstructorExists.NO,
- suppressConstructorProperties, onConstructor, annotationNode, null, false);
+ onConstructor, annotationNode, null, false);
}
}
@@ -174,18 +171,15 @@ public class HandleConstructor {
AccessLevel level = ann.access();
if (level == AccessLevel.NONE) return;
String staticName = ann.staticName();
- Boolean suppressConstructorProperties = null;
if (annotation.isExplicit("suppressConstructorProperties")) {
- @SuppressWarnings("deprecation")
- boolean suppress = ann.suppressConstructorProperties();
- suppressConstructorProperties = suppress;
+ annotationNode.addError("This deprecated feature is no longer supported. Remove it; you can create a lombok.config file with 'lombok.anyConstructor.suppressConstructorProperties = true'.");
}
- List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@AllArgsConstructor(onConstructor=", annotationNode);
+ List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@AllArgsConstructor(onConstructor", annotationNode);
new HandleConstructor().generateConstructor(
typeNode, level, findAllFields(typeNode), false, staticName, SkipIfConstructorExists.NO,
- suppressConstructorProperties, onConstructor, annotationNode, null, false);
+ onConstructor, annotationNode, null, false);
}
}
@@ -207,14 +201,14 @@ public class HandleConstructor {
EclipseNode typeNode, AccessLevel level, String staticName, SkipIfConstructorExists skipIfConstructorExists,
List onConstructor, EclipseNode sourceNode) {
- generateConstructor(typeNode, level, findRequiredFields(typeNode), false, staticName, skipIfConstructorExists, null, onConstructor, sourceNode, null, false);
+ generateConstructor(typeNode, level, findRequiredFields(typeNode), false, staticName, skipIfConstructorExists, onConstructor, sourceNode, null, false);
}
public void generateAllArgsConstructor(
EclipseNode typeNode, AccessLevel level, String staticName, SkipIfConstructorExists skipIfConstructorExists,
List onConstructor, EclipseNode sourceNode) {
- generateConstructor(typeNode, level, findAllFields(typeNode), false, staticName, skipIfConstructorExists, null, onConstructor, sourceNode, null, false);
+ generateConstructor(typeNode, level, findAllFields(typeNode), false, staticName, skipIfConstructorExists, onConstructor, sourceNode, null, false);
}
public enum SkipIfConstructorExists {
@@ -234,7 +228,7 @@ public class HandleConstructor {
*/
public void generateConstructor(
EclipseNode typeNode, AccessLevel level, List fields, boolean allToDefault, String staticName, SkipIfConstructorExists skipIfConstructorExists,
- Boolean suppressConstructorProperties, List onConstructor, EclipseNode sourceNode, String builderClassnameAsParameter, boolean callBuilderBasedSuperConstructor) {
+ List onConstructor, EclipseNode sourceNode, String builderClassnameAsParameter, boolean callBuilderBasedSuperConstructor) {
ASTNode source = sourceNode.get();
boolean staticConstrRequired = staticName != null && !staticName.equals("");
@@ -269,7 +263,7 @@ public class HandleConstructor {
ConstructorDeclaration constr = createConstructor(
staticConstrRequired ? AccessLevel.PRIVATE : level, typeNode, fields, allToDefault,
- suppressConstructorProperties, sourceNode, onConstructor, builderClassnameAsParameter, callBuilderBasedSuperConstructor);
+ sourceNode, onConstructor, builderClassnameAsParameter, callBuilderBasedSuperConstructor);
injectMethod(typeNode, constr);
if (staticConstrRequired) {
MethodDeclaration staticConstr = createStaticConstructor(level, staticName, typeNode, allToDefault ? Collections.emptyList() : fields, source);
@@ -322,7 +316,7 @@ public class HandleConstructor {
*/
public static ConstructorDeclaration createConstructor(
AccessLevel level, EclipseNode type, Collection fields, boolean allToDefault,
- Boolean suppressConstructorProperties, EclipseNode sourceNode, List onConstructor,
+ EclipseNode sourceNode, List onConstructor,
String builderClassnameAsParameter, boolean callBuilderBasedSuperConstructor) {
if (builderClassnameAsParameter != null && builderClassnameAsParameter.isEmpty()) {
@@ -340,12 +334,11 @@ public class HandleConstructor {
if (isEnum) level = AccessLevel.PRIVATE;
- if (suppressConstructorProperties == null) {
- if (fields.isEmpty()) {
- suppressConstructorProperties = false;
- } else {
- suppressConstructorProperties = Boolean.TRUE.equals(type.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));
- }
+ boolean suppressConstructorProperties;
+ if (fields.isEmpty()) {
+ suppressConstructorProperties = false;
+ } else {
+ suppressConstructorProperties = Boolean.TRUE.equals(type.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));
}
ConstructorDeclaration constructor = new ConstructorDeclaration(((CompilationUnitDeclaration) type.top().get()).compilationResult);
diff --git a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
index a56eee89..ceef3d3c 100644
--- a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
+++ b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
@@ -67,6 +67,7 @@ import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.NameReference;
import org.eclipse.jdt.internal.compiler.ast.NullLiteral;
import org.eclipse.jdt.internal.compiler.ast.OperatorIds;
+import org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;
import org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;
import org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;
import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
@@ -128,7 +129,7 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler includes = Arrays.asList(ann.of());
EclipseNode typeNode = annotationNode.up();
- List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@EqualsAndHashCode(onParam=", annotationNode);
+ List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@EqualsAndHashCode(onParam", annotationNode);
checkForBogusFieldNames(typeNode, annotation);
Boolean callSuper = ann.callSuper();
@@ -458,7 +459,14 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler list = new ArrayList();
list.add(type.getName());
EclipseNode tNode = type.up();
@@ -468,21 +476,44 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler fields, boolean callSuper, ASTNode source, FieldAccess fieldAccess, boolean needsCanEqual, List onParam) {
int pS = source.sourceStart; int pE = source.sourceEnd;
long p = (long)pS << 32 | pE;
- TypeDeclaration typeDecl = (TypeDeclaration)type.get();
MethodDeclaration method = new MethodDeclaration(
((CompilationUnitDeclaration) type.top().get()).compilationResult);
@@ -528,7 +559,7 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler other = (MyType>) o; */ {
+ /* Outer.Inner.MyType> other = (Outer.Inner.MyType>) o; */ {
if (!fields.isEmpty() || needsCanEqual) {
LocalDeclaration other = new LocalDeclaration(otherName, pS, pE);
other.modifiers |= ClassFileConstants.AccFinal;
setGeneratedBy(other, source);
- char[] typeName = typeDecl.name;
- TypeReference targetType;
- if (typeDecl.typeParameters == null || typeDecl.typeParameters.length == 0) {
- targetType = new SingleTypeReference(typeName, p);
- setGeneratedBy(targetType, source);
- other.type = new SingleTypeReference(typeName, p);
- setGeneratedBy(other.type, source);
- } else {
- TypeReference[] typeArgs = new TypeReference[typeDecl.typeParameters.length];
- for (int i = 0; i < typeArgs.length; i++) {
- typeArgs[i] = new Wildcard(Wildcard.UNBOUND);
- typeArgs[i].sourceStart = pS; typeArgs[i].sourceEnd = pE;
- setGeneratedBy(typeArgs[i], source);
- }
- targetType = new ParameterizedSingleTypeReference(typeName, typeArgs, 0, p);
- setGeneratedBy(targetType, source);
- other.type = new ParameterizedSingleTypeReference(typeName, copyTypes(typeArgs, source), 0, p);
- setGeneratedBy(other.type, source);
- }
+ TypeReference targetType = createTypeReference(type, p, source, true);
+ setGeneratedBy(targetType, source);
+ other.type = createTypeReference(type, p, source, true);
+ setGeneratedBy(other.type, source);
NameReference oRef = new SingleNameReference(new char[] { 'o' }, p);
setGeneratedBy(oRef, source);
other.initialization = makeCastExpression(oRef, targetType, source);
@@ -772,7 +788,7 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler {
if (node == null) return;
- List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Getter(onMethod=", annotationNode);
+ List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Getter(onMethod", annotationNode);
switch (node.getKind()) {
case FIELD:
diff --git a/src/core/lombok/eclipse/handlers/HandleSetter.java b/src/core/lombok/eclipse/handlers/HandleSetter.java
index 1fcf751d..7e7ea121 100644
--- a/src/core/lombok/eclipse/handlers/HandleSetter.java
+++ b/src/core/lombok/eclipse/handlers/HandleSetter.java
@@ -125,8 +125,8 @@ public class HandleSetter extends EclipseAnnotationHandler {
AccessLevel level = annotation.getInstance().value();
if (level == AccessLevel.NONE || node == null) return;
- List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Setter(onMethod=", annotationNode);
- List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@Setter(onParam=", annotationNode);
+ List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Setter(onMethod", annotationNode);
+ List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@Setter(onParam", annotationNode);
switch (node.getKind()) {
case FIELD:
diff --git a/src/core/lombok/eclipse/handlers/HandleUtilityClass.java b/src/core/lombok/eclipse/handlers/HandleUtilityClass.java
index 199ce102..959c1d20 100644
--- a/src/core/lombok/eclipse/handlers/HandleUtilityClass.java
+++ b/src/core/lombok/eclipse/handlers/HandleUtilityClass.java
@@ -49,6 +49,7 @@ import org.mangosdk.spi.ProviderFor;
import lombok.ConfigurationKeys;
import lombok.core.AnnotationValues;
+import lombok.core.HandlerPriority;
import lombok.core.AST.Kind;
import lombok.eclipse.EclipseAnnotationHandler;
import lombok.eclipse.EclipseNode;
@@ -57,6 +58,7 @@ import lombok.experimental.UtilityClass;
/**
* Handles the {@code lombok.experimental.UtilityClass} annotation for eclipse.
*/
+@HandlerPriority(-4096) //-2^12; to ensure @FieldDefaults picks up on the 'static' we set here.
@ProviderFor(EclipseAnnotationHandler.class)
public class HandleUtilityClass extends EclipseAnnotationHandler {
@Override public void handle(AnnotationValues annotation, Annotation ast, EclipseNode annotationNode) {
diff --git a/src/core/lombok/eclipse/handlers/HandleWither.java b/src/core/lombok/eclipse/handlers/HandleWither.java
index d8ac8df6..200ebde7 100644
--- a/src/core/lombok/eclipse/handlers/HandleWither.java
+++ b/src/core/lombok/eclipse/handlers/HandleWither.java
@@ -127,8 +127,8 @@ public class HandleWither extends EclipseAnnotationHandler {
AccessLevel level = annotation.getInstance().value();
if (level == AccessLevel.NONE || node == null) return;
- List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Wither(onMethod=", annotationNode);
- List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@Wither(onParam=", annotationNode);
+ List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Wither(onMethod", annotationNode);
+ List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@Wither(onParam", annotationNode);
switch (node.getKind()) {
case FIELD:
diff --git a/src/core/lombok/experimental/Wither.java b/src/core/lombok/experimental/Wither.java
index b4131187..3fb767d1 100644
--- a/src/core/lombok/experimental/Wither.java
+++ b/src/core/lombok/experimental/Wither.java
@@ -60,12 +60,22 @@ public @interface Wither {
AccessLevel value() default AccessLevel.PUBLIC;
/**
- * Any annotations listed here are put on the generated method. The syntax for this feature is: {@code @Setter(onMethod=@__({@AnnotationsGoHere}))}
+ * Any annotations listed here are put on the generated method.
+ * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).
+ * up to JDK7:
+ * {@code @Wither(onMethod=@__({@AnnotationsGoHere}))}
+ * from JDK8:
+ * {@code @Wither(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}.
*/
AnyAnnotation[] onMethod() default {};
/**
- * Any annotations listed here are put on the generated method's parameter. The syntax for this feature is: {@code @Setter(onParam=@__({@AnnotationsGoHere}))}
+ * Any annotations listed here are put on the generated method's parameter.
+ * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).
+ * up to JDK7:
+ * {@code @Wither(onParam=@__({@AnnotationsGoHere}))}
+ * from JDK8:
+ * {@code @Wither(onParam_={@AnnotationsGohere})} // note the underscore after {@code onParam}.
*/
AnyAnnotation[] onParam() default {};
diff --git a/src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java b/src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java
new file mode 100644
index 00000000..f9fe2a7d
--- /dev/null
+++ b/src/core/lombok/javac/apt/Javac9BaseFileObjectWrapper.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2010-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
+ * 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.javac.apt;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.URI;
+import java.nio.file.Path;
+
+import javax.lang.model.element.Modifier;
+import javax.lang.model.element.NestingKind;
+
+import com.sun.tools.javac.file.BaseFileManager;
+
+class Javac9BaseFileObjectWrapper extends com.sun.tools.javac.file.PathFileObject {
+ private final LombokFileObject delegate;
+
+ public Javac9BaseFileObjectWrapper(BaseFileManager fileManager, Path path, LombokFileObject delegate) {
+ super(fileManager, path);
+ this.delegate = delegate;
+ }
+
+ @Override public boolean isNameCompatible(String simpleName, Kind kind) {
+ return delegate.isNameCompatible(simpleName, kind);
+ }
+
+ @Override public URI toUri() {
+ return delegate.toUri();
+ }
+
+ @SuppressWarnings("all")
+ @Override public String getName() {
+ return delegate.getName();
+ }
+
+ @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
+ return delegate.getCharContent(ignoreEncodingErrors);
+ }
+
+ @Override public InputStream openInputStream() throws IOException {
+ return delegate.openInputStream();
+ }
+
+ @Override public Reader openReader(boolean ignoreEncodingErrors) throws IOException {
+ return delegate.openReader(ignoreEncodingErrors);
+ }
+
+ @Override public Writer openWriter() throws IOException {
+ return delegate.openWriter();
+ }
+
+ @Override public OutputStream openOutputStream() throws IOException {
+ return delegate.openOutputStream();
+ }
+
+ @Override public long getLastModified() {
+ return delegate.getLastModified();
+ }
+
+ @Override public boolean delete() {
+ return delegate.delete();
+ }
+
+ @Override public Kind getKind() {
+ return delegate.getKind();
+ }
+
+ @Override public NestingKind getNestingKind() {
+ return delegate.getNestingKind();
+ }
+
+ @Override public Modifier getAccessLevel() {
+ return delegate.getAccessLevel();
+ }
+
+ @Override public boolean equals(Object obj) {
+ if (!(obj instanceof Javac9BaseFileObjectWrapper)) {
+ return false;
+ }
+ return delegate.equals(((Javac9BaseFileObjectWrapper)obj).delegate);
+ }
+
+ @Override public int hashCode() {
+ return delegate.hashCode();
+ }
+
+ @Override public String toString() {
+ return delegate.toString();
+ }
+}
\ No newline at end of file
diff --git a/src/core/lombok/javac/apt/LombokFileObjects.java b/src/core/lombok/javac/apt/LombokFileObjects.java
index 412e449b..7e818cab 100644
--- a/src/core/lombok/javac/apt/LombokFileObjects.java
+++ b/src/core/lombok/javac/apt/LombokFileObjects.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010-2011 The Project Lombok Authors.
+ * Copyright (C) 2010-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
@@ -23,19 +23,24 @@
package lombok.javac.apt;
import java.lang.reflect.Method;
+import java.net.URI;
+import java.nio.file.Paths;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileObject.Kind;
+import com.sun.tools.javac.file.BaseFileManager;
+
import lombok.core.DiagnosticsReceiver;
//Can't use SimpleJavaFileObject so we copy/paste most of its content here, because javac doesn't follow the interface,
//and casts to its own BaseFileObject type. D'oh!
final class LombokFileObjects {
- enum Compiler {
- JAVAC6 {
+
+ interface Compiler {
+ Compiler JAVAC6 = new Compiler() {
private Method decoderMethod = null;
private final AtomicBoolean decoderIsSet = new AtomicBoolean();
@@ -46,13 +51,13 @@ final class LombokFileObjects {
@Override public Method getDecoderMethod() {
synchronized (decoderIsSet) {
if (decoderIsSet.get()) return decoderMethod;
- decoderMethod = getDecoderMethod("com.sun.tools.javac.util.BaseFileObject");
+ decoderMethod = LombokFileObjects.getDecoderMethod("com.sun.tools.javac.util.BaseFileObject");
decoderIsSet.set(true);
return decoderMethod;
}
}
- },
- JAVAC7 {
+ };
+ Compiler JAVAC7 = new Compiler() {
private Method decoderMethod = null;
private final AtomicBoolean decoderIsSet = new AtomicBoolean();
@@ -63,28 +68,28 @@ final class LombokFileObjects {
@Override public Method getDecoderMethod() {
synchronized (decoderIsSet) {
if (decoderIsSet.get()) return decoderMethod;
- decoderMethod = getDecoderMethod("com.sun.tools.javac.file.BaseFileObject");
+ decoderMethod = LombokFileObjects.getDecoderMethod("com.sun.tools.javac.file.BaseFileObject");
decoderIsSet.set(true);
return decoderMethod;
}
}
};
- static Method getDecoderMethod(String className) {
- Method m = null;
- try {
- m = Class.forName(className).getDeclaredMethod("getDecoder", boolean.class);
- m.setAccessible(true);
- } catch (NoSuchMethodException e) {
- // Intentional fallthrough - getDecoder(boolean) is not always present.
- } catch (ClassNotFoundException e) {
- // Intentional fallthrough - getDecoder(boolean) is not always present.
- }
- return m;
- }
+ JavaFileObject wrap(LombokFileObject fileObject);
+ Method getDecoderMethod();
+ }
- abstract JavaFileObject wrap(LombokFileObject fileObject);
- abstract Method getDecoderMethod();
+ static Method getDecoderMethod(String className) {
+ Method m = null;
+ try {
+ m = Class.forName(className).getDeclaredMethod("getDecoder", boolean.class);
+ m.setAccessible(true);
+ } catch (NoSuchMethodException e) {
+ // Intentional fallthrough - getDecoder(boolean) is not always present.
+ } catch (ClassNotFoundException e) {
+ // Intentional fallthrough - getDecoder(boolean) is not always present.
+ }
+ return m;
}
private LombokFileObjects() {}
@@ -93,7 +98,16 @@ final class LombokFileObjects {
String jfmClassName = jfm != null ? jfm.getClass().getName() : "null";
if (jfmClassName.equals("com.sun.tools.javac.util.DefaultFileManager")) return Compiler.JAVAC6;
if (jfmClassName.equals("com.sun.tools.javac.util.JavacFileManager")) return Compiler.JAVAC6;
- if (jfmClassName.equals("com.sun.tools.javac.file.JavacFileManager")) return Compiler.JAVAC7;
+ if (jfmClassName.equals("com.sun.tools.javac.file.JavacFileManager")) {
+ try {
+ Class> superType = Class.forName("com.sun.tools.javac.file.BaseFileManager");
+ if (superType.isInstance(jfm)) {
+ return new Java9Compiler(jfm);
+ }
+ }
+ catch (Exception e) {}
+ return Compiler.JAVAC7;
+ }
try {
if (Class.forName("com.sun.tools.javac.file.BaseFileObject") == null) throw new NullPointerException();
return Compiler.JAVAC7;
@@ -112,4 +126,24 @@ final class LombokFileObjects {
static JavaFileObject createIntercepting(Compiler compiler, JavaFileObject delegate, String fileName, DiagnosticsReceiver diagnostics) {
return compiler.wrap(new InterceptingJavaFileObject(delegate, fileName, diagnostics, compiler.getDecoderMethod()));
}
+
+ static class Java9Compiler implements Compiler {
+ private final BaseFileManager fileManager;
+
+ public Java9Compiler(JavaFileManager jfm) {
+ fileManager = (BaseFileManager) jfm;
+ }
+
+ @Override public JavaFileObject wrap(LombokFileObject fileObject) {
+ URI uri = fileObject.toUri();
+ if (uri.getScheme() == null) {
+ uri = URI.create("file://" + uri);
+ }
+ return new Javac9BaseFileObjectWrapper(fileManager, Paths.get(uri), fileObject);
+ }
+
+ @Override public Method getDecoderMethod() {
+ throw new UnsupportedOperationException();
+ }
+ }
}
diff --git a/src/core/lombok/javac/handlers/HandleBuilder.java b/src/core/lombok/javac/handlers/HandleBuilder.java
index 41ff64e0..43520656 100644
--- a/src/core/lombok/javac/handlers/HandleBuilder.java
+++ b/src/core/lombok/javac/handlers/HandleBuilder.java
@@ -178,7 +178,7 @@ public class HandleBuilder extends JavacAnnotationHandler {
}
boolean callBuilderBasedSuperConstructor = inherit && extendsClause != null;
- new HandleConstructor().generateConstructor(tdParent, AccessLevel.PROTECTED, List.nil(), allFields.toList(), false, null, SkipIfConstructorExists.I_AM_BUILDER, null, annotationNode, extendable ? builderClassName : null, callBuilderBasedSuperConstructor);
+ new HandleConstructor().generateConstructor(tdParent, AccessLevel.PROTECTED, List.nil(), allFields.toList(), false, null, SkipIfConstructorExists.I_AM_BUILDER, annotationNode, extendable ? builderClassName : null, callBuilderBasedSuperConstructor);
returnType = namePlusTypeParamsToTypeReference(tdParent.getTreeMaker(), td.name, td.typarams);
typeParams = td.typarams;
@@ -308,8 +308,7 @@ public class HandleBuilder extends JavacAnnotationHandler {
}
if (pos == -1 || tpOnType.size() <= pos) {
- annotationNode.addError("**" + returnType.getClass().toString());
-// annotationNode.addError("@Builder(toBuilder=true) requires that each type parameter on the static method is part of the typeargs of the return value. Type parameter " + tp.name + " is not part of the return type.");
+ annotationNode.addError("@Builder(toBuilder=true) requires that each type parameter on the static method is part of the typeargs of the return value. Type parameter " + tp.name + " is not part of the return type.");
return;
}
typeArgsForToBuilder.add(tpOnType.get(pos).name);
@@ -336,7 +335,7 @@ public class HandleBuilder extends JavacAnnotationHandler {
JavacNode builderType = findInnerClass(tdParent, builderClassName);
if (builderType == null) {
- builderType = makeBuilderClass(isStatic, tdParent, builderClassName, typeParams, ast, inherit ? superclassBuilderClassName : null);
+ builderType = makeBuilderClass(isStatic, annotationNode, tdParent, builderClassName, typeParams, ast, inherit ? superclassBuilderClassName : null);
} else {
JCClassDecl builderTypeDeclaration = (JCClassDecl) builderType.get();
if (isStatic && !builderTypeDeclaration.getModifiers().getFlags().contains(Modifier.STATIC)) {
@@ -358,7 +357,6 @@ public class HandleBuilder extends JavacAnnotationHandler {
}
}
}
-
}
for (BuilderFieldData bfd : builderFields) {
@@ -388,7 +386,7 @@ public class HandleBuilder extends JavacAnnotationHandler {
}
if (constructorExists(builderType) == MemberExistsResult.NOT_EXISTS) {
- JCMethodDecl cd = HandleConstructor.createConstructor(AccessLevel.PACKAGE, List.nil(), builderType, List.nil(), false, null, annotationNode, null, false);
+ JCMethodDecl cd = HandleConstructor.createConstructor(AccessLevel.PACKAGE, List.nil(), builderType, List.nil(), false, annotationNode, null, false);
if (cd != null) injectMethod(builderType, cd);
}
@@ -414,7 +412,7 @@ public class HandleBuilder extends JavacAnnotationHandler {
if (addCleaning) injectMethod(builderType, generateCleanMethod(builderFields, builderType, ast));
if (methodExists(builderMethodName, tdParent, -1) == MemberExistsResult.NOT_EXISTS) {
- JCMethodDecl md = generateBuilderMethod(isStatic, builderMethodName, builderClassName, tdParent, typeParams);
+ JCMethodDecl md = generateBuilderMethod(isStatic, builderMethodName, builderClassName, annotationNode, tdParent, typeParams);
recursiveSetGeneratedBy(md, ast, annotationNode.getContext());
if (md != null) injectMethod(tdParent, md);
}
@@ -605,7 +603,7 @@ public class HandleBuilder extends JavacAnnotationHandler {
return maker.MethodDef(maker.Modifiers(Flags.PUBLIC), type.toName(buildName), returnType, List.nil(), List.nil(), thrownExceptions, body, null);
}
- public JCMethodDecl generateBuilderMethod(boolean isStatic, String builderMethodName, String builderClassName, JavacNode type, List typeParams) {
+ public JCMethodDecl generateBuilderMethod(boolean isStatic, String builderMethodName, String builderClassName, JavacNode source, JavacNode type, List typeParams) {
JavacTreeMaker maker = type.getTreeMaker();
ListBuffer typeArgs = new ListBuffer();
@@ -619,7 +617,7 @@ public class HandleBuilder extends JavacAnnotationHandler {
JCBlock body = maker.Block(0, List.of(statement));
int modifiers = Flags.PUBLIC;
if (isStatic) modifiers |= Flags.STATIC;
- return maker.MethodDef(maker.Modifiers(modifiers), type.toName(builderMethodName), namePlusTypeParamsToTypeReference(maker, type.toName(builderClassName), typeParams), copyTypeParams(maker, typeParams), List.nil(), List.nil(), body, null);
+ return maker.MethodDef(maker.Modifiers(modifiers), type.toName(builderMethodName), namePlusTypeParamsToTypeReference(maker, type.toName(builderClassName), typeParams), copyTypeParams(source, typeParams), List.nil(), List.nil(), body, null);
}
public void generateBuilderFields(JavacNode builderType, java.util.List builderFields, JCTree source) {
@@ -684,7 +682,7 @@ public class HandleBuilder extends JavacAnnotationHandler {
return null;
}
- public JavacNode makeBuilderClass(boolean isStatic, JavacNode tdParent, String builderClassName, List typeParams, JCAnnotation ast, String parentBuilderClassName) {
+ public JavacNode makeBuilderClass(boolean isStatic, JavacNode source, JavacNode tdParent, String builderClassName, List typeParams, JCAnnotation ast, String parentBuilderClassName) {
JavacTreeMaker maker = tdParent.getTreeMaker();
int modifiers = Flags.PUBLIC;
if (isStatic) modifiers |= Flags.STATIC;
@@ -693,7 +691,7 @@ public class HandleBuilder extends JavacAnnotationHandler {
if (parentBuilderClassName != null) {
extending = maker.Ident(tdParent.toName(parentBuilderClassName));
}
- JCClassDecl builder = maker.ClassDef(mods, tdParent.toName(builderClassName), copyTypeParams(maker, typeParams), extending, List.nil(), List.nil());
+ JCClassDecl builder = maker.ClassDef(mods, tdParent.toName(builderClassName), copyTypeParams(source, typeParams), extending, List.nil(), List.nil());
return injectType(tdParent, builder);
}
diff --git a/src/core/lombok/javac/handlers/HandleConstructor.java b/src/core/lombok/javac/handlers/HandleConstructor.java
index 3481b2c3..06ac74bd 100644
--- a/src/core/lombok/javac/handlers/HandleConstructor.java
+++ b/src/core/lombok/javac/handlers/HandleConstructor.java
@@ -75,14 +75,14 @@ public class HandleConstructor {
deleteImportFromCompilationUnit(annotationNode, "lombok.AccessLevel");
JavacNode typeNode = annotationNode.up();
if (!checkLegality(typeNode, annotationNode, NoArgsConstructor.class.getSimpleName())) return;
- List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@NoArgsConstructor(onConstructor=", annotationNode);
+ List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@NoArgsConstructor(onConstructor", annotationNode);
NoArgsConstructor ann = annotation.getInstance();
AccessLevel level = ann.access();
if (level == AccessLevel.NONE) return;
String staticName = ann.staticName();
boolean force = ann.force();
List fields = force ? findFinalFields(typeNode) : List.nil();
- new HandleConstructor().generateConstructor(typeNode, level, onConstructor, fields, force, staticName, SkipIfConstructorExists.NO, null, annotationNode, null, false);
+ new HandleConstructor().generateConstructor(typeNode, level, onConstructor, fields, force, staticName, SkipIfConstructorExists.NO, annotationNode, null, false);
}
}
@@ -95,19 +95,16 @@ public class HandleConstructor {
deleteImportFromCompilationUnit(annotationNode, "lombok.AccessLevel");
JavacNode typeNode = annotationNode.up();
if (!checkLegality(typeNode, annotationNode, RequiredArgsConstructor.class.getSimpleName())) return;
- List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@RequiredArgsConstructor(onConstructor=", annotationNode);
+ List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@RequiredArgsConstructor(onConstructor", annotationNode);
RequiredArgsConstructor ann = annotation.getInstance();
AccessLevel level = ann.access();
if (level == AccessLevel.NONE) return;
String staticName = ann.staticName();
- Boolean suppressConstructorProperties = null;
if (annotation.isExplicit("suppressConstructorProperties")) {
- @SuppressWarnings("deprecation")
- boolean suppress = ann.suppressConstructorProperties();
- suppressConstructorProperties = suppress;
+ annotationNode.addError("This deprecated feature is no longer supported. Remove it; you can create a lombok.config file with 'lombok.anyConstructor.suppressConstructorProperties = true'.");
}
- new HandleConstructor().generateConstructor(typeNode, level, onConstructor, findRequiredFields(typeNode), false, staticName, SkipIfConstructorExists.NO, suppressConstructorProperties, annotationNode, null, false);
+ new HandleConstructor().generateConstructor(typeNode, level, onConstructor, findRequiredFields(typeNode), false, staticName, SkipIfConstructorExists.NO, annotationNode, null, false);
}
}
@@ -145,18 +142,15 @@ public class HandleConstructor {
deleteImportFromCompilationUnit(annotationNode, "lombok.AccessLevel");
JavacNode typeNode = annotationNode.up();
if (!checkLegality(typeNode, annotationNode, AllArgsConstructor.class.getSimpleName())) return;
- List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@AllArgsConstructor(onConstructor=", annotationNode);
+ List onConstructor = unboxAndRemoveAnnotationParameter(ast, "onConstructor", "@AllArgsConstructor(onConstructor", annotationNode);
AllArgsConstructor ann = annotation.getInstance();
AccessLevel level = ann.access();
if (level == AccessLevel.NONE) return;
String staticName = ann.staticName();
- Boolean suppressConstructorProperties = null;
if (annotation.isExplicit("suppressConstructorProperties")) {
- @SuppressWarnings("deprecation")
- boolean suppress = ann.suppressConstructorProperties();
- suppressConstructorProperties = suppress;
+ annotationNode.addError("This deprecated feature is no longer supported. Remove it; you can create a lombok.config file with 'lombok.anyConstructor.suppressConstructorProperties = true'.");
}
- new HandleConstructor().generateConstructor(typeNode, level, onConstructor, findAllFields(typeNode), false, staticName, SkipIfConstructorExists.NO, suppressConstructorProperties, annotationNode, null, false);
+ new HandleConstructor().generateConstructor(typeNode, level, onConstructor, findAllFields(typeNode), false, staticName, SkipIfConstructorExists.NO, annotationNode, null, false);
}
}
@@ -192,7 +186,7 @@ public class HandleConstructor {
}
public void generateRequiredArgsConstructor(JavacNode typeNode, AccessLevel level, String staticName, SkipIfConstructorExists skipIfConstructorExists, JavacNode source) {
- generateConstructor(typeNode, level, List.nil(), findRequiredFields(typeNode), false, staticName, skipIfConstructorExists, null, source, null, false);
+ generateConstructor(typeNode, level, List.nil(), findRequiredFields(typeNode), false, staticName, skipIfConstructorExists, source, null, false);
}
public enum SkipIfConstructorExists {
@@ -200,7 +194,7 @@ public class HandleConstructor {
}
public void generateAllArgsConstructor(JavacNode typeNode, AccessLevel level, String staticName, SkipIfConstructorExists skipIfConstructorExists, JavacNode source) {
- generateConstructor(typeNode, level, List.nil(), findAllFields(typeNode), false, staticName, skipIfConstructorExists, null, source, null, false);
+ generateConstructor(typeNode, level, List.nil(), findAllFields(typeNode), false, staticName, skipIfConstructorExists, source, null, false);
}
/**
@@ -214,7 +208,7 @@ public class HandleConstructor {
* constructor with the builder as argument. Requires
* {@code builderClassAsParameter != null}.
*/
- public void generateConstructor(JavacNode typeNode, AccessLevel level, List onConstructor, List fields, boolean allToDefault, String staticName, SkipIfConstructorExists skipIfConstructorExists, Boolean suppressConstructorProperties, JavacNode source, String builderClassnameAsParameter, boolean callBuilderBasedSuperConstructor) {
+ public void generateConstructor(JavacNode typeNode, AccessLevel level, List onConstructor, List fields, boolean allToDefault, String staticName, SkipIfConstructorExists skipIfConstructorExists, JavacNode source, String builderClassnameAsParameter, boolean callBuilderBasedSuperConstructor) {
boolean staticConstrRequired = staticName != null && !staticName.equals("");
if (skipIfConstructorExists != SkipIfConstructorExists.NO && constructorExists(typeNode) != MemberExistsResult.NOT_EXISTS) return;
@@ -243,7 +237,7 @@ public class HandleConstructor {
}
}
- JCMethodDecl constr = createConstructor(staticConstrRequired ? AccessLevel.PRIVATE : level, onConstructor, typeNode, fields, allToDefault, suppressConstructorProperties, source, builderClassnameAsParameter, callBuilderBasedSuperConstructor);
+ JCMethodDecl constr = createConstructor(staticConstrRequired ? AccessLevel.PRIVATE : level, onConstructor, typeNode, fields, allToDefault, source, builderClassnameAsParameter, callBuilderBasedSuperConstructor);
ListBuffer argTypes = new ListBuffer();
for (JavacNode fieldNode : fields) {
Type mirror = getMirrorForFieldType(fieldNode);
@@ -288,7 +282,7 @@ public class HandleConstructor {
* constructor with the builder as argument. Requires
* {@code builderClassnameAsParameter != null}.
*/
- public static JCMethodDecl createConstructor(AccessLevel level, List onConstructor, JavacNode typeNode, List fields, boolean allToDefault, Boolean suppressConstructorProperties, JavacNode source, String builderClassnameAsParameter, boolean callBuilderBasedSuperConstructor) {
+ public static JCMethodDecl createConstructor(AccessLevel level, List onConstructor, JavacNode typeNode, List fields, boolean allToDefault, JavacNode source, String builderClassnameAsParameter, boolean callBuilderBasedSuperConstructor) {
if (builderClassnameAsParameter != null && builderClassnameAsParameter.isEmpty()) {
builderClassnameAsParameter = null;
}
@@ -301,12 +295,12 @@ public class HandleConstructor {
boolean isEnum = (((JCClassDecl) typeNode.get()).mods.flags & Flags.ENUM) != 0;
if (isEnum) level = AccessLevel.PRIVATE;
- if (suppressConstructorProperties == null) {
- if (fields.isEmpty()) {
- suppressConstructorProperties = false;
- } else {
- suppressConstructorProperties = Boolean.TRUE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));
- }
+ boolean suppressConstructorProperties;
+
+ if (fields.isEmpty()) {
+ suppressConstructorProperties = false;
+ } else {
+ suppressConstructorProperties = Boolean.TRUE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));
}
ListBuffer nullChecks = new ListBuffer();
diff --git a/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java b/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
index f34b4f6b..6df56ed6 100644
--- a/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
+++ b/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
@@ -95,7 +95,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler excludes = List.from(ann.exclude());
List includes = List.from(ann.of());
JavacNode typeNode = annotationNode.up();
- List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@EqualsAndHashCode(onParam=", annotationNode);
+ List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@EqualsAndHashCode(onParam", annotationNode);
checkForBogusFieldNames(typeNode, annotation);
Boolean callSuper = ann.callSuper();
@@ -363,7 +363,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler list = new ArrayList();
list.add(type.getName());
JavacNode tNode = type.up();
@@ -372,20 +372,28 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler wildcards = new ListBuffer();
+ for (int i = 0 ; i < typeDecl.typarams.length() ; i++) {
+ wildcards.append(maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null));
+ }
+
+ return maker.TypeApply(chain, wildcards.toList());
}
public JCMethodDecl createEquals(JavacNode typeNode, List fields, boolean callSuper, FieldAccess fieldAccess, boolean needsCanEqual, JCTree source, List onParam) {
JavacTreeMaker maker = typeNode.getTreeMaker();
- JCClassDecl type = (JCClassDecl) typeNode.get();
Name oName = typeNode.toName("o");
Name otherName = typeNode.toName("other");
@@ -408,27 +416,13 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler other = (MyType>) o; */ {
+ /* Outer.Inner.MyType> other = (Outer.Inner.MyType>) o; */ {
if (!fields.isEmpty() || needsCanEqual) {
- final JCExpression selfType1, selfType2;
- ListBuffer wildcards1 = new ListBuffer();
- ListBuffer wildcards2 = new ListBuffer();
- for (int i = 0 ; i < type.typarams.length() ; i++) {
- wildcards1.append(maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null));
- wildcards2.append(maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null));
- }
-
- if (type.typarams.isEmpty()) {
- selfType1 = maker.Ident(type.name);
- selfType2 = maker.Ident(type.name);
- } else {
- selfType1 = maker.TypeApply(maker.Ident(type.name), wildcards1.toList());
- selfType2 = maker.TypeApply(maker.Ident(type.name), wildcards2.toList());
- }
+ final JCExpression selfType1 = createTypeReference(typeNode, true), selfType2 = createTypeReference(typeNode, true);
statements.append(
maker.VarDef(maker.Modifiers(finalFlag), otherName, selfType1, maker.TypeCast(selfType2, maker.Ident(oName))));
@@ -533,7 +527,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler params = List.of(maker.VarDef(maker.Modifiers(flags, onParam), otherName, objectType, null));
JCBlock body = maker.Block(0, List.of(
- maker.Return(maker.TypeTest(maker.Ident(otherName), createTypeReference(typeNode)))));
+ maker.Return(maker.TypeTest(maker.Ident(otherName), createTypeReference(typeNode, false)))));
return recursiveSetGeneratedBy(maker.MethodDef(mods, canEqualName, returnType, List.nil(), params, List.nil(), body, null), source, typeNode.getContext());
}
diff --git a/src/core/lombok/javac/handlers/HandleGetter.java b/src/core/lombok/javac/handlers/HandleGetter.java
index 60dbe8ee..5a2e1993 100644
--- a/src/core/lombok/javac/handlers/HandleGetter.java
+++ b/src/core/lombok/javac/handlers/HandleGetter.java
@@ -147,7 +147,7 @@ public class HandleGetter extends JavacAnnotationHandler {
if (node == null) return;
- List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Getter(onMethod=", annotationNode);
+ List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Getter(onMethod", annotationNode);
switch (node.getKind()) {
case FIELD:
diff --git a/src/core/lombok/javac/handlers/HandleSetter.java b/src/core/lombok/javac/handlers/HandleSetter.java
index 02cc3775..e766127a 100644
--- a/src/core/lombok/javac/handlers/HandleSetter.java
+++ b/src/core/lombok/javac/handlers/HandleSetter.java
@@ -129,8 +129,8 @@ public class HandleSetter extends JavacAnnotationHandler {
if (level == AccessLevel.NONE || node == null) return;
- List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Setter(onMethod=", annotationNode);
- List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@Setter(onParam=", annotationNode);
+ List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Setter(onMethod", annotationNode);
+ List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@Setter(onParam", annotationNode);
switch (node.getKind()) {
case FIELD:
diff --git a/src/core/lombok/javac/handlers/HandleUtilityClass.java b/src/core/lombok/javac/handlers/HandleUtilityClass.java
index 6d3ec63b..ee8081d6 100644
--- a/src/core/lombok/javac/handlers/HandleUtilityClass.java
+++ b/src/core/lombok/javac/handlers/HandleUtilityClass.java
@@ -44,6 +44,7 @@ import com.sun.tools.javac.util.Name;
import lombok.ConfigurationKeys;
import lombok.core.AST.Kind;
import lombok.core.AnnotationValues;
+import lombok.core.HandlerPriority;
import lombok.experimental.UtilityClass;
import lombok.javac.Javac;
import lombok.javac.JavacAnnotationHandler;
@@ -53,6 +54,7 @@ import lombok.javac.JavacTreeMaker;
/**
* Handles the {@code @UtilityClass} annotation for javac.
*/
+@HandlerPriority(-4096) //-2^12; to ensure @FieldDefaults picks up on the 'static' we set here.
@ProviderFor(JavacAnnotationHandler.class)
public class HandleUtilityClass extends JavacAnnotationHandler {
@Override public void handle(AnnotationValues annotation, JCAnnotation ast, JavacNode annotationNode) {
diff --git a/src/core/lombok/javac/handlers/HandleWither.java b/src/core/lombok/javac/handlers/HandleWither.java
index 8aec0240..987a3d34 100644
--- a/src/core/lombok/javac/handlers/HandleWither.java
+++ b/src/core/lombok/javac/handlers/HandleWither.java
@@ -131,8 +131,8 @@ public class HandleWither extends JavacAnnotationHandler {
if (level == AccessLevel.NONE || node == null) return;
- List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Wither(onMethod=", annotationNode);
- List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@Wither(onParam=", annotationNode);
+ List onMethod = unboxAndRemoveAnnotationParameter(ast, "onMethod", "@Wither(onMethod", annotationNode);
+ List onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@Wither(onParam", annotationNode);
switch (node.getKind()) {
case FIELD:
diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
index 0b4e839d..56e666f7 100644
--- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java
+++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
@@ -92,6 +92,7 @@ import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
import com.sun.tools.javac.tree.JCTree.JCWildcard;
import com.sun.tools.javac.tree.JCTree.TypeBoundKind;
+import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.tree.TreeScanner;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
@@ -894,16 +895,20 @@ public class JavacHandlerUtil {
static class ClassSymbolMembersField {
private static final Field membersField;
private static final Method removeMethod;
+ private static final Method enterMethod;
static {
Field f = null;
- Method m = null;
+ Method r = null;
+ Method e = null;
try {
f = ClassSymbol.class.getField("members_field");
- m = f.getType().getMethod("remove", Symbol.class);
- } catch (Exception e) {}
+ r = f.getType().getMethod("remove", Symbol.class);
+ e = f.getType().getMethod("enter", Symbol.class);
+ } catch (Exception ex) {}
membersField = f;
- removeMethod = m;
+ removeMethod = r;
+ enterMethod = e;
}
static void remove(ClassSymbol from, Symbol toRemove) {
@@ -914,6 +919,15 @@ public class JavacHandlerUtil {
removeMethod.invoke(scope, toRemove);
} catch (Exception e) {}
}
+
+ static void enter(ClassSymbol from, Symbol toEnter) {
+ if (from == null) return;
+ try {
+ Scope scope = (Scope) membersField.get(from);
+ if (scope == null) return;
+ enterMethod.invoke(scope, toEnter);
+ } catch (Exception e) {}
+ }
}
public static void injectMethod(JavacNode typeNode, JCMethodDecl method) {
@@ -959,7 +973,7 @@ public class JavacHandlerUtil {
if (typeMirror == null || paramTypes == null || returnType == null) return;
ClassSymbol cs = (ClassSymbol) typeMirror;
MethodSymbol methodSymbol = new MethodSymbol(access, methodName, new MethodType(paramTypes, returnType, List.nil(), Symtab.instance(context).methodClass), cs);
- cs.members_field.enter(methodSymbol);
+ ClassSymbolMembersField.enter(cs, methodSymbol);
}
/**
@@ -1025,10 +1039,10 @@ public class JavacHandlerUtil {
public static void addGenerated(JCModifiers mods, JavacNode node, int pos, JCTree source, Context context) {
if (!LombokOptionsFactory.getDelombokOptions(context).getFormatPreferences().generateGenerated()) return;
- if (HandlerUtil.shouldAddGenerated(node, ConfigurationKeys.ADD_JAVAX_GENERATED_ANNOTATIONS)) {
+ if (HandlerUtil.shouldAddGenerated(node)) {
addAnnotation(mods, node, pos, source, context, "javax.annotation.Generated", node.getTreeMaker().Literal("lombok"));
}
- if (HandlerUtil.shouldAddGenerated(node, ConfigurationKeys.ADD_LOMBOK_GENERATED_ANNOTATIONS)) {
+ if (Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_LOMBOK_GENERATED_ANNOTATIONS))) {
addAnnotation(mods, node, pos, source, context, "lombok.Generated", null);
}
}
@@ -1226,19 +1240,9 @@ public class JavacHandlerUtil {
ListBuffer params = new ListBuffer();
ListBuffer result = new ListBuffer();
- try {
- for (JCExpression arg : ast.args) {
- String argName = "value";
- if (arg instanceof JCAssign) {
- JCAssign as = (JCAssign) arg;
- argName = as.lhs.toString();
- }
- if (!argName.equals(parameterName)) continue;
- }
- } catch (Exception ignore) {}
-
outer:
for (JCExpression param : ast.args) {
+ boolean allowRaw;
String nameOfParam = "value";
JCExpression valueOfParam = null;
if (param instanceof JCAssign) {
@@ -1250,6 +1254,15 @@ public class JavacHandlerUtil {
valueOfParam = assign.rhs;
}
+ /* strip trailing underscores */ {
+ int lastIdx;
+ for (lastIdx = nameOfParam.length() ; lastIdx > 0; lastIdx--) {
+ if (nameOfParam.charAt(lastIdx - 1) != '_') break;
+ }
+ allowRaw = lastIdx < nameOfParam.length();
+ nameOfParam = nameOfParam.substring(0, lastIdx);
+ }
+
if (!parameterName.equals(nameOfParam)) {
params.append(param);
continue outer;
@@ -1262,52 +1275,84 @@ public class JavacHandlerUtil {
String dummyAnnotationName = ((JCAnnotation) valueOfParam).annotationType.toString();
dummyAnnotationName = dummyAnnotationName.replace("_", "").replace("$", "").replace("x", "").replace("X", "");
if (dummyAnnotationName.length() > 0) {
- annotationNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
- continue outer;
- }
- for (JCExpression expr : ((JCAnnotation) valueOfParam).args) {
- if (expr instanceof JCAssign && ((JCAssign) expr).lhs instanceof JCIdent) {
- JCIdent id = (JCIdent) ((JCAssign) expr).lhs;
- if ("value".equals(id.name.toString())) {
- expr = ((JCAssign) expr).rhs;
+ if (allowRaw) {
+ result.append((JCAnnotation) valueOfParam);
+ } else {
+ addError(errorName, annotationNode);
+ continue outer;
+ }
+ } else {
+ for (JCExpression expr : ((JCAnnotation) valueOfParam).args) {
+ if (expr instanceof JCAssign && ((JCAssign) expr).lhs instanceof JCIdent) {
+ JCIdent id = (JCIdent) ((JCAssign) expr).lhs;
+ if ("value".equals(id.name.toString())) {
+ expr = ((JCAssign) expr).rhs;
+ } else {
+ addError(errorName, annotationNode);
+ }
+ }
+
+ if (expr instanceof JCAnnotation) {
+ result.append((JCAnnotation) expr);
+ } else if (expr instanceof JCNewArray) {
+ for (JCExpression expr2 : ((JCNewArray) expr).elems) {
+ if (expr2 instanceof JCAnnotation) {
+ result.append((JCAnnotation) expr2);
+ } else {
+ addError(errorName, annotationNode);
+ continue outer;
+ }
+ }
} else {
- annotationNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
+ addError(errorName, annotationNode);
continue outer;
}
}
-
- if (expr instanceof JCAnnotation) {
- result.append((JCAnnotation) expr);
- } else if (expr instanceof JCNewArray) {
- for (JCExpression expr2 : ((JCNewArray) expr).elems) {
- if (expr2 instanceof JCAnnotation) {
- result.append((JCAnnotation) expr2);
- } else {
- annotationNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
- continue outer;
- }
- }
- } else {
- annotationNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
- continue outer;
+ }
+ } else if (valueOfParam instanceof JCNewArray) {
+ JCNewArray arr = (JCNewArray) valueOfParam;
+ if (arr.elems.isEmpty()) {
+ // Just remove it, this is always fine.
+ } else if (allowRaw) {
+ for (JCExpression jce : arr.elems) {
+ if (jce instanceof JCAnnotation) result.append((JCAnnotation) jce);
+ else addError(errorName, annotationNode);
}
+ } else {
+ addError(errorName, annotationNode);
}
} else {
- if (valueOfParam instanceof JCNewArray && ((JCNewArray) valueOfParam).elems.isEmpty()) {
- // Then we just remove it and move on (it's onMethod={} for example).
- } else {
- annotationNode.addError("The correct format is " + errorName + "@__({@SomeAnnotation, @SomeOtherAnnotation}))");
- }
+ addError(errorName, annotationNode);
}
}
ast.args = params.toList();
return result.toList();
}
- public static List copyTypeParams(JavacTreeMaker maker, List params) {
+ private static void addError(String errorName, JavacNode node) {
+ if (node.getLatestJavaSpecSupported() < 8) {
+ node.addError("The correct format up to JDK7 is " + errorName + "=@__({@SomeAnnotation, @SomeOtherAnnotation}))");
+ } else {
+ node.addError("The correct format for JDK8+ is " + errorName + "_={@SomeAnnotation, @SomeOtherAnnotation})");
+ }
+ }
+
+ public static List copyTypeParams(JavacNode source, List params) {
if (params == null || params.isEmpty()) return params;
ListBuffer out = new ListBuffer();
- for (JCTypeParameter tp : params) out.append(maker.TypeParameter(tp.name, tp.bounds));
+ JavacTreeMaker maker = source.getTreeMaker();
+ Context context = source.getContext();
+ for (JCTypeParameter tp : params) {
+ List bounds = tp.bounds;
+ if (bounds != null && !bounds.isEmpty()) {
+ ListBuffer boundsCopy = new ListBuffer();
+ for (JCExpression expr : tp.bounds) {
+ boundsCopy.append(cloneType(maker, expr, source.get(), context));
+ }
+ bounds = boundsCopy.toList();
+ }
+ out.append(maker.TypeParameter(tp.name, bounds));
+ }
return out.toList();
}
diff --git a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java
index 77f615b5..135b5c77 100644
--- a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java
+++ b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java
@@ -30,8 +30,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup;
-
import lombok.core.AgentLauncher;
import lombok.patcher.Filter;
import lombok.patcher.Hook;
diff --git a/src/installer/lombok/installer/InstallerGUI.java b/src/installer/lombok/installer/InstallerGUI.java
index ebdf2035..b96fec9c 100644
--- a/src/installer/lombok/installer/InstallerGUI.java
+++ b/src/installer/lombok/installer/InstallerGUI.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2016 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
@@ -39,6 +39,8 @@ import java.awt.event.ActionListener;
import java.awt.font.TextAttribute;
import java.io.File;
import java.io.FilenameFilter;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
@@ -62,9 +64,12 @@ import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
+import javax.swing.JTextPane;
import javax.swing.Scrollable;
import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
import javax.swing.filechooser.FileFilter;
+import javax.swing.text.html.HTMLDocument;
import lombok.core.Version;
import lombok.installer.OsUtils.OS;
@@ -75,6 +80,7 @@ import lombok.installer.OsUtils.OS;
* Also offers info on what this installer does in case people want to instrument their IDE manually.
*/
public class InstallerGUI {
+ private static final int INSTALLER_WINDOW_WIDTH = 662;
static final AtomicReference exitMarker = new AtomicReference();
private JFrame appWindow;
@@ -85,6 +91,7 @@ public class InstallerGUI {
private Component ideArea;
private Component uninstallArea;
private Component howIWorkArea;
+ private Component successArea;
private Box uninstallBox;
private JHyperLink uninstallButton;
@@ -113,6 +120,8 @@ public class InstallerGUI {
uninstallArea.setVisible(false);
howIWorkArea = buildHowIWorkArea();
howIWorkArea.setVisible(false);
+ successArea = buildSuccessArea();
+ successArea.setVisible(false);
buildChrome(appWindow.getContentPane());
appWindow.pack();
} catch (Throwable t) {
@@ -153,6 +162,7 @@ public class InstallerGUI {
howIWorkArea.setVisible(false);
javacArea.setVisible(true);
ideArea.setVisible(true);
+ successArea.setVisible(false);
appWindow.pack();
}
});
@@ -160,9 +170,84 @@ public class InstallerGUI {
constraints.gridy = 2;
container.add(buttonBar, constraints);
+ container.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));
return container;
}
+ private void showSuccess(String installSpecific) {
+ successExplanation.setText(SUCCESS_EXPLANATION.replace("%%%", installSpecific));
+ howIWorkArea.setVisible(false);
+ javacArea.setVisible(false);
+ ideArea.setVisible(false);
+ successArea.setVisible(true);
+ appWindow.pack();
+ }
+
+ private JLabel successExplanation;
+
+ private Component buildSuccessArea() {
+ JPanel container = new JPanel();
+
+ container.setLayout(new GridBagLayout());
+ GridBagConstraints constraints = new GridBagConstraints();
+ constraints.anchor = GridBagConstraints.WEST;
+
+ JLabel title;
+ container.add(title = new JLabel(SUCCESS_TITLE), constraints);
+ title.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 20));
+
+ constraints.gridy = 1;
+ constraints.insets = new Insets(8, 0, 0, 16);
+ container.add(successExplanation = new JLabel(SUCCESS_EXPLANATION), constraints);
+ successExplanation.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 175));
+ successExplanation.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 175));
+
+ constraints.gridy++;
+ constraints.fill = GridBagConstraints.BOTH;
+
+ JTextPane notes = new JTextPane();
+ notes.setContentType("text/html");
+ notes.setText(readChangeLog());
+ notes.setEditable(false);
+ notes.setOpaque(false);
+ notes.setBorder(null);
+ notes.setSelectionStart(0);
+ notes.setSelectionEnd(0);
+
+ Font font = UIManager.getFont("Label.font");
+ String bodyRule = "body { font-family: " + font.getFamily() + "; font-size: " + font.getSize() + "pt; }";
+ ((HTMLDocument) notes.getDocument()).getStyleSheet().addRule(bodyRule);
+ JScrollPane scroller = new JScrollPane(notes);
+ container.add(scroller, constraints);
+ scroller.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 200));
+ scroller.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 200));
+ container.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));
+ container.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));
+ return container;
+ }
+
+ private String readChangeLog() {
+ InputStream in = Installer.class.getResourceAsStream("/latestchanges.html");
+ try {
+ char[] buff = new char[8192];
+ StringBuilder contents = new StringBuilder();
+ InputStreamReader reader = new InputStreamReader(in, "UTF-8");
+ while (true) {
+ int read = reader.read(buff);
+ if (read == -1) break;
+ contents.append(buff, 0, read);
+ }
+ return "" + contents + "";
+ } catch (Exception e) {
+ return "No Changelog available";
+ }
+ finally {
+ try {
+ in.close();
+ } catch (Exception ignore){ /**/}
+ }
+ }
+
private Component buildUninstallArea() {
JPanel container = new JPanel();
@@ -210,6 +295,7 @@ public class InstallerGUI {
constraints.gridy = 4;
container.add(buttonBar, constraints);
+ container.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));
return container;
}
@@ -232,6 +318,7 @@ public class InstallerGUI {
constraints.gridy = 2;
container.add(example, constraints);
+ container.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 105));
return container;
}
@@ -289,11 +376,11 @@ public class InstallerGUI {
if (locations.size() + problems.size() == 0) {
JOptionPane.showMessageDialog(appWindow,
- "I can't find any IDEs on your computer.\n" +
- "If you have IDEs installed on this computer, please use the " +
- "'Specify Location...' button to manually point out the \n" +
- "location of your IDE installation to me. Thanks!",
- "Can't find IDE", JOptionPane.INFORMATION_MESSAGE);
+ "I can't find any IDEs on your computer.\n" +
+ "If you have IDEs installed on this computer, please use the " +
+ "'Specify Location...' button to manually point out the \n" +
+ "location of your IDE installation to me. Thanks!",
+ "Can't find IDE", JOptionPane.INFORMATION_MESSAGE);
}
}
});
@@ -419,7 +506,7 @@ public class InstallerGUI {
uninstallPlaceholder.setVisible(false);
container.add(uninstallPlaceholder, constraints);
-
+ container.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 296));
return container;
}
@@ -427,6 +514,7 @@ public class InstallerGUI {
javacArea.setVisible(false);
ideArea.setVisible(false);
howIWorkArea.setVisible(true);
+ successArea.setVisible(false);
appWindow.pack();
}
@@ -453,6 +541,7 @@ public class InstallerGUI {
spinner.setOpaque(true);
spinner.setLayout(new FlowLayout());
spinner.add(new JLabel(new ImageIcon(Installer.class.getResource("loading.gif"))));
+ final Container appWindowContent = appWindow.getContentPane();
appWindow.setContentPane(spinner);
final AtomicInteger successes = new AtomicInteger();
@@ -500,20 +589,13 @@ public class InstallerGUI {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override public void run() {
+ appWindow.setContentPane(appWindowContent);
+ appWindow.pack();
StringBuilder installSpecific = new StringBuilder();
for (String installSpecificMessage : installSpecificMessages) {
installSpecific.append("
").append(installSpecificMessage);
}
- JOptionPane.showMessageDialog(appWindow,
- "Lombok has been installed on the selected IDE installations.
" +
- "Don't forget to add lombok.jar to your projects, and restart your IDE!" + installSpecific.toString() + "",
- "Install successful",
- JOptionPane.INFORMATION_MESSAGE);
- appWindow.setVisible(false);
- synchronized (exitMarker) {
- exitMarker.set(0);
- exitMarker.notifyAll();
- }
+ showSuccess(installSpecific.toString());
}
});
} catch (Exception e) {
@@ -711,6 +793,8 @@ public class InstallerGUI {
appWindowContainer.add(howIWorkArea, constraints);
+ appWindowContainer.add(successArea, constraints);
+
constraints.gridy++;
constraints.gridwidth = 2;
constraints.gridx = 0;
@@ -719,9 +803,33 @@ public class InstallerGUI {
constraints.ipadx = 0;
constraints.ipady = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
- constraints.anchor = GridBagConstraints.SOUTHEAST;
+ constraints.anchor = GridBagConstraints.SOUTHWEST;
constraints.insets = new Insets(0, 16, 8, 8);
+
+ appWindow.add(buildButtonBar(), constraints);
+ }
+
+ private Box buildButtonBar() {
Box buttonBar = Box.createHorizontalBox();
+
+ JHyperLink aboutLink = new JHyperLink(Installer.ABOUT_LOMBOK_URL.toString());
+ aboutLink.addActionListener(openBrowser(aboutLink, Installer.ABOUT_LOMBOK_URL));
+ buttonBar.add(aboutLink);
+
+ buttonBar.add(Box.createRigidArea(new Dimension(16, 1)));
+
+ JLabel versionLabel = new JLabel();
+ versionLabel.setText("v" + Version.getVersion());
+
+ buttonBar.add(versionLabel);
+ buttonBar.add(Box.createRigidArea(new Dimension(16, 1)));
+
+ JHyperLink changelogLink = new JHyperLink("View full changelog");
+ changelogLink.addActionListener(openBrowser(changelogLink, Installer.ABOUT_LOMBOK_URL.resolve("/changelog.html")));
+ buttonBar.add(changelogLink);
+
+ buttonBar.add(Box.createHorizontalGlue());
+
JButton quitButton = new JButton("Quit Installer");
quitButton.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
@@ -729,14 +837,18 @@ public class InstallerGUI {
System.exit(0);
}
});
- final JHyperLink hyperlink = new JHyperLink(Installer.ABOUT_LOMBOK_URL.toString());
- hyperlink.addActionListener(new ActionListener() {
+ buttonBar.add(quitButton);
+ return buttonBar;
+ }
+
+ private ActionListener openBrowser(final JHyperLink hyperlink, final URI location) {
+ return new ActionListener() {
@Override public void actionPerformed(ActionEvent event) {
hyperlink.setForeground(new Color(85, 145, 90));
try {
//java.awt.Desktop doesn't exist in 1.5.
Object desktop = Class.forName("java.awt.Desktop").getMethod("getDesktop").invoke(null);
- Class.forName("java.awt.Desktop").getMethod("browse", URI.class).invoke(desktop, Installer.ABOUT_LOMBOK_URL);
+ Class.forName("java.awt.Desktop").getMethod("browse", URI.class).invoke(desktop, location);
} catch (Exception e) {
Runtime rt = Runtime.getRuntime();
try {
@@ -746,34 +858,27 @@ public class InstallerGUI {
cmd[0] = "cmd.exe";
cmd[1] = "/C";
cmd[2] = "start";
- cmd[3] = Installer.ABOUT_LOMBOK_URL.toString();
+ cmd[3] = location.toString();
rt.exec(cmd);
break;
case MAC_OS_X:
- rt.exec("open " + Installer.ABOUT_LOMBOK_URL.toString());
+ rt.exec("open " + location.toString());
break;
default:
case UNIX:
- rt.exec("firefox " + Installer.ABOUT_LOMBOK_URL.toString());
+ rt.exec("firefox " + location.toString());
break;
}
} catch (Exception e2) {
JOptionPane.showMessageDialog(appWindow,
"Well, this is embarrassing. I don't know how to open a webbrowser.\n" +
- "I guess you'll have to open it. Browse to:\n" + Installer.ABOUT_LOMBOK_URL +
+ "I guess you'll have to open it. Browse to:\n" + location +
" for more information about Lombok.",
"I'm embarrassed", JOptionPane.INFORMATION_MESSAGE);
}
}
}
- });
- buttonBar.add(hyperlink);
- buttonBar.add(Box.createRigidArea(new Dimension(16, 1)));
- buttonBar.add(new JLabel("v" + Version.getVersion() + ""));
-
- buttonBar.add(Box.createHorizontalGlue());
- buttonBar.add(quitButton);
- appWindow.add(buttonBar, constraints);
+ };
}
/**
@@ -791,7 +896,7 @@ public class InstallerGUI {
}
private static final String IDE_TITLE =
- "IDEs";
+ "IDEs ";
private static final String IDE_EXPLANATION =
"Lombok can update your Eclipse or eclipse-based IDE to fully support all Lombok features.
" +
@@ -801,7 +906,7 @@ public class InstallerGUI {
"Scanning your drives for IDE installations...";
private static final String JAVAC_TITLE =
- "Javac (and tools that invoke javac such as ant and maven)";
+ "Javac (and tools that invoke javac such as ant and maven)";
private static final String JAVAC_EXPLANATION =
"Lombok works 'out of the box' with javac.
Just make sure the lombok.jar is in your classpath when you compile.";
@@ -810,13 +915,13 @@ public class InstallerGUI {
"Example: javac -cp lombok.jar MyCode.java";
private static final String UNINSTALL_TITLE =
- "Uninstall";
+ "Uninstall ";
private static final String UNINSTALL_EXPLANATION =
"Uninstall Lombok from the following IDE Installations?";
private static final String HOW_I_WORK_TITLE =
- "What this installer does";
+ "What this installer does ";
private static final String HOW_I_WORK_EXPLANATION =
"Eclipse
" +
@@ -826,6 +931,11 @@ public class InstallerGUI {
"On Mac OS X, eclipse.ini is hidden in
" +
"Eclipse.app/Contents/MacOS so that's where I place the jar files.";
+ private static final String SUCCESS_TITLE = "Install successful ";
+ private static final String SUCCESS_EXPLANATION = "Lombok has been installed on the selected IDE installations.
" +
+ "Don't forget to:- add
lombok.jar to your projects, - exit and start your IDE,
- rebuild all projects!
%%%";
+
+
private static class JHyperLink extends JButton {
private static final long serialVersionUID = 1L;
diff --git a/src/installer/lombok/installer/eclipse/EclipseProductLocationProvider.java b/src/installer/lombok/installer/eclipse/EclipseProductLocationProvider.java
index 3710d7d9..b807f02b 100644
--- a/src/installer/lombok/installer/eclipse/EclipseProductLocationProvider.java
+++ b/src/installer/lombok/installer/eclipse/EclipseProductLocationProvider.java
@@ -288,10 +288,10 @@ public class EclipseProductLocationProvider implements IdeLocationProvider {
abstract String findEclipseOnPlatform(File dir);
void recurseDirectory(List locations, List problems, File dir) {
- recurseDirectory0(locations, problems, dir, 0);
+ recurseDirectory0(locations, problems, dir, 0, false);
}
- private void recurseDirectory0(List locations, List problems, File f, int loopCounter) {
+ private void recurseDirectory0(List locations, List problems, File f, int loopCounter, boolean nameFound) {
//Various try/catch/ignore statements are in this for loop. Weird conditions on the disk can cause exceptions,
//such as an unformatted drive causing a NullPointerException on listFiles. Best action is almost invariably to just
//continue onwards.
@@ -301,9 +301,9 @@ public class EclipseProductLocationProvider implements IdeLocationProvider {
for (File dir : listFiles) {
if (!dir.isDirectory()) continue;
try {
- if (dir.getName().toLowerCase().contains(descriptor.getDirectoryName())) {
+ if (nameFound || dir.getName().toLowerCase().contains(descriptor.getDirectoryName())) {
findEclipse(locations, problems, dir);
- if (loopCounter < 50) recurseDirectory0(locations, problems, dir, loopCounter + 1);
+ if (loopCounter < 50) recurseDirectory0(locations, problems, dir, loopCounter + 1, true);
}
} catch (Exception ignore) {}
}
diff --git a/src/launch/lombok/launch/ShadowClassLoader.java b/src/launch/lombok/launch/ShadowClassLoader.java
index 37c479ee..72f006e8 100644
--- a/src/launch/lombok/launch/ShadowClassLoader.java
+++ b/src/launch/lombok/launch/ShadowClassLoader.java
@@ -118,12 +118,16 @@ class ShadowClassLoader extends ClassLoader {
SELF_BASE = selfBase;
SELF_BASE_LENGTH = selfBase.length();
} else {
- String sclClassUrl = ShadowClassLoader.class.getResource("ShadowClassLoader.class").toString();
- if (!sclClassUrl.endsWith(SELF_NAME)) throw new InternalError("ShadowLoader can't find itself.");
- SELF_BASE_LENGTH = sclClassUrl.length() - SELF_NAME.length();
+ URL sclClassUrl = ShadowClassLoader.class.getResource("ShadowClassLoader.class");
+ String sclClassStr = sclClassUrl == null ? null : sclClassUrl.toString();
+ if (sclClassStr == null || !sclClassStr.endsWith(SELF_NAME)) {
+ ClassLoader cl = ShadowClassLoader.class.getClassLoader();
+ throw new RuntimeException("ShadowLoader can't find itself. SCL loader type: " + (cl == null ? "*NULL*" : cl.getClass().toString()));
+ }
+ SELF_BASE_LENGTH = sclClassStr.length() - SELF_NAME.length();
String decoded;
try {
- decoded = URLDecoder.decode(sclClassUrl.substring(0, SELF_BASE_LENGTH), "UTF-8");
+ decoded = URLDecoder.decode(sclClassStr.substring(0, SELF_BASE_LENGTH), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new InternalError("UTF-8 not available");
}
@@ -451,7 +455,12 @@ class ShadowClassLoader extends ClassLoader {
Class> alreadyDefined = highlanderMap.get(name);
if (alreadyDefined != null) return alreadyDefined;
}
- throw e;
+ try {
+ c = this.findLoadedClass(name);
+ } catch (LinkageError e2) {
+ throw e;
+ }
+ if (c == null) throw e;
}
if (highlanders.contains(name)) {
diff --git a/src/stubs/com/sun/tools/javac/file/BaseFileManager.java b/src/stubs/com/sun/tools/javac/file/BaseFileManager.java
new file mode 100644
index 00000000..7a2293d5
--- /dev/null
+++ b/src/stubs/com/sun/tools/javac/file/BaseFileManager.java
@@ -0,0 +1,8 @@
+/*
+ * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.
+ */
+package com.sun.tools.javac.file;
+
+import javax.tools.JavaFileManager;
+
+public abstract class BaseFileManager implements JavaFileManager{}
diff --git a/src/stubs/com/sun/tools/javac/file/PathFileObject.java b/src/stubs/com/sun/tools/javac/file/PathFileObject.java
new file mode 100644
index 00000000..c1ee6074
--- /dev/null
+++ b/src/stubs/com/sun/tools/javac/file/PathFileObject.java
@@ -0,0 +1,12 @@
+/*
+ * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.
+ */
+package com.sun.tools.javac.file;
+
+import java.nio.file.Path;
+
+import javax.tools.JavaFileObject;
+
+public abstract class PathFileObject implements JavaFileObject {
+ protected PathFileObject(BaseFileManager fileManager, Path path) {}
+}
diff --git a/test/core/src/lombok/AbstractRunTests.java b/test/core/src/lombok/AbstractRunTests.java
index d044a39f..1a454585 100644
--- a/test/core/src/lombok/AbstractRunTests.java
+++ b/test/core/src/lombok/AbstractRunTests.java
@@ -55,15 +55,15 @@ public abstract class AbstractRunTests {
this.dumpActualFilesHere = findPlaceToDumpActualFiles();
}
- public final FileTester createTester(final DirectoryRunner.TestParams params, final File file) throws IOException {
+ public final FileTester createTester(final DirectoryRunner.TestParams params, final File file, String platform, int version) throws IOException {
ConfigurationKeysLoader.LoaderLoader.loadAllConfigurationKeys();
AssertionError directiveFailure = null;
LombokTestSource sourceDirectives = null;
try {
sourceDirectives = LombokTestSource.readDirectives(file);
if (sourceDirectives.isIgnore()) return null;
- if (!sourceDirectives.versionWithinLimit(params.getVersion())) return null;
- if (!sourceDirectives.versionWithinLimit(getClasspathVersion())) return null;
+ if (!sourceDirectives.versionWithinLimit(version)) return null;
+ if (!sourceDirectives.runOnPlatform(platform)) return null;
} catch (AssertionError ae) {
directiveFailure = ae;
}
@@ -73,6 +73,7 @@ public abstract class AbstractRunTests {
if (expected.isIgnore()) return null;
if (!expected.versionWithinLimit(params.getVersion())) return null;
+ if (!expected.versionWithinLimit(version)) return null;
final LombokTestSource sourceDirectives_ = sourceDirectives;
final AssertionError directiveFailure_ = directiveFailure;
@@ -98,22 +99,6 @@ public abstract class AbstractRunTests {
};
}
- private static int getClasspathVersion() {
- try {
- Class.forName("java.lang.AutoCloseable");
- } catch (ClassNotFoundException e) {
- return 6;
- }
-
- try {
- Class.forName("java.util.stream.Stream");
- } catch (ClassNotFoundException e) {
- return 7;
- }
-
- return 8;
- }
-
protected abstract boolean transformCode(Collection messages, StringWriter result, File file, String encoding, Map formatPreferences) throws Throwable;
protected String readFile(File file) throws IOException {
diff --git a/test/core/src/lombok/DirectoryRunner.java b/test/core/src/lombok/DirectoryRunner.java
index d4275b09..72f01de1 100644
--- a/test/core/src/lombok/DirectoryRunner.java
+++ b/test/core/src/lombok/DirectoryRunner.java
@@ -155,12 +155,11 @@ public class DirectoryRunner extends Runner {
private FileTester createTester(String fileName) throws IOException {
File file = new File(params.getBeforeDirectory(), fileName);
-
switch (params.getCompiler()) {
case DELOMBOK:
- return new RunTestsViaDelombok().createTester(params, file);
+ return new RunTestsViaDelombok().createTester(params, file, "javac", params.getVersion());
case ECJ:
- return new RunTestsViaEcj().createTester(params, file);
+ return new RunTestsViaEcj().createTester(params, file, "ecj", params.getVersion());
default:
case JAVAC:
throw new UnsupportedOperationException();
diff --git a/test/core/src/lombok/LombokTestSource.java b/test/core/src/lombok/LombokTestSource.java
index 16f9f49f..31f7db3e 100644
--- a/test/core/src/lombok/LombokTestSource.java
+++ b/test/core/src/lombok/LombokTestSource.java
@@ -29,6 +29,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -55,7 +56,14 @@ public class LombokTestSource {
private final int versionLowerLimit, versionUpperLimit;
private final ConfigurationResolver configuration;
private final String specifiedEncoding;
+ private final List platforms;
+ public boolean runOnPlatform(String platform) {
+ if (platforms == null || platforms.isEmpty()) return true;
+ for (String pl : platforms) if (pl.equalsIgnoreCase(platform)) return true;
+ return false;
+ }
+
public boolean versionWithinLimit(int version) {
return version >= versionLowerLimit && version <= versionUpperLimit;
}
@@ -145,6 +153,7 @@ public class LombokTestSource {
boolean unchanged = false;
String encoding = null;
Map formats = new HashMap();
+ String[] platformLimit = null;
for (String directive : directives) {
directive = directive.trim();
@@ -164,6 +173,14 @@ public class LombokTestSource {
continue;
}
+ if (lc.startsWith("platform ")) {
+ String platformDesc = lc.substring("platform ".length());
+ int idx = platformDesc.indexOf(':');
+ if (idx != -1) platformDesc = platformDesc.substring(0, idx).trim();
+ platformLimit = platformDesc.split("\\s*,\\s*");
+ continue;
+ }
+
if (lc.startsWith("version ")) {
int[] limits = parseVersionLimit(lc.substring(7).trim());
if (limits == null) {
@@ -207,6 +224,7 @@ public class LombokTestSource {
this.ignore = ignore;
this.skipCompareContent = skipCompareContent;
this.unchanged = unchanged;
+ this.platforms = platformLimit == null ? null : Arrays.asList(platformLimit);
ConfigurationProblemReporter reporter = new ConfigurationProblemReporter() {
@Override public void report(String sourceDescription, String problem, int lineNumber, CharSequence line) {
Assert.fail("Problem on directive line: " + problem + " at conf line #" + lineNumber + " (" + line + ")");
diff --git a/test/pretty/resource/before/ExoticJava.java b/test/pretty/resource/before/ExoticJava.java
index b70b1e12..a0e27c79 100644
--- a/test/pretty/resource/before/ExoticJava.java
+++ b/test/pretty/resource/before/ExoticJava.java
@@ -1,3 +1,4 @@
+//VERSION 7:
import static java.lang.String.*;
import java.io.*;
diff --git a/test/transform/knownBroken/before/I1132RecursiveGenerics.java b/test/transform/knownBroken/before/I1132RecursiveGenerics.java
new file mode 100644
index 00000000..781886a7
--- /dev/null
+++ b/test/transform/knownBroken/before/I1132RecursiveGenerics.java
@@ -0,0 +1,19 @@
+// Compile with javac, it'll think the T in the generated build() method isn't type compatible.
+// Yet, when you take the delomboked output (which delombok will give, but with errors), THAT does compile.
+
+public class I1132RecursiveGenerics {
+ public static class Recursive> {}
+ public static final class Rec extends Recursive {}
+
+ @lombok.Builder(builderClassName = "MethodBuilder")
+ public static > T create() {
+ return null;
+ }
+
+ public static void main(String[] args) {
+ final MethodBuilder builder = I1132RecursiveGenerics.builder();
+ final Rec rec = builder.build();
+// final Rec rec = I1132RecursiveGenerics.builder().build();
+ }
+}
+
diff --git a/test/transform/knownBroken/before/I1302BuilderInInstanceInnerClass.java b/test/transform/knownBroken/before/I1302BuilderInInstanceInnerClass.java
new file mode 100644
index 00000000..cf37abc4
--- /dev/null
+++ b/test/transform/knownBroken/before/I1302BuilderInInstanceInnerClass.java
@@ -0,0 +1,5 @@
+public class I1302BuilderInInstanceInnerClass {
+ @lombok.Builder public class NonStaticInner {
+ private int test;
+ }
+}
diff --git a/test/transform/resource/after-delombok/Accessors.java b/test/transform/resource/after-delombok/Accessors.java
index 8dee33ad..426b3863 100644
--- a/test/transform/resource/after-delombok/Accessors.java
+++ b/test/transform/resource/after-delombok/Accessors.java
@@ -2,13 +2,11 @@ class AccessorsFluent {
private String fieldName = "";
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public String fieldName() {
return this.fieldName;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public AccessorsFluent fieldName(final String fieldName) {
this.fieldName = fieldName;
return this;
@@ -19,19 +17,16 @@ class AccessorsFluentOnClass {
private String otherFieldWithOverride = "";
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public String fieldName() {
return this.fieldName;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public String getOtherFieldWithOverride() {
return this.otherFieldWithOverride;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public AccessorsFluentOnClass fieldName(final String fieldName) {
this.fieldName = fieldName;
return this;
@@ -41,7 +36,6 @@ class AccessorsChain {
private boolean isRunning;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public AccessorsChain setRunning(final boolean isRunning) {
this.isRunning = isRunning;
return this;
@@ -52,7 +46,6 @@ class AccessorsPrefix {
private String fActualField;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public void setActualField(final String fActualField) {
this.fActualField = fActualField;
}
@@ -62,13 +55,11 @@ class AccessorsPrefix2 {
private String fActualField;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public void setFieldName(final String fieldName) {
this.fieldName = fieldName;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public void setActualField(final String fActualField) {
this.fActualField = fActualField;
}
@@ -81,14 +72,12 @@ class AccessorsPrefix3 {
@java.lang.Override
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public java.lang.String toString() {
return "AccessorsPrefix3(fName=" + this.getName() + ")";
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public boolean equals(final java.lang.Object o) {
if (o == this) return true;
if (!(o instanceof AccessorsPrefix3)) return false;
@@ -101,14 +90,12 @@ class AccessorsPrefix3 {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
protected boolean canEqual(final java.lang.Object other) {
return other instanceof AccessorsPrefix3;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public int hashCode() {
final int PRIME = 59;
int result = 1;
@@ -121,7 +108,6 @@ class AccessorsFluentGenerics {
private String name;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public AccessorsFluentGenerics name(final String name) {
this.name = name;
return this;
@@ -131,7 +117,6 @@ class AccessorsFluentNoChaining {
private String name;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public void name(final String name) {
this.name = name;
}
@@ -140,8 +125,7 @@ class AccessorsFluentStatic {
private static String name;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public static void name(final String name) {
AccessorsFluentStatic.name = name;
}
-}
\ No newline at end of file
+}
diff --git a/test/transform/resource/after-delombok/AccessorsConfiguration.java b/test/transform/resource/after-delombok/AccessorsConfiguration.java
index f98b7939..0094c55c 100644
--- a/test/transform/resource/after-delombok/AccessorsConfiguration.java
+++ b/test/transform/resource/after-delombok/AccessorsConfiguration.java
@@ -2,13 +2,11 @@ class AccessorsConfiguration {
private String m_FieldName = "";
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public String fieldName() {
return this.m_FieldName;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public void fieldName(final String m_FieldName) {
this.m_FieldName = m_FieldName;
}
@@ -17,7 +15,6 @@ class AccessorsConfiguration2 {
private String m_FieldName = "";
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public void setM_FieldName(final String m_FieldName) {
this.m_FieldName = m_FieldName;
}
@@ -26,9 +23,8 @@ class AccessorsConfiguration3 {
private String fFieldName = "";
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public AccessorsConfiguration3 setFieldName(final String fFieldName) {
this.fFieldName = fFieldName;
return this;
}
-}
\ No newline at end of file
+}
diff --git a/test/transform/resource/after-delombok/BuilderChainAndFluent.java b/test/transform/resource/after-delombok/BuilderChainAndFluent.java
index 7a1f487e..2475a998 100644
--- a/test/transform/resource/after-delombok/BuilderChainAndFluent.java
+++ b/test/transform/resource/after-delombok/BuilderChainAndFluent.java
@@ -2,47 +2,39 @@ class BuilderChainAndFluent {
private final int yes;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
BuilderChainAndFluent(final int yes) {
this.yes = yes;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public static class BuilderChainAndFluentBuilder {
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private int yes;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
BuilderChainAndFluentBuilder() {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public void setYes(final int yes) {
this.yes = yes;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderChainAndFluent build() {
return new BuilderChainAndFluent(yes);
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public java.lang.String toString() {
return "BuilderChainAndFluent.BuilderChainAndFluentBuilder(yes=" + this.yes + ")";
}
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public static BuilderChainAndFluentBuilder builder() {
return new BuilderChainAndFluentBuilder();
}
-}
\ No newline at end of file
+}
diff --git a/test/transform/resource/after-delombok/BuilderComplex.java b/test/transform/resource/after-delombok/BuilderComplex.java
index 15d4e25c..937628f9 100644
--- a/test/transform/resource/after-delombok/BuilderComplex.java
+++ b/test/transform/resource/after-delombok/BuilderComplex.java
@@ -4,75 +4,62 @@ class BuilderComplex {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public static class VoidBuilder {
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private T number;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private int arg2;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private String arg3;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private BuilderComplex selfRef;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
VoidBuilder() {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public VoidBuilder number(final T number) {
this.number = number;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public VoidBuilder arg2(final int arg2) {
this.arg2 = arg2;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public VoidBuilder arg3(final String arg3) {
this.arg3 = arg3;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public VoidBuilder selfRef(final BuilderComplex selfRef) {
this.selfRef = selfRef;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public void execute() {
BuilderComplex.testVoidWithGenerics(number, arg2, arg3, selfRef);
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public java.lang.String toString() {
return "BuilderComplex.VoidBuilder(number=" + this.number + ", arg2=" + this.arg2 + ", arg3=" + this.arg3 + ", selfRef=" + this.selfRef + ")";
}
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public static VoidBuilder builder() {
return new VoidBuilder();
}
-}
\ No newline at end of file
+}
diff --git a/test/transform/resource/after-delombok/BuilderInstanceMethod.java b/test/transform/resource/after-delombok/BuilderInstanceMethod.java
index 668977ab..61e237d0 100644
--- a/test/transform/resource/after-delombok/BuilderInstanceMethod.java
+++ b/test/transform/resource/after-delombok/BuilderInstanceMethod.java
@@ -5,74 +5,61 @@ class BuilderInstanceMethod {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public class StringBuilder {
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private int show;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private int yes;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private List also;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private int $andMe;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
StringBuilder() {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public StringBuilder show(final int show) {
this.show = show;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public StringBuilder yes(final int yes) {
this.yes = yes;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public StringBuilder also(final List also) {
this.also = also;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public StringBuilder $andMe(final int $andMe) {
this.$andMe = $andMe;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public String build() {
return BuilderInstanceMethod.this.create(show, yes, also, $andMe);
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public java.lang.String toString() {
return "BuilderInstanceMethod.StringBuilder(show=" + this.show + ", yes=" + this.yes + ", also=" + this.also + ", $andMe=" + this.$andMe + ")";
}
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public StringBuilder builder() {
return new StringBuilder();
}
diff --git a/test/transform/resource/after-delombok/BuilderSimple.java b/test/transform/resource/after-delombok/BuilderSimple.java
index ecf74aa3..a12ad047 100644
--- a/test/transform/resource/after-delombok/BuilderSimple.java
+++ b/test/transform/resource/after-delombok/BuilderSimple.java
@@ -6,59 +6,49 @@ class BuilderSimple {
private int $butNotMe;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
BuilderSimple(final int yes, final List also) {
this.yes = yes;
this.also = also;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public static class BuilderSimpleBuilder {
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private int yes;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private List also;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
BuilderSimpleBuilder() {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSimpleBuilder yes(final int yes) {
this.yes = yes;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSimpleBuilder also(final List also) {
this.also = also;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSimple build() {
return new BuilderSimple(yes, also);
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public java.lang.String toString() {
return "BuilderSimple.BuilderSimpleBuilder(yes=" + this.yes + ", also=" + this.also + ")";
}
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public static BuilderSimpleBuilder builder() {
return new BuilderSimpleBuilder();
}
diff --git a/test/transform/resource/after-delombok/BuilderSingularGuavaListsSets.java b/test/transform/resource/after-delombok/BuilderSingularGuavaListsSets.java
index 851fc3db..08becf6b 100644
--- a/test/transform/resource/after-delombok/BuilderSingularGuavaListsSets.java
+++ b/test/transform/resource/after-delombok/BuilderSingularGuavaListsSets.java
@@ -12,7 +12,6 @@ class BuilderSingularGuavaListsSets {
private ImmutableTable extends Number, ? extends Number, String> users;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
BuilderSingularGuavaListsSets(final ImmutableList cards, final ImmutableCollection extends Number> frogs, final ImmutableSet rawSet, final ImmutableSortedSet passes, final ImmutableTable extends Number, ? extends Number, String> users) {
this.cards = cards;
this.frogs = frogs;
@@ -22,36 +21,28 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public static class BuilderSingularGuavaListsSetsBuilder {
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private com.google.common.collect.ImmutableList.Builder cards;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private com.google.common.collect.ImmutableList.Builder frogs;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private com.google.common.collect.ImmutableSet.Builder rawSet;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private com.google.common.collect.ImmutableSortedSet.Builder passes;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
private com.google.common.collect.ImmutableTable.Builder users;
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
BuilderSingularGuavaListsSetsBuilder() {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder card(final T card) {
if (this.cards == null) this.cards = com.google.common.collect.ImmutableList.builder();
this.cards.add(card);
@@ -59,7 +50,6 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder cards(final java.lang.Iterable extends T> cards) {
if (this.cards == null) this.cards = com.google.common.collect.ImmutableList.builder();
this.cards.addAll(cards);
@@ -67,14 +57,12 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder clearCards() {
this.cards = null;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder frog(final Number frog) {
if (this.frogs == null) this.frogs = com.google.common.collect.ImmutableList.builder();
this.frogs.add(frog);
@@ -82,7 +70,6 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder frogs(final java.lang.Iterable extends Number> frogs) {
if (this.frogs == null) this.frogs = com.google.common.collect.ImmutableList.builder();
this.frogs.addAll(frogs);
@@ -90,14 +77,12 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder clearFrogs() {
this.frogs = null;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder rawSet(final java.lang.Object rawSet) {
if (this.rawSet == null) this.rawSet = com.google.common.collect.ImmutableSet.builder();
this.rawSet.add(rawSet);
@@ -105,7 +90,6 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder rawSet(final java.lang.Iterable> rawSet) {
if (this.rawSet == null) this.rawSet = com.google.common.collect.ImmutableSet.builder();
this.rawSet.addAll(rawSet);
@@ -113,14 +97,12 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder clearRawSet() {
this.rawSet = null;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder pass(final String pass) {
if (this.passes == null) this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();
this.passes.add(pass);
@@ -128,7 +110,6 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder passes(final java.lang.Iterable extends String> passes) {
if (this.passes == null) this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();
this.passes.addAll(passes);
@@ -136,14 +117,12 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder clearPasses() {
this.passes = null;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder user(final Number rowKey, final Number columnKey, final String value) {
if (this.users == null) this.users = com.google.common.collect.ImmutableTable.builder();
this.users.put(rowKey, columnKey, value);
@@ -151,7 +130,6 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder users(final com.google.common.collect.Table extends Number, ? extends Number, ? extends String> users) {
if (this.users == null) this.users = com.google.common.collect.ImmutableTable.builder();
this.users.putAll(users);
@@ -159,14 +137,12 @@ class BuilderSingularGuavaListsSets {
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSetsBuilder clearUsers() {
this.users = null;
return this;
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public BuilderSingularGuavaListsSets build() {
com.google.common.collect.ImmutableList cards = this.cards == null ? com.google.common.collect.ImmutableList.of() : this.cards.build();
com.google.common.collect.ImmutableCollection frogs = this.frogs == null ? com.google.common.collect.ImmutableList.of() : this.frogs.build();
@@ -178,15 +154,13 @@ class BuilderSingularGuavaListsSets {
@java.lang.Override
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public java.lang.String toString() {
return "BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder(cards=" + this.cards + ", frogs=" + this.frogs + ", rawSet=" + this.rawSet + ", passes=" + this.passes + ", users=" + this.users + ")";
}
}
@java.lang.SuppressWarnings("all")
@javax.annotation.Generated("lombok")
- @lombok.Generated
public static BuilderSingularGuavaListsSetsBuilder