[metadata] Return metadata in postorder. Change-Id: I06f89b9bda42d54a9e721e499c6d415fb0f0852d Reviewed-on: https://gn-review.googlesource.com/c/3640 Commit-Queue: Julie Hockett <juliehockett@google.com> Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/tools/gn/functions_target.cc b/tools/gn/functions_target.cc index 93553b9..6cbab00 100644 --- a/tools/gn/functions_target.cc +++ b/tools/gn/functions_target.cc
@@ -795,9 +795,13 @@ optional values of the `rebase` and `walk_keys` variables. See `gn help metadata`. + Collected metadata, if specified, will be returned in postorder of + dependencies. See the example for details. + Example (metadata collection) - Given the following targets defined in //base/BUILD.gn, where A -> B and B -> C and D: + Given the following targets defined in //base/BUILD.gn, where A depends on B + and B depends on C and D: group("a") { metadata = { @@ -846,10 +850,10 @@ The following will be written to "$root_build_dir/my_files.json" (less the comments): [ - "foo.cpp", // from //base:a - "bar.cpp", // from //base:b via //base:a "baz.cpp", // from //base:c via //base:b "missing.cpp" // from //base:d via //base:b + "bar.cpp", // from //base:b via //base:a + "foo.cpp", // from //base:a ] Alternatively, as an example of using walk_keys, if the following @@ -866,9 +870,9 @@ The following will be written to "$root_build_dir/my_files.json" (again less the comments): [ - "foo.cpp", // from //base:a - "bar.cpp", // from //base:b via //base:a "baz.cpp", // from //base:c via //base:b + "bar.cpp", // from //base:b via //base:a + "foo.cpp", // from //base:a ] If `rebase` is used in the following generated_file target: @@ -885,9 +889,9 @@ The following will be written to "$root_build_dir/my_files.json" (again less the comments) (assuming root_build_dir = "//out"): [ - "../base/foo.cpp", // from //base:a - "../base/bar.cpp", // from //base:b via //base:a "../base/baz.cpp", // from //base:c via //base:b + "../base/bar.cpp", // from //base:b via //base:a + "../base/foo.cpp", // from //base:a ]
diff --git a/tools/gn/metadata_walk_unittest.cc b/tools/gn/metadata_walk_unittest.cc index 4ceea7b..634a2c5 100644 --- a/tools/gn/metadata_walk_unittest.cc +++ b/tools/gn/metadata_walk_unittest.cc
@@ -106,9 +106,9 @@ EXPECT_FALSE(err.has_error()); std::vector<Value> expected; + expected.push_back(Value(nullptr, "bar")); expected.push_back(Value(nullptr, "foo")); expected.push_back(Value(nullptr, true)); - expected.push_back(Value(nullptr, "bar")); EXPECT_EQ(result, expected); std::set<const Target*> expected_walked_targets; @@ -163,8 +163,8 @@ EXPECT_FALSE(err.has_error()) << err.message(); std::vector<Value> expected; - expected.push_back(Value(nullptr, "foo")); expected.push_back(Value(nullptr, "bar")); + expected.push_back(Value(nullptr, "foo")); EXPECT_EQ(result, expected) << result.size(); std::set<const Target*> expected_walked_targets;
diff --git a/tools/gn/target.cc b/tools/gn/target.cc index 0e9b245..c61758b 100644 --- a/tools/gn/target.cc +++ b/tools/gn/target.cc
@@ -893,6 +893,7 @@ std::set<const Target*>* targets_walked, Err* err) const { std::vector<Value> next_walk_keys; + std::vector<Value> current_result; // If deps_only, this is the top-level target and thus we don't want to // collect its metadata, only that of its deps and data_deps. if (deps_only) { @@ -903,8 +904,8 @@ } else { // Otherwise, we walk this target and collect the appropriate data. if (!metadata_.WalkStep(settings()->build_settings(), keys_to_extract, - keys_to_walk, rebase_dir, &next_walk_keys, result, - err)) + keys_to_walk, rebase_dir, &next_walk_keys, + ¤t_result, err)) return false; } @@ -963,5 +964,7 @@ return false; } } + result->insert(result->end(), std::make_move_iterator(current_result.begin()), + std::make_move_iterator(current_result.end())); return true; }
diff --git a/tools/gn/target_unittest.cc b/tools/gn/target_unittest.cc index 1cc4d96..9d9173e 100644 --- a/tools/gn/target_unittest.cc +++ b/tools/gn/target_unittest.cc
@@ -1164,9 +1164,9 @@ EXPECT_FALSE(err.has_error()); std::vector<Value> expected; + expected.push_back(Value(nullptr, "bar")); expected.push_back(Value(nullptr, "foo")); expected.push_back(Value(nullptr, true)); - expected.push_back(Value(nullptr, "bar")); EXPECT_EQ(result, expected); } @@ -1214,8 +1214,8 @@ EXPECT_FALSE(err.has_error()) << err.message(); std::vector<Value> expected; - expected.push_back(Value(nullptr, "foo")); expected.push_back(Value(nullptr, "bar")); + expected.push_back(Value(nullptr, "foo")); EXPECT_EQ(result, expected) << result.size(); }