Strict proto deps: .proto files are allowed to import other .proto files in the same srcs as they are.

--
PiperOrigin-RevId: 141604925
MOS_MIGRATED_REVID=141604925
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java
index e1eef7f..80bd1336 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java
@@ -172,7 +172,8 @@
   @Nullable
   public static NestedSet<Artifact> computeProtosInDirectDeps(RuleContext ruleContext) {
     NestedSetBuilder<Artifact> result = NestedSetBuilder.stableOrder();
-    if (ruleContext.getPrerequisiteArtifacts("srcs", TARGET).list().isEmpty()) {
+    ImmutableList<Artifact> srcs = ruleContext.getPrerequisiteArtifacts("srcs", TARGET).list();
+    if (srcs.isEmpty()) {
       for (ProtoSupportDataProvider provider :
           ruleContext.getPrerequisites("deps", TARGET, ProtoSupportDataProvider.class)) {
         result.addTransitive(provider.getSupportData().getProtosInDirectDeps());
@@ -182,6 +183,7 @@
           ruleContext.getPrerequisites("deps", TARGET, ProtoSourcesProvider.class)) {
         result.addAll(provider.getCheckDepsProtoSources());
       }
+      result.addAll(srcs);
     }
     return result.build();
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryTest.java
index 0202623..d0a1211 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryTest.java
@@ -88,16 +88,35 @@
         "proto_library(name='dep2', srcs=['dep2.proto'])");
 
     assertThat(getGeneratingSpawnAction(getDescriptorOutput("//x:nodeps")).getRemainingArguments())
-        .contains("--direct_dependencies=");
+        .contains("--direct_dependencies=x/nodeps.proto");
 
     assertThat(
-            getGeneratingSpawnAction(getDescriptorOutput("//x:withdeps")).getRemainingArguments())
-        .contains("--direct_dependencies=x/dep1.proto:x/dep2.proto");
+        getGeneratingSpawnAction(getDescriptorOutput("//x:withdeps")).getRemainingArguments())
+        .contains("--direct_dependencies=x/dep1.proto:x/dep2.proto:x/withdeps.proto");
 
     assertThat(
-            getGeneratingSpawnAction(getDescriptorOutput("//x:depends_on_alias"))
-                .getRemainingArguments())
-        .contains("--direct_dependencies=x/dep1.proto:x/dep2.proto");
+        getGeneratingSpawnAction(getDescriptorOutput("//x:depends_on_alias"))
+            .getRemainingArguments())
+        .contains("--direct_dependencies=x/dep1.proto:x/dep2.proto:x/depends_on_alias.proto");
+  }
+
+  /**
+   * When building a proto_library with multiple srcs (say foo.proto and bar.proto), we should allow
+   * foo.proto to import bar.proto without tripping strict-deps checking. This means that
+   * --direct_dependencies should list the srcs.
+   */
+  @Test
+  public void testDescriptorSetOutput_strict_deps_multipleSrcs() throws Exception {
+    useConfiguration("--strict_proto_deps=error");
+    ConfiguredTarget target =
+        scratchConfiguredTarget(
+            "x", "foo", "proto_library(name='foo', srcs=['foo.proto', 'bar.proto'])");
+    Artifact file =
+        ActionsTestUtil.getFirstArtifactEndingWith(getFilesToBuild(target), ".proto.bin");
+    assertThat(file.getRootRelativePathString()).isEqualTo("x/foo-descriptor-set.proto.bin");
+
+    assertThat(getGeneratingSpawnAction(file).getRemainingArguments())
+        .contains("--direct_dependencies=x/foo.proto:x/bar.proto");
   }
 
   @Test
@@ -114,7 +133,7 @@
 
     assertThat(getGeneratingSpawnAction(getDescriptorOutput("//x:alias")).getRemainingArguments())
         .containsAllOf(
-            "--direct_dependencies=x/subdep1.proto:x/subdep2.proto",
+            "--direct_dependencies=x/subdep1.proto:x/dep1.proto:x/subdep2.proto:x/dep2.proto",
             "x/dep1.proto",
             "x/dep2.proto");
   }