Reland "Resources#getColor errorprone plugin."
This is a reland of commit b6339fc4d21bd10ffd985be4e1afe2a135823755
Original change's description:
> Resources#getColor errorprone plugin.
>
> Bug: 1302803
> Change-Id: I396b8fb7739575e6dafd578335642b4498d84e1d
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5096200
> Reviewed-by: Peter Wen <[email protected]>
> Commit-Queue: Sky Malice <[email protected]>
> Cr-Commit-Position: refs/heads/main@{#1234671}
Bug: 1302803
Change-Id: I584eca354b273f49a74b63dda1671421a4bcb1a9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5101301
Reviewed-by: Andrew Grieve <[email protected]>
Commit-Queue: Sky Malice <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1234785}
NOKEYCHECK=True
GitOrigin-RevId: 9d6f8bde089aede333baf8e5984c82b9db731751
diff --git a/BUILD.gn b/BUILD.gn
index 83e128e..b5860c4 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -16,6 +16,7 @@
"src/org/chromium/tools/errorprone/plugin/NoAndroidAsyncTaskCheck.java",
"src/org/chromium/tools/errorprone/plugin/NoDynamicStringsInTraceEventCheck.java",
"src/org/chromium/tools/errorprone/plugin/NoRedundantFieldInitCheck.java",
+ "src/org/chromium/tools/errorprone/plugin/NoResourcesGetColor.java",
"src/org/chromium/tools/errorprone/plugin/NoSynchronizedMethodCheck.java",
"src/org/chromium/tools/errorprone/plugin/NoSynchronizedThisCheck.java",
"src/org/chromium/tools/errorprone/plugin/TestClassNameCheck.java",
diff --git a/src/org/chromium/tools/errorprone/plugin/NoResourcesGetColor.java b/src/org/chromium/tools/errorprone/plugin/NoResourcesGetColor.java
new file mode 100644
index 0000000..bd82a20
--- /dev/null
+++ b/src/org/chromium/tools/errorprone/plugin/NoResourcesGetColor.java
@@ -0,0 +1,58 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.tools.errorprone.plugin;
+
+import static com.google.errorprone.matchers.Matchers.instanceMethod;
+
+import com.google.auto.service.AutoService;
+import com.google.errorprone.BugPattern;
+import com.google.errorprone.BugPattern.LinkType;
+import com.google.errorprone.BugPattern.SeverityLevel;
+import com.google.errorprone.VisitorState;
+import com.google.errorprone.bugpatterns.BugChecker;
+import com.google.errorprone.bugpatterns.BugChecker.MethodInvocationTreeMatcher;
+import com.google.errorprone.matchers.Description;
+import com.google.errorprone.matchers.Matcher;
+import com.google.errorprone.suppliers.Suppliers;
+import com.sun.source.tree.ExpressionTree;
+import com.sun.source.tree.MethodInvocationTree;
+
+/** Assert {@link android.content.res.Resources#getColor(int)} is not used. */
+@AutoService(BugChecker.class)
+@BugPattern(
+ name = "NoResourcesGetColor",
+ summary = "Do not use android.content.Context#getColor(int).",
+ severity = SeverityLevel.ERROR,
+ linkType = LinkType.CUSTOM,
+ link = "https://crbug.com/1302803")
+public class NoResourcesGetColor extends BugChecker implements MethodInvocationTreeMatcher {
+ private static final String CLASS_NAME = "android.content.res.Resources";
+ private static final String METHOD_NAME = "getColor";
+
+ // Allow Resources#getColor(int, Theme) on purpose as an easy escape hatch for this check, and
+ // it does correctly handle themes/dynamic colors.
+ private static final Matcher<ExpressionTree> CONTEXT_MATCHER =
+ instanceMethod()
+ .onDescendantOf(Suppliers.typeFromString(CLASS_NAME))
+ .named(METHOD_NAME)
+ .withParameters(int.class.getName());
+
+ // TODO(https://crbug.com/1302803): Remove this in a separate change to minimize revert size.
+ public static boolean sEnabled = false;
+
+ @Override
+ public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState visitorState) {
+ if (sEnabled && CONTEXT_MATCHER.matches(tree, visitorState)) {
+ return buildDescription(tree)
+ .setMessage(
+ "Resources#getColor(int) does not contain Theme information and can"
+ + " result in the wrong color. Easiest to call"
+ + " Context#getColor(int) instead.")
+ .build();
+ } else {
+ return Description.NO_MATCH;
+ }
+ }
+}
diff --git a/src/org/chromium/tools/errorprone/plugin/OWNERS b/src/org/chromium/tools/errorprone/plugin/OWNERS
new file mode 100644
index 0000000..74ab83d
--- /dev/null
+++ b/src/org/chromium/tools/errorprone/plugin/OWNERS
@@ -0,0 +1 @@
+per-file [email protected]
\ No newline at end of file