aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBulgakov Alexander <abulgakov@at-consulting.ru>2016-10-27 23:52:50 +0300
committerBulgakov Alexander <abulgakov@at-consulting.ru>2016-10-27 23:52:50 +0300
commit62672c03855f6035a01c2b84fe783be0f6231899 (patch)
tree0ad968034fd0faa36aa6e25d142e589213e0d103
parent710a04607b2c8c875d1971dd517f9eace10a14b4 (diff)
downloadlombok-62672c03855f6035a01c2b84fe783be0f6231899.tar.gz
lombok-62672c03855f6035a01c2b84fe783be0f6231899.tar.bz2
lombok-62672c03855f6035a01c2b84fe783be0f6231899.zip
Use of the 'var' feature is disabled by default.
Include lombok.var.flagUsage = ALLOW in lombok.config to enable var
-rw-r--r--src/core/lombok/core/configuration/AllowHelper.java37
-rw-r--r--src/core/lombok/core/configuration/FlagUsageType.java2
-rw-r--r--src/core/lombok/core/handlers/HandlerUtil.java86
-rw-r--r--test/transform/resource/after-ecj/VarNullInit.java4
-rw-r--r--test/transform/resource/before/VarComplex.java1
-rw-r--r--test/transform/resource/before/VarInFor.java1
-rw-r--r--test/transform/resource/before/VarInForOld.java1
-rw-r--r--test/transform/resource/before/VarModifier.java1
-rw-r--r--test/transform/resource/before/VarNullInit.java1
9 files changed, 87 insertions, 47 deletions
diff --git a/src/core/lombok/core/configuration/AllowHelper.java b/src/core/lombok/core/configuration/AllowHelper.java
new file mode 100644
index 00000000..31d09381
--- /dev/null
+++ b/src/core/lombok/core/configuration/AllowHelper.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2014 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.core.configuration;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static java.util.Arrays.asList;
+
+public class AllowHelper {
+ private final static Set<String> allowable = new HashSet<String>(asList(
+ "var"
+ ));
+
+ public static boolean isAllowable(String feature) {
+ return allowable.contains(feature);
+ }
+}
diff --git a/src/core/lombok/core/configuration/FlagUsageType.java b/src/core/lombok/core/configuration/FlagUsageType.java
index b7053b7c..8717c22b 100644
--- a/src/core/lombok/core/configuration/FlagUsageType.java
+++ b/src/core/lombok/core/configuration/FlagUsageType.java
@@ -23,5 +23,5 @@ package lombok.core.configuration;
/** Used for lombok configuration to flag usages of certain lombok feature. */
public enum FlagUsageType {
- WARNING, ERROR;
+ WARNING, ERROR, ALLOW;
}
diff --git a/src/core/lombok/core/handlers/HandlerUtil.java b/src/core/lombok/core/handlers/HandlerUtil.java
index a9a4be78..cdca991a 100644
--- a/src/core/lombok/core/handlers/HandlerUtil.java
+++ b/src/core/lombok/core/handlers/HandlerUtil.java
@@ -21,34 +21,25 @@
*/
package lombok.core.handlers;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import lombok.AllArgsConstructor;
-import lombok.ConfigurationKeys;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.ToString;
-import lombok.Value;
+import lombok.*;
import lombok.core.AST;
import lombok.core.AnnotationValues;
import lombok.core.JavaIdentifiers;
import lombok.core.LombokNode;
+import lombok.core.configuration.AllowHelper;
import lombok.core.configuration.ConfigurationKey;
import lombok.core.configuration.FlagUsageType;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import lombok.experimental.Wither;
+import java.util.*;
+import java.util.regex.Pattern;
+
+import static lombok.core.configuration.FlagUsageType.ALLOW;
+import static lombok.core.configuration.FlagUsageType.ERROR;
+import static lombok.core.configuration.FlagUsageType.WARNING;
+
/**
* Container for static utility methods useful for some of the standard lombok handlers, regardless of
* target platform (e.g. useful for both javac and Eclipse lombok implementations).
@@ -73,7 +64,7 @@ public class HandlerUtil {
}
/** Checks if the given name is a valid identifier.
- *
+ *
* If it is, this returns {@code true} and does nothing else.
* If it isn't, this returns {@code false} and adds an error message to the supplied node.
*/
@@ -95,12 +86,19 @@ public class HandlerUtil {
return Singulars.autoSingularize(plural);
}
public static void handleFlagUsage(LombokNode<?, ?, ?> node, ConfigurationKey<FlagUsageType> key, String featureName) {
+ boolean allowable = AllowHelper.isAllowable(featureName);
+
FlagUsageType fut = node.getAst().readConfiguration(key);
+ boolean allowed = !allowable || ALLOW == fut;
+ if (!allowed) {
+ node.addError("Use of " + featureName + " is disabled by default. Please use flag " + ALLOW + " to enable.");
+ }
+
if (fut != null) {
String msg = "Use of " + featureName + " is flagged according to lombok configuration.";
- if (fut == FlagUsageType.WARNING) node.addWarning(msg);
- else node.addError(msg);
+ if (fut == WARNING) node.addWarning(msg);
+ else if (fut == ERROR) node.addError(msg);
}
}
@@ -114,13 +112,13 @@ public class HandlerUtil {
FlagUsageType fut = null;
String featureName = null;
- if (fut1 == FlagUsageType.ERROR) {
+ if (fut1 == ERROR) {
fut = fut1;
featureName = featureName1;
- } else if (fut2 == FlagUsageType.ERROR) {
+ } else if (fut2 == ERROR) {
fut = fut2;
featureName = featureName2;
- } else if (fut1 == FlagUsageType.WARNING) {
+ } else if (fut1 == WARNING) {
fut = fut1;
featureName = featureName1;
} else {
@@ -130,7 +128,7 @@ public class HandlerUtil {
if (fut != null) {
String msg = "Use of " + featureName + " is flagged according to lombok configuration.";
- if (fut == FlagUsageType.WARNING) node.addWarning(msg);
+ if (fut == WARNING) node.addWarning(msg);
else node.addError(msg);
}
}
@@ -161,8 +159,8 @@ public class HandlerUtil {
@SuppressWarnings({"all", "unchecked", "deprecation"})
public static final List<Class<? extends java.lang.annotation.Annotation>> INVALID_ON_BUILDERS = Collections.unmodifiableList(
Arrays.<Class<? extends java.lang.annotation.Annotation>>asList(
- Getter.class, Setter.class, Wither.class, ToString.class, EqualsAndHashCode.class,
- RequiredArgsConstructor.class, AllArgsConstructor.class, NoArgsConstructor.class,
+ Getter.class, Setter.class, Wither.class, ToString.class, EqualsAndHashCode.class,
+ RequiredArgsConstructor.class, AllArgsConstructor.class, NoArgsConstructor.class,
Data.class, Value.class, lombok.experimental.Value.class, FieldDefaults.class));
/**
@@ -170,9 +168,9 @@ public class HandlerUtil {
* For prefixes that end in a letter character, the next character must be a non-lowercase character (i.e. {@code hashCode} is not {@code ashCode} even if
* {@code h} is in the prefix list, but {@code hAshcode} would become {@code ashCode}). The first prefix that matches is used. If the prefix list is empty,
* or the empty string is in the prefix list and no prefix before it matches, the fieldName will be returned verbatim.
- *
+ *
* If no prefix matches and the empty string is not in the prefix list and the prefix list is not empty, {@code null} is returned.
- *
+ *
* @param fieldName The full name of a field.
* @param prefixes A list of prefixes, usually provided by the {@code Accessors} settings annotation, listing field prefixes.
* @return The base name of the field.
@@ -215,19 +213,19 @@ public class HandlerUtil {
/**
* Generates a getter name from a given field name.
- *
+ *
* Strategy:
* <ul>
* <li>Reduce the field's name to its base name by stripping off any prefix (from {@code Accessors}). If the field name does not fit
* the prefix list, this method immediately returns {@code null}.</li>
* <li>If {@code Accessors} has {@code fluent=true}, then return the basename.</li>
* <li>Pick a prefix. 'get' normally, but 'is' if {@code isBoolean} is true.</li>
- * <li>Only if {@code isBoolean} is true: Check if the field starts with {@code is} followed by a non-lowercase character. If so, return the field name verbatim.</li>
+ * <li>Only if {@code isBoolean} is true: Check if the field starts with {@code is} followed by a non-lowercase character. If so, return the field name verbatim.</li>
* <li>Check if the first character of the field is lowercase. If so, check if the second character
* exists and is title or upper case. If so, uppercase the first character. If not, titlecase the first character.</li>
* <li>Return the prefix plus the possibly title/uppercased first character, and the rest of the field name.</li>
* </ul>
- *
+ *
* @param accessors Accessors configuration.
* @param fieldName the name of the field.
* @param isBoolean if the field is of type 'boolean'. For fields of type {@code java.lang.Boolean}, you should provide {@code false}.
@@ -239,19 +237,19 @@ public class HandlerUtil {
/**
* Generates a setter name from a given field name.
- *
+ *
* Strategy:
* <ul>
* <li>Reduce the field's name to its base name by stripping off any prefix (from {@code Accessors}). If the field name does not fit
* the prefix list, this method immediately returns {@code null}.</li>
* <li>If {@code Accessors} has {@code fluent=true}, then return the basename.</li>
* <li>Only if {@code isBoolean} is true: Check if the field starts with {@code is} followed by a non-lowercase character.
- * If so, replace {@code is} with {@code set} and return that.</li>
+ * If so, replace {@code is} with {@code set} and return that.</li>
* <li>Check if the first character of the field is lowercase. If so, check if the second character
* exists and is title or upper case. If so, uppercase the first character. If not, titlecase the first character.</li>
* <li>Return {@code "set"} plus the possibly title/uppercased first character, and the rest of the field name.</li>
* </ul>
- *
+ *
* @param accessors Accessors configuration.
* @param fieldName the name of the field.
* @param isBoolean if the field is of type 'boolean'. For fields of type {@code java.lang.Boolean}, you should provide {@code false}.
@@ -263,18 +261,18 @@ public class HandlerUtil {
/**
* Generates a wither name from a given field name.
- *
+ *
* Strategy:
* <ul>
* <li>Reduce the field's name to its base name by stripping off any prefix (from {@code Accessors}). If the field name does not fit
* the prefix list, this method immediately returns {@code null}.</li>
* <li>Only if {@code isBoolean} is true: Check if the field starts with {@code is} followed by a non-lowercase character.
- * If so, replace {@code is} with {@code with} and return that.</li>
+ * If so, replace {@code is} with {@code with} and return that.</li>
* <li>Check if the first character of the field is lowercase. If so, check if the second character
* exists and is title or upper case. If so, uppercase the first character. If not, titlecase the first character.</li>
* <li>Return {@code "with"} plus the possibly title/uppercased first character, and the rest of the field name.</li>
* </ul>
- *
+ *
* @param accessors Accessors configuration.
* @param fieldName the name of the field.
* @param isBoolean if the field is of type 'boolean'. For fields of type {@code java.lang.Boolean}, you should provide {@code false}.
@@ -315,10 +313,10 @@ public class HandlerUtil {
/**
* Returns all names of methods that would represent the getter for a field with the provided name.
- *
+ *
* For example if {@code isBoolean} is true, then a field named {@code isRunning} would produce:<br />
* {@code [isRunning, getRunning, isIsRunning, getIsRunning]}
- *
+ *
* @param accessors Accessors configuration.
* @param fieldName the name of the field.
* @param isBoolean if the field is of type 'boolean'. For fields of type 'java.lang.Boolean', you should provide {@code false}.
@@ -329,10 +327,10 @@ public class HandlerUtil {
/**
* Returns all names of methods that would represent the setter for a field with the provided name.
- *
+ *
* For example if {@code isBoolean} is true, then a field named {@code isRunning} would produce:<br />
* {@code [setRunning, setIsRunning]}
- *
+ *
* @param accessors Accessors configuration.
* @param fieldName the name of the field.
* @param isBoolean if the field is of type 'boolean'. For fields of type 'java.lang.Boolean', you should provide {@code false}.
@@ -343,10 +341,10 @@ public class HandlerUtil {
/**
* Returns all names of methods that would represent the wither for a field with the provided name.
- *
+ *
* For example if {@code isBoolean} is true, then a field named {@code isRunning} would produce:<br />
* {@code [withRunning, withIsRunning]}
- *
+ *
* @param accessors Accessors configuration.
* @param fieldName the name of the field.
* @param isBoolean if the field is of type 'boolean'. For fields of type 'java.lang.Boolean', you should provide {@code false}.
diff --git a/test/transform/resource/after-ecj/VarNullInit.java b/test/transform/resource/after-ecj/VarNullInit.java
index 966afdc9..ba8c3e46 100644
--- a/test/transform/resource/after-ecj/VarNullInit.java
+++ b/test/transform/resource/after-ecj/VarNullInit.java
@@ -1,10 +1,10 @@
import lombok.experimental.var;
class VarNullInit {
- ValNullInit() {
+ VarNullInit() {
super();
}
void method() {
- final @var java.lang.Object x = null;
+ @var java.lang.Object x = null;
}
} \ No newline at end of file
diff --git a/test/transform/resource/before/VarComplex.java b/test/transform/resource/before/VarComplex.java
index a30492ac..bfaa8804 100644
--- a/test/transform/resource/before/VarComplex.java
+++ b/test/transform/resource/before/VarComplex.java
@@ -1,3 +1,4 @@
+//CONF: lombok.var.flagUsage = ALLOW
import lombok.experimental.var;
public class VarComplex {
diff --git a/test/transform/resource/before/VarInFor.java b/test/transform/resource/before/VarInFor.java
index ed22edc3..cc8c387e 100644
--- a/test/transform/resource/before/VarInFor.java
+++ b/test/transform/resource/before/VarInFor.java
@@ -1,3 +1,4 @@
+//CONF: lombok.var.flagUsage = ALLOW
import lombok.experimental.var;
public class VarInFor {
diff --git a/test/transform/resource/before/VarInForOld.java b/test/transform/resource/before/VarInForOld.java
index 3000f58c..f90aba7f 100644
--- a/test/transform/resource/before/VarInForOld.java
+++ b/test/transform/resource/before/VarInForOld.java
@@ -1,3 +1,4 @@
+//CONF: lombok.var.flagUsage = ALLOW
import lombok.experimental.var;
public class VarInForOld {
diff --git a/test/transform/resource/before/VarModifier.java b/test/transform/resource/before/VarModifier.java
index 5c68caa7..7250c1c5 100644
--- a/test/transform/resource/before/VarModifier.java
+++ b/test/transform/resource/before/VarModifier.java
@@ -1,3 +1,4 @@
+//CONF: lombok.var.flagUsage = ALLOW
import lombok.experimental.var;
public class VarModifier {
diff --git a/test/transform/resource/before/VarNullInit.java b/test/transform/resource/before/VarNullInit.java
index 14d7b4a3..f7f9c55b 100644
--- a/test/transform/resource/before/VarNullInit.java
+++ b/test/transform/resource/before/VarNullInit.java
@@ -1,3 +1,4 @@
+//CONF: lombok.var.flagUsage = ALLOW
import lombok.experimental.var;
class VarNullInit {