From c7164a30a067e5ddf5f0c706d6861652d39fd967 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 30 Mar 2020 12:00:35 +0100 Subject: [PATCH] Suppress go/nullness warnings caused by Matcher#group(String) and Matcher#group(int) This is required to align google3's stub (currently marked non-null) with Checker Framework's. More information: go/matcher-nullness-lsc Tested: TAP train for global presubmit queue http://test/OCL:303344687:BASE:303326748:1585344475427:29edc250 PiperOrigin-RevId: 303709053 --- .../exoplayer2/ext/cronet/CronetDataSource.java | 2 ++ .../java/com/google/android/exoplayer2/util/Util.java | 9 +++++++-- .../android/exoplayer2/metadata/icy/IcyDecoder.java | 2 ++ .../google/android/exoplayer2/text/ssa/SsaStyle.java | 9 ++++++++- .../android/exoplayer2/text/subrip/SubripDecoder.java | 2 ++ .../android/exoplayer2/text/webvtt/CssParser.java | 6 ++++-- .../exoplayer2/text/webvtt/WebvttCueParser.java | 4 ++++ .../exoplayer2/upstream/cache/SimpleCacheSpan.java | 10 ++++++++++ .../google/android/exoplayer2/util/ColorParser.java | 2 ++ .../android/exoplayer2/source/hls/WebvttExtractor.java | 4 ++++ .../source/hls/playlist/HlsPlaylistParser.java | 6 ++++++ 11 files changed, 51 insertions(+), 5 deletions(-) diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java index 9aed4bfdf2..e1201ff3a2 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java @@ -818,6 +818,8 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { Matcher matcher = CONTENT_RANGE_HEADER_PATTERN.matcher(contentRangeHeader); if (matcher.find()) { try { + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") long contentLengthFromRange = Long.parseLong(matcher.group(2)) - Long.parseLong(matcher.group(1)) + 1; if (contentLength < 0) { diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java index 030ab575a4..0247d551c7 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java @@ -1021,13 +1021,16 @@ public final class Util { } /** - * Parses an xs:dateTime attribute value, returning the parsed timestamp in milliseconds since - * the epoch. + * Parses an xs:dateTime attribute value, returning the parsed timestamp in milliseconds since the + * epoch. * * @param value The attribute value to decode. * @return The parsed timestamp in milliseconds since the epoch. * @throws ParserException if an error occurs parsing the dateTime attribute value. */ + // incompatible types in argument. + // dereference of possibly-null reference matcher.group(9) + @SuppressWarnings({"nullness:argument.type.incompatible", "nullness:dereference.of.nullable"}) public static long parseXsDateTime(String value) throws ParserException { Matcher matcher = XS_DATE_TIME_PATTERN.matcher(value); if (!matcher.matches()) { @@ -1719,6 +1722,8 @@ public final class Util { Matcher matcher = ESCAPED_CHARACTER_PATTERN.matcher(fileName); int startOfNotEscaped = 0; while (percentCharacterCount > 0 && matcher.find()) { + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") char unescapedCharacter = (char) Integer.parseInt(matcher.group(1), 16); builder.append(fileName, startOfNotEscaped, matcher.start()).append(unescapedCharacter); startOfNotEscaped = matcher.end(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyDecoder.java index 30b6ac1691..3ee9ff15a4 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyDecoder.java @@ -44,6 +44,8 @@ public final class IcyDecoder implements MetadataDecoder { iso88591Decoder = Charset.forName(C.ISO88591_NAME).newDecoder(); } + // switching on a possibly-null value (key) + @SuppressWarnings("nullness:switching.nullable") @Override public Metadata decode(MetadataInputBuffer inputBuffer) { ByteBuffer buffer = Assertions.checkNotNull(inputBuffer.data); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java b/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java index fd2cb036b7..adc4e424df 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java @@ -229,6 +229,8 @@ import java.util.regex.Pattern; while (matcher.find()) { String braceContents = matcher.group(1); try { + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") PointF parsedPosition = parsePosition(braceContents); if (parsedPosition != null) { position = parsedPosition; @@ -237,7 +239,10 @@ import java.util.regex.Pattern; // Ignore invalid \pos() or \move() function. } try { - @SsaAlignment int parsedAlignment = parseAlignmentOverride(braceContents); + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") + @SsaAlignment + int parsedAlignment = parseAlignmentOverride(braceContents); if (parsedAlignment != SSA_ALIGNMENT_UNKNOWN) { alignment = parsedAlignment; } @@ -292,6 +297,8 @@ import java.util.regex.Pattern; Float.parseFloat(Assertions.checkNotNull(y).trim())); } + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") @SsaAlignment private static int parseAlignmentOverride(String braceContents) { Matcher matcher = ALIGNMENT_OVERRIDE_PATTERN.matcher(braceContents); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java index cef7e3f53f..c3cf814869 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java @@ -230,6 +230,8 @@ public final class SubripDecoder extends SimpleSubtitleDecoder { Cue.DIMEN_UNSET); } + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") private static long parseTimecode(Matcher matcher, int groupOffset) { @Nullable String hours = matcher.group(groupOffset + 1); long timestampMs = hours != null ? Long.parseLong(hours) * 60 * 60 * 1000 : 0; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java index 7d5d51b706..1df923ed0c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java @@ -322,9 +322,11 @@ import java.util.regex.Pattern; } /** - * Sets the target of a {@link WebvttCssStyle} by splitting a selector of the form - * {@code ::cue(tag#id.class1.class2[voice="someone"]}, where every element is optional. + * Sets the target of a {@link WebvttCssStyle} by splitting a selector of the form {@code + * ::cue(tag#id.class1.class2[voice="someone"]}, where every element is optional. */ + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") private void applySelectorToStyle(WebvttCssStyle style, String selector) { if ("".equals(selector)) { return; // Universal selector. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java index 2b298d4492..280ec4112b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java @@ -322,6 +322,8 @@ public final class WebvttCueParser { // Internal methods + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") @Nullable private static WebvttCueInfo parseCue( @Nullable String id, @@ -354,6 +356,8 @@ public final class WebvttCueParser { return builder.build(); } + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") private static void parseCueSettingsList(String cueSettingsList, WebvttCueInfoBuilder builder) { // Parse the cue settings list. Matcher cueSettingMatcher = CUE_SETTING_PATTERN.matcher(cueSettingsList); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java index ce195baf4e..683eaeee28 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheSpan.java @@ -113,6 +113,8 @@ import java.util.regex.Pattern; * @return The span, or null if the file name is not correctly formatted, or if the id is not * present in the content index, or if the length is 0. */ + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") @Nullable public static SimpleCacheSpan createCacheEntry( File file, long length, long lastTouchTimestamp, CachedContentIndex index) { @@ -131,6 +133,8 @@ import java.util.regex.Pattern; return null; } + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") int id = Integer.parseInt(matcher.group(1)); @Nullable String key = index.getKeyForId(id); if (key == null) { @@ -144,6 +148,8 @@ import java.util.regex.Pattern; return null; } + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") long position = Long.parseLong(matcher.group(2)); if (lastTouchTimestamp == C.TIME_UNSET) { lastTouchTimestamp = Long.parseLong(matcher.group(3)); @@ -159,6 +165,8 @@ import java.util.regex.Pattern; * @return Upgraded cache file or {@code null} if the file name is not correctly formatted or the * file can not be renamed. */ + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") @Nullable private static File upgradeFile(File file, CachedContentIndex index) { @Nullable String key = null; @@ -177,6 +185,8 @@ import java.util.regex.Pattern; return null; } + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") File newCacheFile = getCacheFile( Assertions.checkStateNotNull(file.getParentFile()), diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/ColorParser.java b/library/core/src/main/java/com/google/android/exoplayer2/util/ColorParser.java index 54f52e0a14..c623d26465 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/ColorParser.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/ColorParser.java @@ -63,6 +63,8 @@ public final class ColorParser { return parseColorInternal(colorExpression, true); } + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") private static int parseColorInternal(String colorExpression, boolean alphaHasFloatFormat) { Assertions.checkArgument(!TextUtils.isEmpty(colorExpression)); colorExpression = colorExpression.replace(" ", ""); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/WebvttExtractor.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/WebvttExtractor.java index 8f06fe5a52..2ff912e88d 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/WebvttExtractor.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/WebvttExtractor.java @@ -133,6 +133,8 @@ public final class WebvttExtractor implements Extractor { return Extractor.RESULT_END_OF_INPUT; } + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") @RequiresNonNull("output") private void processSample() throws ParserException { ParsableByteArray webvttData = new ParsableByteArray(sampleData); @@ -170,6 +172,8 @@ public final class WebvttExtractor implements Extractor { return; } + // incompatible types in argument. + @SuppressWarnings("nullness:argument.type.incompatible") long firstCueTimeUs = WebvttParserUtil.parseTimestampUs(cueHeaderMatcher.group(1)); long sampleTimeUs = timestampAdjuster.adjustTsTimestamp( TimestampAdjuster.usToPts(firstCueTimeUs + tsTimestampUs - vttTimestampUs)); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index 8f5c8517b1..bcf06c5d2e 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -823,6 +823,8 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser