Releases: google/error-prone
Error Prone 2.7.1
Everything in Error Prone 2.7.0, plus an additional fix for JDK 17.
Error Prone 2.7.0
Changes
- Initial support for running on JDK 17 EA builds. Supports for Java 17 languages features is incomplete; bug reports for issues with Java 17 are welcome.
@InlineMe
is a deprecation mechanism that allows automated tools to cleanup existing callers: http://errorprone.info/docs/inlineme
New checks:
Closed issues: #2257, #2260, #2282, #2301, #2322, #2323, #2324
Error Prone 2.6.0
Checkers Added:
- CharacterGetNumericValue
- ErroneousThreadPoolConstructorChecker
- FloggerArgumentToString
- FloggerStringConcatenation
- ProtoBuilderReturnValueIgnored
- RethrowReflectiveOperationExceptionAsLinkageError
- SystemOut
- UnnecessaryAnonymousClass
Issues Closed:
- RFE: configurable DoNotCall/RestrictedApi/JdkObsolete/DefaultCharset/JavaTimeDefaultTimeZone check (#1211)
- Add SystemOut checker (#1534)
- WellKnownMutability: add java.awt.Color (#1682)
- IdentityHashMapUsage warnings differ from its documentation (#2095)
- UnusedMethod no longer works (#2215)
- Document naming convention for UnusedMethod (#2223)
Error Prone 2.5.1
Changes
NoSuchMethodError: 'com.sun.tools.javac.util.List com.sun.tools.javac.code.Symbol$TypeSymbol.getEnclosedElements
- Fixed
NoSuchMethodError
crash inHidingField
(#2092) - Fixed
NoSuchElementException
crash inRestrictedApiChecker
(#2099) - False positive in
DifferentNameButSame
(#2094) - False positive in
UnnecessaryOptionalGet
(#2101) - False positive in
UnnecessaryMethodReference
(#2102) - Fixed a regression in JDK 16-EA support (#2105)
Error Prone 2.5.0
New checks:
- BanSerializableRead
- CatchingUnchecked
- ComputeIfAbsentAmbiguousReference
- DangerousLiteralNull
- DateChecker
- DifferentNameButSame
- DoNotCallSuggester
- DoNotClaimAnnotations
- DoNotMockAutoValue
- FloggerFormatString
- FloggerLogVarargs
- FloggerLogWithCause
- FloggerMessageFormat
- FloggerPassedAround
- FloggerRedundantIsEnabled
- FloggerRequiredModifiers
- FloggerSplitLogStatement
- FloggerWithCause
- FloggerWithoutCause
- HashCodeToString
- IdentityHashMapUsage
- ImmutableMemberCollection
- ImmutableSetForContains
- InitializeInline
- InvalidThrowsLink
- IsInstanceIncompatibleType
- JavaUtilDate
- JodaConstructors
- JodaDateTimeConstants
- LongFloatConversion
- MemberName
- MisplacedScopeAnnotations
- ObjectEqualsForPrimitives
- OptionalMapUnusedValue
- ReturnsNullCollection
- StaticMockMember
- StreamToIterable
- SymbolToString
- TypeToString
- UnnecessarilyVisible
- UnnecessaryMethodReference
- UnnecessaryOptionalGet
- UnsafeLocaleUsage
- UseEnumSwitch
- UseTimeInScope
- WrongOneof
- ZoneIdOfZ
Fixed issues: #1044 #1177 #1275 #1322 #1326 #1503 #1529 #1563 #1645 #1650 #1652 #1653 #1655 #1665 #1670 #1672 #1694 #1699 #1705 #1767 #1788 #1809 #1849 #1873 #1916 #1981 #1982 #1986 #1987 #2009 #2026 #2029 #2059 #2064
Error Prone 2.4.0
Support for latest JDK versions: Error Prone is now compatible with JDK 8 through JDK 14, as well as early access builds of JDK 15.
New checks:
- AutoValueSubclassLeaked
- CacheLoaderNull
- CheckedExceptionNotThrown
- CollectionUndefinedEquality
- ConstantPatternCompile
- DefaultPackage
- EmptyCatch
- FieldCanBeStatic
- ForEachIterable
- FromTemporalAccessor
- IdentityHashMapBoxing
- IgnoredPureGetter
- InlineFormatString
- InvalidLink
- LockOnBoxedPrimitive
- LossyPrimitiveCompare
- MisusedDayOfYear
- MutablePublicArray
- NonCanonicalType
- NullOptional
- ProtectedMembersInFinalClass
- PublicConstructorForAbstractClass
- RedundantCondition
- StaticAssignmentInConstructor
- StronglyTypeTime
- SuppressWarningsWithoutExplanation
- TruthGetOrDefault
- UnnecessarilyFullyQualified
- UrlInSee
Fixed issues: #1070, #1106, #1107, #1110, #1111, #1187, #1208, #1239, #1265, #1428, #1432, #1433, #1439, #1444, #1447, #1449, #1451, #1454, #1455, #1458, #1462, #1473, #1491, #1531, #1558, #1565, #1570, #1573, #1586, #1587, #1590, #1591, #1602, #1606, #1609, #1624, #776, #785, #930
Error Prone 2.3.4
Performance Improvements: 40% speedup when run against Google's codebase with errors enabled.
New Checks:
- AlmostJavadoc
- BoxedPrimitiveEquality
- ChainedAssertionLosesContext
- CheckNotNullMultipleTimes
- DescribeMatch
- DoNotMockChecker and @DoNotMock
- DurationTemporalUnit
- EmptyBlockTag
- ExtendsAutoValue
- FieldCanBeLocal
- ImplementAssertionWithChaining
- Incomparable
- InstantTemporalUnit
- InterruptedExceptionSwallowed
- InvalidJavaTimeConstant
- JavaLocalDateTimeGetNano
- JavaLocalTimeGetNano
- JavaPeriodGetDays
- LiteEnumValueOf
- LiteProtoToString
- LocalDateTemporalAmount
- ModifySourceCollectionInStream
- ParametersButNotParameterized
- PreferJavaTimeOverload
- PrimitiveAtomicReference
- SameNameButDifferent
- TheoryButNoTheories
- ThrowSpecificExceptions
- TransientMisuse
- UnnecessaryAnonymousClass
- UnnecessaryBoxedAssignment
- UnnecessaryBoxedVariable
- UnnecessaryLambda
- UnnecessaryMethodInvocationMatcher
- WithSignatureDiscouraged
- XorPower
Removed, moved, or disabled:
- Moved Mockito checks into Mockito Error Prone Subproject.
- Merged PreconditionsCheckNotNull and PreconditionsCheckNotNullPrimitive into UnnecessaryCheckNotNull.
- Deleted DeprecatedThreadMethods in favour of general-purpose deprecation warnings.
- Disabled ProvidesFixChecker as it causes too much noise.
Fixed issues: #1106, #1225, #1231, #1234, #1238, #1241, #1246, #1252, #1259, #1260, #1271, #1274, #1287, #1308, #1316, #1329, #1373, #1391, #1408
Error Prone 2.3.3
New checks:
AssignmentToMock
: Fields annotated with @mock should not be manually assigned to.AutoValueImmutableFields
: AutoValue recommends using immutable collectionsCompareToZero
: The result of #compareTo or #compare should only be compared to 0. It is an implementation detail whether a given type returns strictly the values {-1, 0, +1} or others.DeduplicateConstants
: This expression was previously declared as a constant; consider replacing this occurrence.DiscardedPostfixExpression
: The result of this unary operation on a lambda parameter is discardedDuplicateMapKeys
: Map#ofEntries will throw an IllegalArgumentException if there are any duplicate keysEscapedEntity
: HTML entities in @code/@literal tags will appear literally in the rendered javadoc.InheritDoc
: Invalid use of @inheritdoc.InterfaceWithOnlyStatics
: This interface only contains static fields and methods; consider making it a final class instead to prevent subclassing.InvalidBlockTag
: This tag is invalid.InvalidInlineTag
: This tag is invalid.MissingSummary
: A summary line is required on public/protected Javadocs.MixedDescriptors
: The field number passed into #getFieldByNumber belongs to a different proto to the Descriptor.MixedMutabilityReturnType
: This method returns both mutable and immutable collections or maps from different paths. This may be confusing for users of the method.MockitoInternalUsage
: org.mockito.internal.* is a private API and should not be used by clientsOptionalMapToOptional
: Mapping to another Optional will yield a nested Optional. Did you mean flatMap?OutlineNone
: Setting CSS outline style to none or 0 (while not otherwise providing visual focus indicators) is inaccessible for users navigating a web page without a mouse.PreconditionsCheckNotNullRepeated
: Including the first argument of checkNotNull in the failure message is not useful, as it will always benull
.RedundantOverride
: This override is redundant, and can be removed.RefersToDaggerCodegen
: Don't refer to Dagger's internal or generated codeRxReturnValueIgnored
: Returned Rx objects must be checked. Ignoring a returned Rx value means it is never scheduled for executionTreeToString
: Tree#toString shouldn't be used for Trees deriving from the code being compiled, as it discards whitespace and comments.TypeEquals
: com.sun.tools.javac.code.Type doesn't override Object.equals and instances are not interned by javac, so testing types for equality should be done with Types#isSameType insteadUnescapedEntity
: Javadoc is interpreted as HTML, so HTML entities such as &, <, > must be escaped.UnusedMethod
: Unused.UnusedNestedClass
: This nested class is unused, and can be removed.UnusedVariable
: Unused.
New date and time related checks:
JavaDurationGetSecondsGetNano
: duration.getNano() only accesses the underlying nanosecond adjustment from the whole second.JavaDurationWithNanos
: Use of java.time.Duration.withNanos(int) is not allowed.JavaDurationWithSeconds
: Use of java.time.Duration.withSeconds(long) is not allowed.JavaInstantGetSecondsGetNano
: instant.getNano() only accesses the underlying nanosecond adjustment from the whole second.JavaTimeDefaultTimeZone
: java.time APIs that silently use the default system time-zone are not allowed.JodaDurationConstructor
: Use of new Duration(long) is not allowed. Please use Duration.millis(long) instead.JodaDurationWithMillis
: Use of duration.withMillis(long) is not allowed. Please use Duration.millis(long) instead.JodaInstantWithMillis
: Use of instant.withMillis(long) is not allowed. Please use new Instant(long) instead.JodaNewPeriod
: This may have surprising semantics, e.g. new Period(LocalDate.parse("1970-01-01"), LocalDate.parse("1970-02-02")).getDays() == 1, not 32.JodaPlusMinusLong
: Use of JodaTime's type.plus(long) or type.minus(long) is not allowed (where = {Duration,Instant,DateTime,DateMidnight}). Please use type.plus(Duration.millis(long)) or type.minus(Duration.millis(long)) instead.JodaTimeConverterManager
: Joda-Time's ConverterManager makes the semantics of DateTime/Instant/etc construction subject to global static state. If you need to define your own converters, use a helper.JodaToSelf
: Use of Joda-Time's DateTime.toDateTime(), Duration.toDuration(), Instant.toInstant(), Interval.toInterval(), and Period.toPeriod() are not allowed.JodaWithDurationAddedLong
: Use of JodaTime's type.withDurationAdded(long, int) (where = {Duration,Instant,DateTime}). Please use type.withDurationAdded(Duration.millis(long), int) instead.TemporalAccessorGetChronoField
: TemporalAccessor.get() only works for certain values of ChronoField.TimeUnitConversionChecker
: This TimeUnit conversion looks buggy: converting from a smaller unit to a larger unit (and passing a constant), converting to/from the same TimeUnit, or converting TimeUnits where the result is statically known to be 0 or 1 are all buggy patterns.DurationFrom
: Duration.from(Duration) returns itself; from(Period) throws a runtime exception.DurationGetTemporalUnit
: Duration.get() only works with SECONDS or NANOS.DurationToLongTimeUnit
: Unit mismatch when decomposing a Duration or Instant to call a <long, TimeUnit> APIInvalidZoneId
: Invalid zone identifier. ZoneId.of(String) will throw exception at runtime.PeriodFrom
: Period.from(Period) returns itself; from(Duration) throws a runtime exception.PeriodGetTemporalUnit
: Period.get() only works with YEARS, MONTHS, or DAYS.PeriodTimeMath
: When adding or subtracting from a Period, Duration is incompatible.ProtoDurationGetSecondsGetNano
: getNanos() only accesses the underlying nanosecond-adjustment of the duration.ProtoTimestampGetSecondsGetNano
: getNanos() only accesses the underlying nanosecond-adjustment of the instant.ProtoTruthMixedDescriptors
: The arguments passed toignoringFields
are inconsistent with the proto which is the subject of the assertion.TimeUnitMismatch
: An value that appears to be represented in one unit is used where another appears to be required (e.g., seconds where nanos are needed)
API changes:
@BugPattern.category
is no longer supported; prefer@BugPattern.tags
as a means to apply general tags to checks.
Other changes:
- Suppress checks thoroughly when
-XepDisableWarningsInGeneratedCode
is passed. - Make UnusedVariable match unused assignments too.
- Handle static methods in InfiniteRecursion
- Add common java.time types to ReturnValueIgnored.
- ModifiedButNotUsed: match orphaned chains of proto/collection builders
- Improve NarrowingCompoundAssignment's fixes for ternary
- Allow suppressing AutoValueImmutableFields at the field level rather than just for the entire class...
Error Prone 2.3.2
Highlights:
- Opt-in check AndroidJdkLibsChecker enforces which JDK libraries can be used in Android applications, and, with the
-XepOpt:Android:Java8Libs
flag, can allow select Java 8 library support via https://developer.android.com/studio/write/java8-support. Look out for this in bazel.build after the next release. Immutable{Annotation,Enum}Checker
now requires the Error Prone@Immutable
annotation, not the JSR-305@Immutable
annotation
New Checks:
- Javadoc Checkers: InvalidParam, InvalidTag, InvalidThrows, ReturnFromVoid
- API Checkers: AndroidJdkLibsChecker, Java7ApiChecker, ApiDiffChecker
- AnnotateFormatMethod
- AnnotationPosition
- ArrayAsKeyOfSetOrMap
- AutoValueFinalMethods
- BadInstanceof
- BigDecimalEquals
- ClassNamedLikeTypeParameter
- CloseableProvides
- ComparingThisWithNull
- DeprecatedThreadMethods
- EqualsBrokenForNull
- EqualsGetClass
- EqualsUnsafeCast
- EqualsUsingHashCode
- EqualsWrongThing
- ExpectedExceptionRefactoring
- ExtendingJUnitAssert
- FloatingPointAssertionWithinEpsilon
- ImmutableRefactoring
- InconsistentHashCode
- InjectOnMemberAndConstructor
- LockNotBeforeTry
- MathAbsoluteRandom
- MathRoundIntLong
- MissingTestCall
- ModifiedButNotUsed
- NoFunctionalReturnType
- NullableDereference
- ObjectsHashCodePrimitive
- ProtoRedundantSet
- ProtosAsKeyOfSetOrMap
- SubstringOfZero
- SwigMemoryLeak
- SystemExitOutsideMain
- TestExceptionRefactoring
- ThreadPriorityCheck
- ToStringReturnsNull
- TruthAssertExpected
- TypeNameShadowing
- UndefinedEquals
- UnnecessaryParentheses
- UnsafeReflectiveConstructionCast
- UnusedException
- VariableNameSameAsType
Fixes Issues:
#1008, #1028, #1038, #1040, #1077, #1078, #1079, #1083, #1084, #1085, #1095, #1096, #1101, #1125, #1129, #1130, #35, #607, #783, #849, #926
Error Prone 2.3.1
New checks:
- [AssertThrowsMultipleStatements] The lambda passed to assertThows should contain exactly one statement
- [FieldCanBeFinal] This field is only assigned during initialization; consider making it final
- [ObjectToString] Calling toString on Objects that don't override toString() doesn't provide useful information
Other changes:
- Make ParcelableCreator check an ERROR
- OrphanedFormatString detects string literals correctly passed to @FormatMethod methods