Fix missing public_inputs in the action's own inputs dependency

When a target defines `public_inputs`, those files should be treated as
inputs of the target itself. Otherwise, the action won't rebuild when
the public inputs change.

Bug: 531579666
Change-Id: Ia247e5bd7a683ad69953b11611a92f82ff2b6ff4
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/23860
Reviewed-by: David Turner <digit@google.com>
Reviewed-by: Junji Watanabe <jwata@google.com>
Commit-Queue: Takuto Ikuta <tikuta@google.com>
diff --git a/src/gn/ninja_target_writer.cc b/src/gn/ninja_target_writer.cc
index abdbffc..4f3e80d 100644
--- a/src/gn/ninja_target_writer.cc
+++ b/src/gn/ninja_target_writer.cc
@@ -581,6 +581,10 @@
   InputDeps deps;
   // Inherited public_inputs target dependencies.
   std::vector<OutputFile> public_inputs_deps;
+  if (!target_->public_inputs().empty()) {
+    public_inputs_deps.push_back(
+        GetPublicInputsOutputFile(target_, settings_->build_settings()));
+  }
   for (const auto& pair : target_->public_deps()) {
     if (resolved().ExportsPublicInputs(pair.ptr)) {
       public_inputs_deps.push_back(
diff --git a/src/gn/ninja_target_writer_unittest.cc b/src/gn/ninja_target_writer_unittest.cc
index c4fdbd8..ac5b154 100644
--- a/src/gn/ninja_target_writer_unittest.cc
+++ b/src/gn/ninja_target_writer_unittest.cc
@@ -696,4 +696,19 @@
         << out;
     EXPECT_TRUE(out.find("../../foo/a.in") == std::string::npos) << out;
   }
+
+  // 3. Verify A's own action build definition includes its public_inputs.
+  {
+    std::ostringstream stream;
+    // B's target needs output defined, let's configure A as well
+    a.action_values().outputs() =
+        SubstitutionList::MakeForTest("//out/Debug/a.out");
+    NinjaActionTargetWriter writer(&a, stream);
+    writer.Run();
+    std::string out = stream.str();
+    // out should contain "phony/foo/a.public_inputs" as an input dependency
+    // instead of "../../foo/a.in".
+    EXPECT_TRUE(out.contains("phony/foo/a.public_inputs")) << out;
+    EXPECT_FALSE(out.contains("../../foo/a.in")) << out;
+  }
 }