Skip to content

Commit

Permalink
Standardize list of on-by-default checks
Browse files Browse the repository at this point in the history
Currently we have different methods for enabling checks internally and
externally, and this leads to skew for which checks are on in each
environment.

Note that this doesn't fix the problem for warnings checks, only errors.
Those still need to be synced manually.

RELNOTES: Synchronize list of on-by-default checks for open-source Error Prone
and internal Error Prone.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=90828929
  • Loading branch information
eaftan authored and cushon committed Apr 17, 2015
1 parent 3bd1bd7 commit b966bb6
Show file tree
Hide file tree
Showing 5 changed files with 236 additions and 53 deletions.
Expand Up @@ -121,7 +121,7 @@ public static class Builder {
private DiagnosticListener<? super JavaFileObject> diagnosticListener = null;
private PrintWriter errOutput = new PrintWriter(System.err, true);
private String compilerName = "javac (with error-prone)";
private ScannerSupplier scannerSupplier = BuiltInCheckerSuppliers.matureChecks();
private ScannerSupplier scannerSupplier = BuiltInCheckerSuppliers.defaultChecks();

public ErrorProneCompiler build() {
return new ErrorProneCompiler(
Expand Down
Expand Up @@ -57,7 +57,7 @@ public ErrorProneJavaCompiler() {

// package-private for testing
ErrorProneJavaCompiler(JavaCompiler javacTool) {
this(javacTool, BuiltInCheckerSuppliers.matureChecks());
this(javacTool, BuiltInCheckerSuppliers.defaultChecks());
}

public ErrorProneJavaCompiler(ScannerSupplier scannerSupplier) {
Expand Down
Expand Up @@ -55,8 +55,8 @@
summary = "Mockito cannot mock final classes",
explanation = "Mockito cannot mock final classes. See "
+ "https://github.com/mockito/mockito/wiki/FAQ for details.",
category = Category.MOCKITO, maturity = MaturityLevel.EXPERIMENTAL,
severity = SeverityLevel.ERROR)
category = Category.MOCKITO, maturity = MaturityLevel.MATURE,
severity = SeverityLevel.WARNING)
public class CannotMockFinalClass extends BugChecker implements MethodInvocationTreeMatcher,
VariableTreeMatcher {
// TODO(user): consider stopping mocks of primitive types here or in its own checker
Expand Down
Expand Up @@ -16,15 +16,110 @@

package com.google.errorprone.scanner;

import com.google.common.base.Predicate;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.reflect.ClassPath;
import com.google.common.reflect.ClassPath.ClassInfo;
import com.google.errorprone.BugPattern;
import com.google.errorprone.BugPattern.MaturityLevel;
import com.google.common.collect.Iterables;
import com.google.errorprone.bugpatterns.ArrayEquals;
import com.google.errorprone.bugpatterns.ArrayHashCode;
import com.google.errorprone.bugpatterns.ArrayToString;
import com.google.errorprone.bugpatterns.ArrayToStringCompoundAssignment;
import com.google.errorprone.bugpatterns.ArrayToStringConcatenation;
import com.google.errorprone.bugpatterns.ArraysAsListPrimitiveArray;
import com.google.errorprone.bugpatterns.AssertFalse;
import com.google.errorprone.bugpatterns.AsyncFunctionReturnsNull;
import com.google.errorprone.bugpatterns.BadShiftAmount;
import com.google.errorprone.bugpatterns.BugChecker;

import java.io.IOException;
import com.google.errorprone.bugpatterns.CannotMockFinalClass;
import com.google.errorprone.bugpatterns.ChainingConstructorIgnoresParameter;
import com.google.errorprone.bugpatterns.CheckReturnValue;
import com.google.errorprone.bugpatterns.ClassCanBeStatic;
import com.google.errorprone.bugpatterns.ClassName;
import com.google.errorprone.bugpatterns.CollectionIncompatibleType;
import com.google.errorprone.bugpatterns.ComparisonOutOfRange;
import com.google.errorprone.bugpatterns.CompileTimeConstantChecker;
import com.google.errorprone.bugpatterns.CovariantEquals;
import com.google.errorprone.bugpatterns.DeadException;
import com.google.errorprone.bugpatterns.DepAnn;
import com.google.errorprone.bugpatterns.DivZero;
import com.google.errorprone.bugpatterns.ElementsCountedInLoop;
import com.google.errorprone.bugpatterns.EmptyIfStatement;
import com.google.errorprone.bugpatterns.EqualsHashCode;
import com.google.errorprone.bugpatterns.EqualsNaN;
import com.google.errorprone.bugpatterns.FallThroughSuppression;
import com.google.errorprone.bugpatterns.Finally;
import com.google.errorprone.bugpatterns.ForOverrideChecker;
import com.google.errorprone.bugpatterns.GuiceAssistedInjectScoping;
import com.google.errorprone.bugpatterns.GuiceAssistedParameters;
import com.google.errorprone.bugpatterns.GuiceInjectOnFinalField;
import com.google.errorprone.bugpatterns.GuiceOverridesGuiceInjectableMethod;
import com.google.errorprone.bugpatterns.GuiceOverridesJavaxInjectableMethod;
import com.google.errorprone.bugpatterns.IncompatibleModifiersChecker;
import com.google.errorprone.bugpatterns.InjectAssistedInjectAndInjectOnConstructors;
import com.google.errorprone.bugpatterns.InjectAssistedInjectAndInjectOnSameConstructor;
import com.google.errorprone.bugpatterns.InjectInvalidTargetingOnScopingAnnotation;
import com.google.errorprone.bugpatterns.InjectJavaxInjectOnAbstractMethod;
import com.google.errorprone.bugpatterns.InjectJavaxInjectOnFinalField;
import com.google.errorprone.bugpatterns.InjectMoreThanOneInjectableConstructor;
import com.google.errorprone.bugpatterns.InjectMoreThanOneQualifier;
import com.google.errorprone.bugpatterns.InjectMoreThanOneScopeAnnotationOnClass;
import com.google.errorprone.bugpatterns.InjectOverlappingQualifierAndScopeAnnotation;
import com.google.errorprone.bugpatterns.InjectScopeAnnotationOnInterfaceOrAbstractClass;
import com.google.errorprone.bugpatterns.InjectScopeOrQualifierAnnotationRetention;
import com.google.errorprone.bugpatterns.InjectedConstructorAnnotations;
import com.google.errorprone.bugpatterns.InvalidPatternSyntax;
import com.google.errorprone.bugpatterns.JUnit3TestNotRun;
import com.google.errorprone.bugpatterns.JUnit4SetUpNotRun;
import com.google.errorprone.bugpatterns.JUnit4TearDownNotRun;
import com.google.errorprone.bugpatterns.JUnit4TestNotRun;
import com.google.errorprone.bugpatterns.JUnitAmbiguousTestClass;
import com.google.errorprone.bugpatterns.LongLiteralLowerCaseSuffix;
import com.google.errorprone.bugpatterns.MalformedFormatString;
import com.google.errorprone.bugpatterns.MissingCasesInEnumSwitch;
import com.google.errorprone.bugpatterns.MissingFail;
import com.google.errorprone.bugpatterns.MisusedFormattingLogger;
import com.google.errorprone.bugpatterns.MisusedWeekYear;
import com.google.errorprone.bugpatterns.ModifyingCollectionWithItself;
import com.google.errorprone.bugpatterns.NarrowingCompoundAssignment;
import com.google.errorprone.bugpatterns.NoAllocationChecker;
import com.google.errorprone.bugpatterns.NonAtomicVolatileUpdate;
import com.google.errorprone.bugpatterns.NonCanonicalStaticImport;
import com.google.errorprone.bugpatterns.NonFinalCompileTimeConstant;
import com.google.errorprone.bugpatterns.NonRuntimeAnnotation;
import com.google.errorprone.bugpatterns.NullablePrimitive;
import com.google.errorprone.bugpatterns.NumericEquality;
import com.google.errorprone.bugpatterns.Overrides;
import com.google.errorprone.bugpatterns.PackageLocation;
import com.google.errorprone.bugpatterns.PreconditionsCheckNotNull;
import com.google.errorprone.bugpatterns.PreconditionsCheckNotNullPrimitive;
import com.google.errorprone.bugpatterns.PreconditionsExpensiveString;
import com.google.errorprone.bugpatterns.PreconditionsInvalidPlaceholder;
import com.google.errorprone.bugpatterns.PrimitiveArrayPassedToVarargsMethod;
import com.google.errorprone.bugpatterns.ProtoFieldNullComparison;
import com.google.errorprone.bugpatterns.ProtoFieldPreconditionsCheckNotNull;
import com.google.errorprone.bugpatterns.ProtoStringFieldReferenceEquality;
import com.google.errorprone.bugpatterns.RequiredModifiersChecker;
import com.google.errorprone.bugpatterns.ReturnValueIgnored;
import com.google.errorprone.bugpatterns.SelfAssignment;
import com.google.errorprone.bugpatterns.SelfEquality;
import com.google.errorprone.bugpatterns.SelfEquals;
import com.google.errorprone.bugpatterns.SizeGreaterThanOrEqualsZero;
import com.google.errorprone.bugpatterns.StaticAccessedFromInstance;
import com.google.errorprone.bugpatterns.StringBuilderInitWithChar;
import com.google.errorprone.bugpatterns.StringEquality;
import com.google.errorprone.bugpatterns.SuppressWarningsDeprecated;
import com.google.errorprone.bugpatterns.TryFailThrowable;
import com.google.errorprone.bugpatterns.TypeParameterUnusedInFormals;
import com.google.errorprone.bugpatterns.UnnecessaryStaticImport;
import com.google.errorprone.bugpatterns.UnnecessaryTypeArgument;
import com.google.errorprone.bugpatterns.WaitNotInLoop;
import com.google.errorprone.bugpatterns.WildcardImport;
import com.google.errorprone.bugpatterns.WrongParameterPackage;
import com.google.errorprone.bugpatterns.threadsafety.GuardedByChecker;
import com.google.errorprone.bugpatterns.threadsafety.GuardedByValidator;
import com.google.errorprone.bugpatterns.threadsafety.LockMethodChecker;
import com.google.errorprone.bugpatterns.threadsafety.SynchronizeOnNonFinalField;
import com.google.errorprone.bugpatterns.threadsafety.UnlockMethodChecker;

/**
* Static helper class that provides {@link ScannerSupplier}s and {@link BugChecker}s
Expand All @@ -33,59 +128,147 @@
public class BuiltInCheckerSuppliers {

/**
* Returns a {@link ScannerSupplier} with all {@link BugChecker}s in error-prone.
* Returns a {@link ScannerSupplier} with all {@link BugChecker}s in Error Prone.
*/
public static ScannerSupplier allChecks() {
return ScannerSupplier.fromBugCheckerClasses(BUILT_IN_CHECKERS_LIST);
return ScannerSupplier.fromBugCheckers(
Iterables.concat(ENABLED_ERRORS, ENABLED_WARNINGS, DISABLED_CHECKS));
}

/**
* Returns a {@link ScannerSupplier} with all {@link BugChecker}s in error-prone that have
* {@code maturity == MaturityLevel.MATURE}.
* Returns a {@link ScannerSupplier} with the {@link BugChecker}s that are in the ENABLED lists.
*/
public static ScannerSupplier matureChecks() {
return allChecks().filter(MATURE);
public static ScannerSupplier defaultChecks() {
return allChecks().filter(
Predicates.or(
Predicates.in(ENABLED_ERRORS),
Predicates.in(ENABLED_WARNINGS)));
}

/**
* A list of all {@link BugChecker} classes known reflectively to error-prone.
*
* <p>TODO(user): This may be slow if the compiler classpath (not the compilation classpath) is
* large. Consider using an annotation processor to compute this list at compile time to avoid
* reflection.
* Returns a {@link ScannerSupplier} with the {@link BugChecker}s that are in the ENABLED_ERRORS
* list.
*/
private static final ImmutableList<Class<? extends BugChecker>> BUILT_IN_CHECKERS_LIST;
static {
ImmutableList.Builder<Class<? extends BugChecker>> listBuilder = ImmutableList.builder();
ClassPath classPath;
try {
classPath = ClassPath.from(ScannerSupplier.class.getClassLoader());
} catch (IOException e) {
throw new LinkageError();
}
for (ClassInfo classInfo : classPath.getAllClasses()) {
// We could allow classes in other packages to be auto-discovered, but loading everything
// on the classpath is slower and requires more error handling.
if (!classInfo.getPackageName().startsWith("com.google.errorprone.bugpatterns")) {
continue;
}
Class<?> clazz = classInfo.load();
if (clazz.isAnnotationPresent(BugPattern.class) && BugChecker.class.isAssignableFrom(clazz)) {
listBuilder.add(clazz.asSubclass(BugChecker.class));
}
}
BUILT_IN_CHECKERS_LIST = listBuilder.build();
public static ScannerSupplier errorChecks() {
return allChecks().filter(Predicates.in(ENABLED_ERRORS));
}

/**
* A predicate for mature checks.
* A list of all checks with severity ERROR that are on by default.
*/
@VisibleForTesting
static final ImmutableList<BugChecker> ENABLED_ERRORS = ImmutableList.of(
new ArrayEquals(),
new ArrayHashCode(),
new ArrayToString(),
new ArrayToStringCompoundAssignment(),
new ArrayToStringConcatenation(),
new BadShiftAmount(),
new ChainingConstructorIgnoresParameter(),
new CheckReturnValue(),
new ComparisonOutOfRange(),
new CompileTimeConstantChecker(),
new DeadException(),
new DepAnn(),
new EqualsNaN(),
new ForOverrideChecker(),
new GuiceAssistedInjectScoping(),
new GuardedByValidator(),
new GuardedByChecker(),
new InvalidPatternSyntax(),
new JUnit3TestNotRun(),
new JUnit4SetUpNotRun(),
new JUnit4TearDownNotRun(),
new JUnit4TestNotRun(),
new LongLiteralLowerCaseSuffix(),
new MisusedWeekYear(),
new NonFinalCompileTimeConstant(),
new Overrides(),
new PreconditionsCheckNotNull(),
new PreconditionsCheckNotNullPrimitive(),
new ProtoFieldNullComparison(),
new ReturnValueIgnored(),
new SelfAssignment(),
new SelfEquals(),
new SizeGreaterThanOrEqualsZero(),
new StringBuilderInitWithChar(),
new SuppressWarningsDeprecated(),
new TryFailThrowable());

/**
* A list of all checks with severity WARNING that are on by default.
*/
@VisibleForTesting
static final ImmutableList<BugChecker> ENABLED_WARNINGS = ImmutableList.of(
new CannotMockFinalClass(),
new ElementsCountedInLoop(),
new EqualsHashCode(),
new Finally(),
new IncompatibleModifiersChecker(),
new NonAtomicVolatileUpdate(),
new MisusedFormattingLogger(),
new PreconditionsInvalidPlaceholder(),
new RequiredModifiersChecker(),
new StaticAccessedFromInstance(),
new StringEquality(),
new WaitNotInLoop(),
new SynchronizeOnNonFinalField(),
new TypeParameterUnusedInFormals());

/**
* A list of all checks that are off by default.
*/
private static final Predicate<BugChecker> MATURE = new Predicate<BugChecker>() {
@Override
public boolean apply(BugChecker input) {
return (input.maturity() == MaturityLevel.MATURE);
}
};
@VisibleForTesting
static final ImmutableList<BugChecker> DISABLED_CHECKS = ImmutableList.<BugChecker>of(
new ArraysAsListPrimitiveArray(),
new AssertFalse(),
new AsyncFunctionReturnsNull(),
new ClassCanBeStatic(),
new ClassName(),
new CollectionIncompatibleType(),
new CovariantEquals(),
new DivZero(),
new EmptyIfStatement(),
new FallThroughSuppression(),
new GuiceAssistedParameters(),
new GuiceInjectOnFinalField(),
new GuiceOverridesGuiceInjectableMethod(),
new GuiceOverridesJavaxInjectableMethod(),
new InjectAssistedInjectAndInjectOnConstructors(),
new InjectAssistedInjectAndInjectOnSameConstructor(),
new InjectedConstructorAnnotations(),
new InjectInvalidTargetingOnScopingAnnotation(),
new InjectJavaxInjectOnAbstractMethod(),
new InjectJavaxInjectOnFinalField(),
new InjectMoreThanOneInjectableConstructor(),
new InjectMoreThanOneQualifier(),
new InjectMoreThanOneScopeAnnotationOnClass(),
new InjectOverlappingQualifierAndScopeAnnotation(),
new InjectScopeAnnotationOnInterfaceOrAbstractClass(),
new InjectScopeOrQualifierAnnotationRetention(),
new JUnitAmbiguousTestClass(),
new LockMethodChecker(),
new MalformedFormatString(),
new MissingCasesInEnumSwitch(),
new MissingFail(),
new ModifyingCollectionWithItself(),
new NarrowingCompoundAssignment(),
new NoAllocationChecker(),
new NonCanonicalStaticImport(),
new NonRuntimeAnnotation(),
new NullablePrimitive(),
new NumericEquality(),
new PackageLocation(),
new PreconditionsExpensiveString(),
new PrimitiveArrayPassedToVarargsMethod(),
new ProtoFieldPreconditionsCheckNotNull(),
new ProtoStringFieldReferenceEquality(),
new SelfEquality(),
new UnlockMethodChecker(),
new UnnecessaryStaticImport(),
new UnnecessaryTypeArgument(),
new WildcardImport(),
new WrongParameterPackage());

// May not be instantiated
private BuiltInCheckerSuppliers() {}
Expand Down
Expand Up @@ -31,7 +31,7 @@

/**
* Tests for {@code CannotMockFinalClass}.
*
*
* @author Louis Wasserman
*/
@RunWith(JUnit4.class)
Expand Down Expand Up @@ -59,7 +59,7 @@ public void mockingFinalClassWithAnnotationFails() {
exception.expect(MockitoException.class);
MockitoAnnotations.initMocks(new MocksFinalClassWithAnnotation());
}

@Test
public void mockingFinalClassWithMockMethodFails() {
exception.expect(MockitoException.class);
Expand All @@ -68,7 +68,7 @@ public void mockingFinalClassWithMockMethodFails() {

@Test
public void testPositiveCase() throws Exception {
compilationHelper.assertCompileFailsWithMessages(compilationHelper.fileManager()
compilationHelper.assertCompileSucceedsWithMessages(compilationHelper.fileManager()
.sources(getClass(), "CannotMockFinalClassPositiveCases.java"));
}

Expand Down

0 comments on commit b966bb6

Please sign in to comment.