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"); }