use of com.google.errorprone.ErrorProneOptions in project error-prone by google.
the class ScannerSupplier method applyOverrides.
/**
* Applies options to this {@link ScannerSupplier}.
*
* <p>Command-line options to override check severities may do any of the following:
* <ul>
* <li>Enable a check that is currently off</li>
* <li>Disable a check that is currently on</li>
* <li>Change the severity of a check that is on, promoting a warning to an error or demoting
* an error to a warning</li>
* </ul>
*
* @param errorProneOptions an {@link ErrorProneOptions} object that encapsulates the overrides
* for this compilation
* @throws InvalidCommandLineOptionException if the override map attempts to disable a check
* that may not be disabled
*/
@CheckReturnValue
public ScannerSupplier applyOverrides(ErrorProneOptions errorProneOptions) throws InvalidCommandLineOptionException {
Map<String, Severity> severityOverrides = errorProneOptions.getSeverityMap();
if (severityOverrides.isEmpty() && !errorProneOptions.isEnableAllChecks() && !errorProneOptions.isDropErrorsToWarnings() && !errorProneOptions.isDisableAllChecks()) {
return this;
}
// Initialize result allChecks map and enabledChecks set with current state of this Supplier.
ImmutableBiMap<String, BugCheckerInfo> checks = getAllChecks();
Map<String, SeverityLevel> severities = new LinkedHashMap<>(severities());
Set<String> disabled = new HashSet<>(disabled());
if (errorProneOptions.isEnableAllChecks()) {
disabled.forEach(c -> severities.put(c, checks.get(c).defaultSeverity()));
disabled.clear();
}
if (errorProneOptions.isDropErrorsToWarnings()) {
getAllChecks().values().stream().filter(c -> c.defaultSeverity() == SeverityLevel.ERROR && c.suppressibility().disableable()).forEach(c -> severities.put(c.canonicalName(), SeverityLevel.WARNING));
}
if (errorProneOptions.isDisableAllChecks()) {
getAllChecks().values().stream().filter(c -> c.suppressibility().disableable()).forEach(c -> disabled.add(c.canonicalName()));
}
// Process overrides
severityOverrides.forEach((checkName, newSeverity) -> {
BugCheckerInfo check = getAllChecks().get(checkName);
if (check == null) {
if (errorProneOptions.ignoreUnknownChecks()) {
return;
}
throw new InvalidCommandLineOptionException(checkName + " is not a valid checker name");
}
switch(newSeverity) {
case OFF:
if (!check.suppressibility().disableable()) {
throw new InvalidCommandLineOptionException(check.canonicalName() + " may not be disabled");
}
severities.remove(check.canonicalName());
disabled.add(check.canonicalName());
break;
case DEFAULT:
severities.put(check.canonicalName(), check.defaultSeverity());
disabled.remove(check.canonicalName());
break;
case WARN:
// Demoting an enabled check from an error to a warning is a form of disabling
if (!disabled().contains(check.canonicalName()) && !check.suppressibility().disableable() && check.defaultSeverity() == SeverityLevel.ERROR) {
throw new InvalidCommandLineOptionException(check.canonicalName() + " is not disableable and may not be demoted to a warning");
}
severities.put(check.canonicalName(), SeverityLevel.WARNING);
disabled.remove(check.canonicalName());
break;
case ERROR:
severities.put(check.canonicalName(), SeverityLevel.ERROR);
disabled.remove(check.canonicalName());
break;
default:
throw new IllegalStateException("Unexpected severity level: " + newSeverity);
}
});
return new ScannerSupplierImpl(checks, ImmutableMap.copyOf(severities), ImmutableSet.copyOf(disabled));
}
use of com.google.errorprone.ErrorProneOptions in project error-prone by google.
the class ScannerSupplierTest method applyOverridesDisablesChecks.
@Test
public void applyOverridesDisablesChecks() throws Exception {
ScannerSupplier ss = ScannerSupplier.fromBugCheckerClasses(ChainingConstructorIgnoresParameter.class, DepAnn.class, LongLiteralLowerCaseSuffix.class);
ErrorProneOptions epOptions = ErrorProneOptions.processArgs(ImmutableList.of("-Xep:LongLiteralLowerCaseSuffix:OFF", "-Xep:ChainingConstructorIgnoresParameter:OFF"));
assertScanner(ss.applyOverrides(epOptions)).hasEnabledChecks(DepAnn.class);
}
use of com.google.errorprone.ErrorProneOptions in project error-prone by google.
the class ScannerSupplierTest method applyOverridesThrowsExceptionWhenDisablingNonDisablableCheck.
@Test
public void applyOverridesThrowsExceptionWhenDisablingNonDisablableCheck() throws Exception {
ScannerSupplier ss = ScannerSupplier.fromBugCheckerClasses(ErrorProneJavaCompilerTest.UnsuppressibleArrayEquals.class);
ErrorProneOptions epOptions = ErrorProneOptions.processArgs(ImmutableList.of("-Xep:ArrayEquals:OFF"));
InvalidCommandLineOptionException exception = expectThrows(InvalidCommandLineOptionException.class, () -> ss.applyOverrides(epOptions));
assertThat(exception.getMessage()).contains("may not be disabled");
}
use of com.google.errorprone.ErrorProneOptions in project error-prone by google.
the class ScannerSupplierTest method applyOverridesDisableAllChecks.
@Test
public void applyOverridesDisableAllChecks() throws Exception {
// Create new scanner.
ScannerSupplier ss = ScannerSupplier.fromBugCheckerClasses(ArrayEquals.class, BadShiftAmount.class, StaticQualifiedUsingExpression.class);
// Make sure all checks in the scanner start enabled.
assertScanner(ss).hasEnabledChecks(ArrayEquals.class, BadShiftAmount.class, StaticQualifiedUsingExpression.class);
// Apply the 'DisableAllChecks' flag, make sure all checks are disabled.
ErrorProneOptions epOptions = ErrorProneOptions.processArgs(ImmutableList.of("-XepDisableAllChecks"));
assertScanner(ss.applyOverrides(epOptions)).hasEnabledChecks();
// Don't suppress unsuppressible checks.
ss = ss.plus(ScannerSupplier.fromBugCheckerClasses(RestrictedApiChecker.class));
assertScanner(ss.applyOverrides(epOptions)).hasEnabledChecks(RestrictedApiChecker.class);
// Apply 'DisableAllChecks' flag with another -Xep flag
epOptions = ErrorProneOptions.processArgs(ImmutableList.of("-XepDisableAllChecks", "-Xep:ArrayEquals:ERROR"));
// Make sure the severity flag overrides the global disable flag.
assertScanner(ss.applyOverrides(epOptions)).hasEnabledChecks(RestrictedApiChecker.class, ArrayEquals.class);
// Order matters. The DisableAllChecks flag should override all severities that come before it.
epOptions = ErrorProneOptions.processArgs(ImmutableList.of("-Xep:ArrayEquals:ERROR", "-XepDisableAllChecks"));
// Make sure the global disable flag overrides flags that come before it.
assertScanner(ss.applyOverrides(epOptions)).hasEnabledChecks(RestrictedApiChecker.class);
// The 'DisableAllChecks' flag doesn't populate through to additional plugins.
assertScanner(ss.applyOverrides(epOptions).plus(ScannerSupplier.fromBugCheckerClasses(DivZero.class))).hasEnabledChecks(RestrictedApiChecker.class, DivZero.class);
}
use of com.google.errorprone.ErrorProneOptions in project error-prone by google.
the class ScannerSupplierTest method applyOverridesSucceedsWhenDisablingUnknownCheckAndIgnoreUnknownCheckNamesIsSet.
@Test
public void applyOverridesSucceedsWhenDisablingUnknownCheckAndIgnoreUnknownCheckNamesIsSet() throws Exception {
ScannerSupplier ss = ScannerSupplier.fromBugCheckerClasses(ArrayEquals.class);
ErrorProneOptions epOptions = ErrorProneOptions.processArgs(ImmutableList.of("-XepIgnoreUnknownCheckNames", "-Xep:foo:OFF"));
assertScanner(ss.applyOverrides(epOptions)).hasEnabledChecks(ArrayEquals.class);
}
Aggregations