Polishing
- Use Java 8 idioms more consistently.
- Use newer Guava idioms more consistently.
- Apply some IntelliJ IDEA refactoring suggestions.
- Other changes made for readability and/or brevity.
Closes #3462.
PiperOrigin-RevId: 164700946
diff --git a/src/main/java/com/google/devtools/common/options/ArgsPreProcessor.java b/src/main/java/com/google/devtools/common/options/ArgsPreProcessor.java
index 516ff1f..00e8033 100644
--- a/src/main/java/com/google/devtools/common/options/ArgsPreProcessor.java
+++ b/src/main/java/com/google/devtools/common/options/ArgsPreProcessor.java
@@ -16,6 +16,7 @@
import java.util.List;
/** Defines a preprocessing service for the "args" string list that is executed before parsing. */
+@FunctionalInterface
interface ArgsPreProcessor {
List<String> preProcess(List<String> args) throws OptionsParsingException;
}
diff --git a/src/main/java/com/google/devtools/common/options/CommandNameCache.java b/src/main/java/com/google/devtools/common/options/CommandNameCache.java
index 13c85b7..622efff 100644
--- a/src/main/java/com/google/devtools/common/options/CommandNameCache.java
+++ b/src/main/java/com/google/devtools/common/options/CommandNameCache.java
@@ -16,6 +16,7 @@
import com.google.common.collect.ImmutableSet;
/** Cache mapping a command to the names of all commands it inherits from, including itself. */
+@FunctionalInterface
public interface CommandNameCache {
/** Class that exists only to expose a static instance variable that can be set and retrieved. */
class CommandNameCacheInstance implements CommandNameCache {
diff --git a/src/main/java/com/google/devtools/common/options/Converters.java b/src/main/java/com/google/devtools/common/options/Converters.java
index aacc64b..cf26e71 100644
--- a/src/main/java/com/google/devtools/common/options/Converters.java
+++ b/src/main/java/com/google/devtools/common/options/Converters.java
@@ -275,9 +275,7 @@
@Override
public List<String> convert(String input) {
- return input.equals("")
- ? ImmutableList.<String>of()
- : ImmutableList.copyOf(splitter.split(input));
+ return input.isEmpty() ? ImmutableList.of() : ImmutableList.copyOf(splitter.split(input));
}
@Override
@@ -311,9 +309,7 @@
try {
int level = Integer.parseInt(input);
return LEVELS[level];
- } catch (NumberFormatException e) {
- throw new OptionsParsingException("Not a log level: " + input);
- } catch (ArrayIndexOutOfBoundsException e) {
+ } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
throw new OptionsParsingException("Not a log level: " + input);
}
}
diff --git a/src/main/java/com/google/devtools/common/options/ExpansionFunction.java b/src/main/java/com/google/devtools/common/options/ExpansionFunction.java
index 1031125..09119b2 100644
--- a/src/main/java/com/google/devtools/common/options/ExpansionFunction.java
+++ b/src/main/java/com/google/devtools/common/options/ExpansionFunction.java
@@ -19,6 +19,7 @@
* A function from an option parser's static setup (what flags it knows about) to a list of
* expansion Strings to use for one of its options.
*/
+@FunctionalInterface
public interface ExpansionFunction {
/**
diff --git a/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java b/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
index 9d8c13a..a66d93e 100644
--- a/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
+++ b/src/main/java/com/google/devtools/common/options/InvocationPolicyEnforcer.java
@@ -19,7 +19,6 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.AllowValues;
import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.DisallowValues;
import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.FlagPolicy;
@@ -30,9 +29,9 @@
import com.google.devtools.common.options.OptionsParser.OptionDescription;
import com.google.devtools.common.options.OptionsParser.OptionValueDescription;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -197,7 +196,7 @@
ImmutableSet<String> commandAndParentCommands =
command == null
- ? ImmutableSet.<String>of()
+ ? ImmutableSet.of()
: CommandNameCache.CommandNameCacheInstance.INSTANCE.get(command);
// Expand all policies to transfer policies on expansion flags to policies on the child flags.
@@ -242,8 +241,7 @@
String expansionFlagName = expansionPolicy.getFlagName();
- ImmutableList.Builder<OptionValueDescription> resultsBuilder =
- ImmutableList.<OptionValueDescription>builder();
+ ImmutableList.Builder<OptionValueDescription> resultsBuilder = ImmutableList.builder();
switch (expansionPolicy.getOperationCase()) {
case SET_VALUE:
{
@@ -307,7 +305,7 @@
ImmutableList<OptionValueDescription> expansions =
getExpansionsFromFlagPolicy(originalPolicy, originalOptionDescription, parser);
- ImmutableList.Builder<OptionValueDescription> subflagBuilder = new ImmutableList.Builder<>();
+ ImmutableList.Builder<OptionValueDescription> subflagBuilder = ImmutableList.builder();
ImmutableList<OptionValueDescription> subflags =
subflagBuilder
.addAll(originalOptionDescription.getImplicitRequirements())
@@ -640,7 +638,7 @@
// of string comparison. For example, "--foo=0", "--foo=false", "--nofoo", and "-f-"
// (if the option has an abbreviation) are all equal for boolean flags. Plus converters
// can be arbitrarily complex.
- Set<Object> convertedPolicyValues = Sets.newHashSet();
+ Set<Object> convertedPolicyValues = new HashSet<>();
for (String value : policyValues) {
Object convertedValue = optionDescription.getConverter().convert(value);
// Some converters return lists, and if the flag is a repeatable flag, the items in the
@@ -807,7 +805,7 @@
parser.parseWithSourceFunction(
OptionPriority.INVOCATION_POLICY,
INVOCATION_POLICY_SOURCE,
- Arrays.asList(String.format("--%s=%s", flagName, flagValue)));
+ ImmutableList.of(String.format("--%s=%s", flagName, flagValue)));
}
}
diff --git a/src/main/java/com/google/devtools/common/options/Options.java b/src/main/java/com/google/devtools/common/options/Options.java
index 88cf5f8..c52e395 100644
--- a/src/main/java/com/google/devtools/common/options/Options.java
+++ b/src/main/java/com/google/devtools/common/options/Options.java
@@ -52,8 +52,7 @@
OptionsParser parser = OptionsParser.newOptionsParser(optionsClass);
parser.parse(OptionPriority.COMMAND_LINE, null, Arrays.asList(args));
List<String> remainingArgs = parser.getResidue();
- return new Options<O>(parser.getOptions(optionsClass),
- remainingArgs.toArray(new String[0]));
+ return new Options<>(parser.getOptions(optionsClass), remainingArgs.toArray(new String[0]));
}
/**
diff --git a/src/main/java/com/google/devtools/common/options/OptionsData.java b/src/main/java/com/google/devtools/common/options/OptionsData.java
index 48f47ff..c5fd9a9 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsData.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsData.java
@@ -125,8 +125,7 @@
IsolatedOptionsData isolatedData = IsolatedOptionsData.from(classes);
// All that's left is to compute expansions.
- ImmutableMap.Builder<Field, ExpansionData> expansionDataBuilder =
- ImmutableMap.<Field, ExpansionData>builder();
+ ImmutableMap.Builder<Field, ExpansionData> expansionDataBuilder = ImmutableMap.builder();
for (Map.Entry<String, Field> entry : isolatedData.getAllNamedFields()) {
Field field = entry.getValue();
Option annotation = field.getAnnotation(Option.class);
@@ -154,7 +153,7 @@
throw new AssertionError(e);
}
- ImmutableList<String> staticExpansion = null;
+ ImmutableList<String> staticExpansion;
try {
staticExpansion = instance.getExpansion(new ExpansionContext(isolatedData, field, null));
Preconditions.checkState(
diff --git a/src/main/java/com/google/devtools/common/options/OptionsParser.java b/src/main/java/com/google/devtools/common/options/OptionsParser.java
index b507785..d4779fe 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsParser.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsParser.java
@@ -14,9 +14,12 @@
package com.google.devtools.common.options;
+import static java.util.Comparator.comparing;
+
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ListMultimap;
import com.google.common.escape.Escaper;
import java.lang.reflect.Constructor;
@@ -25,8 +28,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
@@ -133,7 +134,7 @@
*/
static OptionsData getOptionsDataInternal(Class<? extends OptionsBase> optionsClass)
throws ConstructionException {
- return getOptionsDataInternal(ImmutableList.<Class<? extends OptionsBase>>of(optionsClass));
+ return getOptionsDataInternal(ImmutableList.of(optionsClass));
}
/**
@@ -157,8 +158,7 @@
public static OptionsParser newOptionsParser(
Iterable<? extends Class<? extends OptionsBase>> optionsClasses)
throws ConstructionException {
- return newOptionsParser(
- getOptionsDataInternal(ImmutableList.<Class<? extends OptionsBase>>copyOf(optionsClasses)));
+ return newOptionsParser(getOptionsDataInternal(ImmutableList.copyOf(optionsClasses)));
}
/**
@@ -212,8 +212,7 @@
public void parseAndExitUponError(OptionPriority priority, String source, String[] args) {
for (String arg : args) {
if (arg.equals("--help")) {
- System.out.println(describeOptions(Collections.<String, String>emptyMap(),
- HelpVerbosity.LONG));
+ System.out.println(describeOptions(ImmutableMap.of(), HelpVerbosity.LONG));
System.exit(0);
}
}
@@ -540,7 +539,7 @@
for (Class<? extends OptionsBase> optionsClass : data.getOptionsClasses()) {
allFields.addAll(data.getFieldsForClass(optionsClass));
}
- Collections.sort(allFields, OptionsUsage.BY_CATEGORY);
+ allFields.sort(OptionsUsage.BY_CATEGORY);
String prevCategory = null;
for (Field optionField : allFields) {
@@ -583,7 +582,7 @@
for (Class<? extends OptionsBase> optionsClass : data.getOptionsClasses()) {
allFields.addAll(data.getFieldsForClass(optionsClass));
}
- Collections.sort(allFields, OptionsUsage.BY_CATEGORY);
+ allFields.sort(OptionsUsage.BY_CATEGORY);
String prevCategory = null;
for (Field optionField : allFields) {
@@ -621,26 +620,17 @@
OptionsData data = impl.getOptionsData();
StringBuilder desc = new StringBuilder();
- // List all options
- List<Field> allFields = new ArrayList<>();
- for (Class<? extends OptionsBase> optionsClass : data.getOptionsClasses()) {
- allFields.addAll(data.getFieldsForClass(optionsClass));
- }
- // Sort field for deterministic ordering
- Collections.sort(allFields, new Comparator<Field>() {
- @Override
- public int compare(Field f1, Field f2) {
- String name1 = f1.getAnnotation(Option.class).name();
- String name2 = f2.getAnnotation(Option.class).name();
- return name1.compareTo(name2);
- }
- });
- for (Field optionField : allFields) {
- Option option = optionField.getAnnotation(Option.class);
- if (option.documentationCategory() != OptionDocumentationCategory.UNDOCUMENTED) {
- OptionsUsage.getCompletion(optionField, desc);
- }
- }
+ data.getOptionsClasses()
+ // List all options
+ .stream()
+ .flatMap(optionsClass -> data.getFieldsForClass(optionsClass).stream())
+ // Sort field for deterministic ordering
+ .sorted(comparing(optionField -> optionField.getAnnotation(Option.class).name()))
+ .filter(
+ optionField ->
+ optionField.getAnnotation(Option.class).documentationCategory()
+ != OptionDocumentationCategory.UNDOCUMENTED)
+ .forEach(optionField -> OptionsUsage.getCompletion(optionField, desc));
return desc.toString();
}
@@ -744,8 +734,7 @@
*/
public OptionValueDescription clearValue(String optionName)
throws OptionsParsingException {
- OptionValueDescription clearedValue = impl.clearValue(optionName);
- return clearedValue;
+ return impl.clearValue(optionName);
}
@Override
diff --git a/src/main/java/com/google/devtools/common/options/OptionsParserImpl.java b/src/main/java/com/google/devtools/common/options/OptionsParserImpl.java
index d49d5c4..5ebd4a5 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsParserImpl.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsParserImpl.java
@@ -14,15 +14,15 @@
package com.google.devtools.common.options;
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toCollection;
+
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.devtools.common.options.OptionsParser.OptionDescription;
import com.google.devtools.common.options.OptionsParser.OptionValueDescription;
@@ -31,8 +31,6 @@
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -121,74 +119,50 @@
* Implements {@link OptionsParser#asListOfUnparsedOptions()}.
*/
List<UnparsedOptionValueDescription> asListOfUnparsedOptions() {
- List<UnparsedOptionValueDescription> result = Lists.newArrayList(unparsedValues);
- // It is vital that this sort is stable so that options on the same priority are not reordered.
- Collections.sort(result, new Comparator<UnparsedOptionValueDescription>() {
- @Override
- public int compare(UnparsedOptionValueDescription o1,
- UnparsedOptionValueDescription o2) {
- return o1.getPriority().compareTo(o2.getPriority());
- }
- });
- return result;
+ return unparsedValues
+ .stream()
+ // It is vital that this sort is stable so that options on the same priority are not
+ // reordered.
+ .sorted(comparing(UnparsedOptionValueDescription::getPriority))
+ .collect(toCollection(ArrayList::new));
}
/**
* Implements {@link OptionsParser#asListOfExplicitOptions()}.
*/
List<UnparsedOptionValueDescription> asListOfExplicitOptions() {
- List<UnparsedOptionValueDescription> result = Lists.newArrayList(Iterables.filter(
- unparsedValues,
- new Predicate<UnparsedOptionValueDescription>() {
- @Override
- public boolean apply(UnparsedOptionValueDescription input) {
- return input.isExplicit();
- }
- }));
- // It is vital that this sort is stable so that options on the same priority are not reordered.
- Collections.sort(result, new Comparator<UnparsedOptionValueDescription>() {
- @Override
- public int compare(UnparsedOptionValueDescription o1,
- UnparsedOptionValueDescription o2) {
- return o1.getPriority().compareTo(o2.getPriority());
- }
- });
- return result;
+ return unparsedValues
+ .stream()
+ .filter(UnparsedOptionValueDescription::isExplicit)
+ // It is vital that this sort is stable so that options on the same priority are not
+ // reordered.
+ .sorted(comparing(UnparsedOptionValueDescription::getPriority))
+ .collect(toCollection(ArrayList::new));
}
/**
* Implements {@link OptionsParser#canonicalize}.
*/
List<String> asCanonicalizedList() {
-
- List<UnparsedOptionValueDescription> processed = Lists.newArrayList(
- canonicalizeValues.values());
- // Sort implicit requirement options to the end, keeping their existing order, and sort the
- // other options alphabetically.
- Collections.sort(processed, new Comparator<UnparsedOptionValueDescription>() {
- @Override
- public int compare(UnparsedOptionValueDescription o1, UnparsedOptionValueDescription o2) {
- if (o1.isImplicitRequirement()) {
- return o2.isImplicitRequirement() ? 0 : 1;
- }
- if (o2.isImplicitRequirement()) {
- return -1;
- }
- return o1.getName().compareTo(o2.getName());
- }
- });
-
- List<String> result = new ArrayList<>();
- for (UnparsedOptionValueDescription value : processed) {
-
- // Ignore expansion options.
- if (value.isExpansion()) {
- continue;
- }
-
- result.add("--" + value.getName() + "=" + value.getUnparsedValue());
- }
- return result;
+ return canonicalizeValues
+ .values()
+ .stream()
+ // Sort implicit requirement options to the end, keeping their existing order, and sort
+ // the other options alphabetically.
+ .sorted(
+ (v1, v2) -> {
+ if (v1.isImplicitRequirement()) {
+ return v2.isImplicitRequirement() ? 0 : 1;
+ }
+ if (v2.isImplicitRequirement()) {
+ return -1;
+ }
+ return v1.getName().compareTo(v2.getName());
+ })
+ // Ignore expansion options.
+ .filter(value -> !value.isExpansion())
+ .map(value -> "--" + value.getName() + "=" + value.getUnparsedValue())
+ .collect(toCollection(ArrayList::new));
}
/**
diff --git a/src/main/java/com/google/devtools/common/options/OptionsUsage.java b/src/main/java/com/google/devtools/common/options/OptionsUsage.java
index 5f7c48a..6971e27 100644
--- a/src/main/java/com/google/devtools/common/options/OptionsUsage.java
+++ b/src/main/java/com/google/devtools/common/options/OptionsUsage.java
@@ -21,7 +21,6 @@
import java.lang.reflect.Field;
import java.text.BreakIterator;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.annotation.Nullable;
@@ -43,7 +42,7 @@
static void getUsage(Class<? extends OptionsBase> optionsClass, StringBuilder usage) {
OptionsData data = OptionsParser.getOptionsDataInternal(optionsClass);
List<Field> optionFields = new ArrayList<>(data.getFieldsForClass(optionsClass));
- Collections.sort(optionFields, BY_NAME);
+ optionFields.sort(BY_NAME);
for (Field optionField : optionFields) {
getUsage(optionField, usage, OptionsParser.HelpVerbosity.LONG, null);
}
@@ -119,7 +118,7 @@
String flagName = getFlagName(optionField);
String typeDescription = getTypeDescription(optionField);
Option annotation = optionField.getAnnotation(Option.class);
- usage.append(" --" + flagName);
+ usage.append(" --").append(flagName);
if (helpVerbosity == OptionsParser.HelpVerbosity.SHORT) { // just the name
usage.append('\n');
return;
@@ -128,7 +127,7 @@
usage.append(" [-").append(annotation.abbrev()).append(']');
}
if (!typeDescription.equals("")) {
- usage.append(" (" + typeDescription + "; ");
+ usage.append(" (").append(typeDescription).append("; ");
if (annotation.allowMultiple()) {
usage.append("may be used multiple times");
} else {
@@ -137,7 +136,7 @@
if (OptionsParserImpl.isSpecialNullDefault(defaultValueString, optionField)) {
usage.append("default: see description");
} else {
- usage.append("default: \"" + defaultValueString + "\"");
+ usage.append("default: \"").append(defaultValueString).append("\"");
}
}
usage.append(")");
diff --git a/src/main/java/com/google/devtools/common/options/ParamsFilePreProcessor.java b/src/main/java/com/google/devtools/common/options/ParamsFilePreProcessor.java
index bd1c5a9..30b67ed 100644
--- a/src/main/java/com/google/devtools/common/options/ParamsFilePreProcessor.java
+++ b/src/main/java/com/google/devtools/common/options/ParamsFilePreProcessor.java
@@ -152,11 +152,7 @@
}
// check to see if the current position is escaped
- if (lastChar == '\\') {
- escaped = true;
- } else {
- escaped = false;
- }
+ escaped = (lastChar == '\\');
if (!escaped && current == '\'') {
singleQuoteStart = singleQuoteStart == -1 ? readerPosition : -1;
diff --git a/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java b/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java
index 7d0b8d3..86f87f3 100644
--- a/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java
+++ b/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java
@@ -88,7 +88,7 @@
* @see EqualsTester#addEqualityGroup
*/
public ConverterTester addEqualityGroup(String... inputs) {
- ImmutableList.Builder<WrappedItem> wrapped = new ImmutableList.Builder<>();
+ ImmutableList.Builder<WrappedItem> wrapped = ImmutableList.builder();
ImmutableList<String> inputList = ImmutableList.copyOf(inputs);
inputLists.add(inputList);
for (String input : inputList) {
diff --git a/src/main/java/com/google/devtools/common/options/testing/ConverterTesterMap.java b/src/main/java/com/google/devtools/common/options/testing/ConverterTesterMap.java
index afa0231..cf028b9 100644
--- a/src/main/java/com/google/devtools/common/options/testing/ConverterTesterMap.java
+++ b/src/main/java/com/google/devtools/common/options/testing/ConverterTesterMap.java
@@ -44,7 +44,7 @@
private final ImmutableMap.Builder<Class<? extends Converter<?>>, ConverterTester> delegate;
public Builder() {
- this.delegate = new ImmutableMap.Builder<>();
+ this.delegate = ImmutableMap.builder();
}
/**
@@ -71,9 +71,7 @@
* permitted; duplicates will cause {@link #build} to fail.
*/
public Builder addAll(Iterable<ConverterTester> items) {
- for (ConverterTester item : items) {
- add(item);
- }
+ items.forEach(this::add);
return this;
}
diff --git a/src/main/java/com/google/devtools/common/options/testing/OptionsTester.java b/src/main/java/com/google/devtools/common/options/testing/OptionsTester.java
index fa58462..9ecfdc5 100644
--- a/src/main/java/com/google/devtools/common/options/testing/OptionsTester.java
+++ b/src/main/java/com/google/devtools/common/options/testing/OptionsTester.java
@@ -38,7 +38,7 @@
}
private static ImmutableList<Field> getAllFields(Class<? extends OptionsBase> optionsClass) {
- ImmutableList.Builder<Field> builder = new ImmutableList.Builder<>();
+ ImmutableList.Builder<Field> builder = ImmutableList.builder();
Class<? extends OptionsBase> current = optionsClass;
while (!OptionsBase.class.equals(current)) {
builder.add(current.getDeclaredFields());
@@ -103,7 +103,7 @@
*/
public OptionsTester testAllDefaultValuesTestedBy(ConverterTesterMap testers) {
ImmutableListMultimap.Builder<Class<? extends Converter<?>>, Field> converterClassesBuilder =
- new ImmutableListMultimap.Builder<>();
+ ImmutableListMultimap.builder();
for (Field field : getAllFields(optionsClass)) {
Option option = field.getAnnotation(Option.class);
if (option != null && !Converter.class.equals(option.converter())) {