In `RecursivePackageProviderBackedTargetPatternResolver` et al. gracefully tolerate the situation of a package that contains errors but doesn't have a failure detail.

PiperOrigin-RevId: 575855757
Change-Id: Idda6b59be188cb7f15207c5a0a38d90890b3fc82
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index 742c237..8be27f4 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -544,6 +544,24 @@
     return containsErrors;
   }
 
+  /**
+   * If {@code pkg.containsErrors()}, sends an errorful "package contains errors" {@link Event}
+   * (augmented with {@code pkg.getFailureDetail()}, if present) to the given {@link EventHandler}.
+   */
+  public static void maybeAddPackageContainsErrorsEventToHandler(
+      Package pkg, EventHandler eventHandler) {
+    if (pkg.containsErrors()) {
+      eventHandler.handle(
+          Event.error(
+              String.format(
+                  "package contains errors: %s%s",
+                  pkg.getNameFragment(),
+                  pkg.getFailureDetail() != null
+                      ? ": " + pkg.getFailureDetail().getMessage()
+                      : "")));
+    }
+  }
+
   void setContainsErrors() {
     containsErrors = true;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
index f65ed6a..666202a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java
@@ -143,14 +143,7 @@
         rulesOnly ? FilteringPolicies.and(FilteringPolicies.RULES_ONLY, policy) : policy;
     try {
       Package pkg = getPackage(packageIdentifier);
-      if (pkg.containsErrors()) {
-        eventHandler.handle(
-            Event.error(
-                "package contains errors: "
-                    + pkg.getNameFragment()
-                    + ": "
-                    + pkg.getFailureDetail().getMessage()));
-      }
+      Package.maybeAddPackageContainsErrorsEventToHandler(pkg, eventHandler);
       return TargetPatternResolverUtil.resolvePackageTargets(pkg, actualPolicy);
     } catch (NoSuchThingException e) {
       String message =
@@ -172,14 +165,7 @@
       ImmutableMap.Builder<PackageIdentifier, Collection<Target>> result = ImmutableMap.builder();
       for (PackageIdentifier pkgId : pkgIds) {
         Package pkg = pkgs.get(pkgId);
-        if (pkg.containsErrors()) {
-          eventHandler.handle(
-              Event.error(
-                  "package contains errors: "
-                      + pkg.getNameFragment()
-                      + ": "
-                      + pkg.getFailureDetail().getMessage()));
-        }
+        Package.maybeAddPackageContainsErrorsEventToHandler(pkg, eventHandler);
         result.put(pkgId, TargetPatternResolverUtil.resolvePackageTargets(pkg, policy));
       }
       return result.buildOrThrow();