Support disable_lint_checks in java_library

PiperOrigin-RevId: 901279874
Change-Id: Icfebb038e6974b6d9dfc091cfd9e88a27de6aa68
diff --git a/java/common/rules/android_lint.bzl b/java/common/rules/android_lint.bzl
index 032e06b..7152990 100644
--- a/java/common/rules/android_lint.bzl
+++ b/java/common/rules/android_lint.bzl
@@ -22,7 +22,18 @@
     opts = reversed(opts_depset.to_list())
     return semantics.tokenize_javacopts(opts)
 
-def _android_lint_action(ctx, source_files, source_jars, compilation_info, is_library):
+def _flags_from_disable_lint_checks(args, disable_lint_checks):
+    invalid_ids = [check for check in disable_lint_checks if not _check_id_is_valid(check)]
+    if invalid_ids:
+        fail("Found not allowed character in disabled check ID(s) %s" % str(invalid_ids))
+    args.add_joined("--disable", disable_lint_checks, join_with = ",")
+
+# Returns whether the passed Android Lint check ID is valid
+def _check_id_is_valid(check):
+    # We want to prevent whitespace so that extra flags can't be 'injected' into Android Lint
+    return check.replace(".", "").replace("_", "").isalnum()
+
+def _android_lint_action(ctx, source_files, source_jars, compilation_info, is_library, disable_lint_checks = []):
     """
     Creates an action that runs Android lint against Java source files.
 
@@ -43,6 +54,7 @@
         source files. It should also include generated source jars.
       compilation_info: (struct) Information about compilation.
       is_library: (bool) Whether the target is a library.
+      disable_lint_checks: (list[str]) A list of AndroidLint checks to be skipped.
 
     Returns:
       (None|File) The Android lint output file or None if no source files were
@@ -112,6 +124,7 @@
 
     args.add("--lintopts")
     args.add_all(linter.lint_opts)
+    _flags_from_disable_lint_checks(args, disable_lint_checks)
 
     for package_config in linter.package_config:
         if package_config.matches(package_config.package_specs, ctx.label):
diff --git a/java/common/rules/impl/basic_java_library_impl.bzl b/java/common/rules/impl/basic_java_library_impl.bzl
index affd222..e2e2744 100644
--- a/java/common/rules/impl/basic_java_library_impl.bzl
+++ b/java/common/rules/impl/basic_java_library_impl.bzl
@@ -72,7 +72,8 @@
         add_opens = [],
         bootclasspath = None,
         javabuilder_jvm_flags = None,
-        is_library = True):
+        is_library = True,
+        disable_lint_checks = []):
     """
     Creates actions that compile and lint Java sources, sets up coverage and returns JavaInfo, InstrumentedFilesInfo and output groups.
 
@@ -109,6 +110,7 @@
       bootclasspath: (Target) The JDK APIs to compile this library against.
       javabuilder_jvm_flags: (list[str]) Additional JVM flags to pass to JavaBuilder.
       is_library: (bool) Whether the target is a library. Primarily for static analysis purposes.
+      disable_lint_checks: (list[str]) A list of AndroidLint checks to be skipped.
     Returns:
       (dict[str, Provider],
         {files_to_build: list[File],
@@ -172,6 +174,7 @@
             source_jars + generated_source_jars,
             compilation_info,
             is_library,
+            disable_lint_checks,
         )
         if lint_output:
             validation_outputs.append(depset([lint_output]))
diff --git a/java/common/rules/impl/bazel_java_library_impl.bzl b/java/common/rules/impl/bazel_java_library_impl.bzl
index 5c7fc5c..3ee1deb 100644
--- a/java/common/rules/impl/bazel_java_library_impl.bzl
+++ b/java/common/rules/impl/bazel_java_library_impl.bzl
@@ -35,7 +35,8 @@
         add_exports = [],
         add_opens = [],
         bootclasspath = None,
-        javabuilder_jvm_flags = None):
+        javabuilder_jvm_flags = None,
+        disable_lint_checks = []):
     """Implements java_library.
 
     Use this call when you need to produce a fully fledged java_library from
@@ -58,6 +59,7 @@
       add_opens: (list[str]) Allow this library to reflectively access the given <module>/<package>.
       bootclasspath: (Target) The JDK APIs to compile this library against.
       javabuilder_jvm_flags: (list[str]) Additional JVM flags to pass to JavaBuilder.
+      disable_lint_checks: (list[str]) A list of AndroidLint checks to be skipped.
     Returns:
       (dict[str, provider]) A list containing DefaultInfo, JavaInfo,
         InstrumentedFilesInfo, OutputGroupsInfo, ProguardSpecProvider providers.
@@ -83,6 +85,7 @@
         add_opens = add_opens,
         bootclasspath = bootclasspath,
         javabuilder_jvm_flags = javabuilder_jvm_flags,
+        disable_lint_checks = disable_lint_checks,
     )
 
     target["DefaultInfo"] = construct_defaultinfo(