Remove the dependency on LanguageDependentFragment from the C++ rules.

This comes at the cost of adding a dependency of proto rules in turn, but they pretty much depended on it already, so not a lot is lost.

RELNOTES: None.
PiperOrigin-RevId: 220783592
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LanguageDependentFragment.java b/src/main/java/com/google/devtools/build/lib/analysis/LanguageDependentFragment.java
index 9444fb6..6dd8963 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LanguageDependentFragment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LanguageDependentFragment.java
@@ -15,8 +15,6 @@
 package com.google.devtools.build.lib.analysis;
 
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
-import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import java.util.Objects;
@@ -70,68 +68,18 @@
     }
   }
 
-  private final Label label;
   private final ImmutableSet<LibraryLanguage> languages;
 
   @AutoCodec.Instantiator
-  public LanguageDependentFragment(Label label, ImmutableSet<LibraryLanguage> languages) {
-    this.label = label;
+  public LanguageDependentFragment(ImmutableSet<LibraryLanguage> languages) {
     this.languages = languages;
   }
 
   /**
-   * Returns the label that is associated with this piece of information.
-   *
-   * <p>This is usually the label of the target that provides the information.
-   */
-  public Label getLabel() {
-    return label;
-  }
-
-  /**
    * Returns a set of the languages the ConfiguredTarget generates output for.
    * For use only by rules that directly depend on this library via a "deps" attribute.
    */
   public ImmutableSet<LibraryLanguage> getSupportedLanguages() {
     return languages;
   }
-
-  /**
-   * Routines for verifying that dependency provide the right output.
-   */
-  public static final class Checker {
-    /** Checks that given dep supports the given language. */
-    public static boolean depSupportsLanguage(
-        RuleContext context,
-        LanguageDependentFragment dep,
-        LibraryLanguage language,
-        String attrName) {
-      if (dep.getSupportedLanguages().contains(language)) {
-        return true;
-      } else {
-        context.attributeError(
-            attrName,
-            String.format("'%s' does not produce output for %s", dep.getLabel(), language));
-        return false;
-      }
-    }
-
-    /**
-     * Checks that all LanguageDependentFragment support the given language.
-     *
-     * @param attrNames names of attributes whose contents should be checked for supported
-     *     languages, e.g., "deps".
-     */
-    public static void depsSupportsLanguage(
-        RuleContext context, LibraryLanguage language, Iterable<String> attrNames) {
-      for (String attrName : attrNames) {
-        if (context.attributes().has(attrName)) {
-          for (LanguageDependentFragment dep :
-              context.getPrerequisites(attrName, Mode.TARGET, LanguageDependentFragment.class)) {
-            depSupportsLanguage(context, dep, language, attrName);
-          }
-        }
-      }
-    }
-  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
index fc79d3c..67df1f6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
@@ -792,11 +792,7 @@
    */
   public CompilationInfo compile() throws RuleErrorException {
     if (checkDepsGenerateCpp) {
-      for (LanguageDependentFragment dep :
-          AnalysisUtils.getProviders(deps, LanguageDependentFragment.class)) {
-        LanguageDependentFragment.Checker.depSupportsLanguage(
-            ruleContext, dep, CppRuleClasses.LANGUAGE, "deps");
-      }
+      CppHelper.checkProtoLibrariesInDeps(ruleContext, deps);
     }
 
     if (!generatePicAction && !generateNoPicAction) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index a5c74ef..c2b9d58 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -346,11 +346,7 @@
     Preconditions.checkNotNull(ccOutputs);
 
     if (checkDepsGenerateCpp) {
-      for (LanguageDependentFragment dep :
-          AnalysisUtils.getProviders(deps, LanguageDependentFragment.class)) {
-        LanguageDependentFragment.Checker.depSupportsLanguage(
-            ruleContext, dep, CppRuleClasses.LANGUAGE, "deps");
-      }
+      CppHelper.checkProtoLibrariesInDeps(ruleContext, deps);
     }
 
     // Create link actions (only if there are object files or if explicitly requested).
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index 60edc5e..39eb822 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -59,6 +59,7 @@
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.FdoProvider.FdoMode;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
+import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
 import com.google.devtools.build.lib.shell.ShellUtils;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.FileTypeSet;
@@ -831,4 +832,14 @@
     }
     return new CcNativeLibraryProvider(result.build());
   }
+
+  public static void checkProtoLibrariesInDeps(RuleContext ruleContext,
+      Iterable<TransitiveInfoCollection> deps) {
+    for (TransitiveInfoCollection dep : deps) {
+      if (dep.getProvider(ProtoSourcesProvider.class) != null && dep.get(CcInfo.PROVIDER) == null) {
+        ruleContext.attributeError("deps",
+            String.format("proto_library '%s' does not produce output for C++", dep.getLabel()));
+      }
+    }
+  }
 }