[rust] Update RustTargetGenerator to not duplicate work

Previously, the RustTargetGenerator inherited from TargetGenerator, and
so when it was called from the BinaryTargetGenerator it would re-run the
base TargetGenerator logic, resulting in errors about duplicates. This
moves the RustValuesGenerator to be more like the ConfigValuesGenerator.

Change-Id: I06df41bf1d5788bb2695e2c908342c1aa3568b75
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/5560
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Julie Hockett <juliehockett@google.com>
diff --git a/build/gen.py b/build/gen.py
index a1e5201..99de57e 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -517,7 +517,7 @@
         'tools/gn/qt_creator_writer.cc',
         'tools/gn/runtime_deps.cc',
         'tools/gn/rust_substitution_type.cc',
-        'tools/gn/rust_target_generator.cc',
+        'tools/gn/rust_values_generator.cc',
         'tools/gn/rust_tool.cc',
         'tools/gn/rust_values.cc',
         'tools/gn/rust_variables.cc',
diff --git a/tools/gn/binary_target_generator.cc b/tools/gn/binary_target_generator.cc
index d307342..4feadba 100644
--- a/tools/gn/binary_target_generator.cc
+++ b/tools/gn/binary_target_generator.cc
@@ -10,7 +10,7 @@
 #include "tools/gn/filesystem_utils.h"
 #include "tools/gn/functions.h"
 #include "tools/gn/parse_tree.h"
-#include "tools/gn/rust_target_generator.h"
+#include "tools/gn/rust_values_generator.h"
 #include "tools/gn/rust_variables.h"
 #include "tools/gn/scope.h"
 #include "tools/gn/settings.h"
diff --git a/tools/gn/functions_target_rust_unittest.cc b/tools/gn/functions_target_rust_unittest.cc
index 80e4696..37bd8b1 100644
--- a/tools/gn/functions_target_rust_unittest.cc
+++ b/tools/gn/functions_target_rust_unittest.cc
@@ -348,3 +348,26 @@
       item_collector.back()->AsTarget()->rust_values().aliased_deps().size(),
       2U);
 }
+
+TEST_F(RustFunctionsTarget, PublicConfigs) {
+  TestWithScope setup;
+
+  Scope::ItemVector item_collector;
+  setup.scope()->set_item_collector(&item_collector);
+  setup.scope()->set_source_dir(SourceDir("/"));
+
+  TestParseInput exe_input(
+      "config(\"bar\") {\n"
+      "  defines = [ \"DOOM_MELON\" ]"
+      "}\n"
+      "executable(\"foo\") {\n"
+      "  crate_name = \"foo_crate\"\n"
+      "  sources = [ \"foo.rs\", \"lib.rs\", \"main.rs\" ]\n"
+      "  edition = \"2018\""
+      "  public_configs = [ \":bar\" ]"
+      "}\n");
+  ASSERT_FALSE(exe_input.has_error());
+  Err err;
+  exe_input.parsed()->Execute(setup.scope(), &err);
+  ASSERT_FALSE(err.has_error()) << err.message();
+}
diff --git a/tools/gn/rust_target_generator.cc b/tools/gn/rust_values_generator.cc
similarity index 97%
rename from tools/gn/rust_target_generator.cc
rename to tools/gn/rust_values_generator.cc
index 47dc0b6..910d5af 100644
--- a/tools/gn/rust_target_generator.cc
+++ b/tools/gn/rust_values_generator.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "tools/gn/rust_target_generator.h"
+#include "tools/gn/rust_values_generator.h"
 
 #include "tools/gn/config_values_generator.h"
 #include "tools/gn/err.h"
@@ -22,11 +22,14 @@
                                          Scope* scope,
                                          const FunctionCallNode* function_call,
                                          Err* err)
-    : TargetGenerator(target, scope, function_call, err) {}
+    : target_(target),
+      scope_(scope),
+      function_call_(function_call),
+      err_(err) {}
 
 RustTargetGenerator::~RustTargetGenerator() = default;
 
-void RustTargetGenerator::DoRun() {
+void RustTargetGenerator::Run() {
   // source_set targets don't need any special Rust handling.
   if (target_->output_type() == Target::SOURCE_SET)
     return;
diff --git a/tools/gn/rust_target_generator.h b/tools/gn/rust_values_generator.h
similarity index 66%
rename from tools/gn/rust_target_generator.h
rename to tools/gn/rust_values_generator.h
index ae6a365..fb939db 100644
--- a/tools/gn/rust_target_generator.h
+++ b/tools/gn/rust_values_generator.h
@@ -2,24 +2,24 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef TOOLS_GN_RUST_TARGET_GENERATOR_H_
-#define TOOLS_GN_RUST_TARGET_GENERATOR_H_
+#ifndef TOOLS_GN_RUST_VALUES_GENERATOR_H_
+#define TOOLS_GN_RUST_VALUES_GENERATOR_H_
 
 #include "base/macros.h"
 #include "tools/gn/target.h"
-#include "tools/gn/target_generator.h"
+
+class FunctionCallNode;
 
 // Collects and writes specified data.
-class RustTargetGenerator : public TargetGenerator {
+class RustTargetGenerator {
  public:
   RustTargetGenerator(Target* target,
                       Scope* scope,
                       const FunctionCallNode* function_call,
                       Err* err);
-  ~RustTargetGenerator() override;
+  ~RustTargetGenerator();
 
- protected:
-  void DoRun() override;
+  void Run();
 
  private:
   bool FillCrateName();
@@ -28,7 +28,12 @@
   bool FillEdition();
   bool FillAliasedDeps();
 
+  Target* target_;
+  Scope* scope_;
+  const FunctionCallNode* function_call_;
+  Err* err_;
+
   DISALLOW_COPY_AND_ASSIGN(RustTargetGenerator);
 };
 
-#endif  // TOOLS_GN_GENERATED_FILE_TARGET_GENERATOR_H_
+#endif  // TOOLS_GN_RUST_VALUES_GENERATOR_H_