Handle metadata walk_keys relative to the target directory

Don't process relative labels relative to root, process them relative
to the target directory.

To illustrate this, take the following example:

//x:x
//x:meta
//x/z:z

Where x is a target that depends on z, and meta is a generated_file
target that sets walk_keys to just "z", the collection would fail
because generated_file would try to resolve "z" (which is a relative
path) against the root (i.e. as //z:z). This patches changes the logic
to always resolve the walk_keys against the target current directory,
i.e. in case of //x:meta it'll be resolved against //x which is correct
since "z" is relative to that.

Bug: 117
Change-Id: I4da2a3d5e279a970794cdf163f596d8c9a107f4b
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/6380
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/tools/gn/target.cc b/tools/gn/target.cc
index db7a1be..bc87928 100644
--- a/tools/gn/target.cc
+++ b/tools/gn/target.cc
@@ -918,7 +918,7 @@
   // Gather walk keys and find the appropriate target. Targets identified in
   // the walk key set must be deps or data_deps of the declaring target.
   const DepsIteratorRange& all_deps = GetDeps(Target::DEPS_ALL);
-  const SourceDir current_dir("//");
+  const SourceDir& current_dir = label().dir();
   for (const auto& next : next_walk_keys) {
     DCHECK(next.type() == Value::STRING);
 
diff --git a/tools/gn/target_unittest.cc b/tools/gn/target_unittest.cc
index 24f4822..93fc6a4 100644
--- a/tools/gn/target_unittest.cc
+++ b/tools/gn/target_unittest.cc
@@ -1189,11 +1189,11 @@
 
   Value walk_expected(nullptr, Value::LIST);
   walk_expected.list_value().push_back(
-      Value(nullptr, "//foo:two(//toolchain:default)"));
+      Value(nullptr, "two"));
   one.metadata().contents().insert(
       std::pair<std::string_view, Value>("walk", walk_expected));
 
-  TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
+  TestTarget two(setup, "//foo/two:two", Target::SOURCE_SET);
   Value a_2_expected(nullptr, Value::LIST);
   a_2_expected.list_value().push_back(Value(nullptr, "bar"));
   two.metadata().contents().insert(
@@ -1205,7 +1205,7 @@
   three.metadata().contents().insert(
       std::pair<std::string_view, Value>("a", a_3_expected));
 
-  one.public_deps().push_back(LabelTargetPair(&two));
+  one.private_deps().push_back(LabelTargetPair(&two));
   one.public_deps().push_back(LabelTargetPair(&three));
 
   std::vector<std::string> data_keys;