[GN] Fix TargetPath in Visual Studio projects

GN assumes that output_dir is root_build_dir for executables.
If that not so, Visual Studio can't find an executable to run and debug.
To fix it we are changing TargetPath field from $(ProjectName)$(TargetExt).
to exact path to ninja target output. Not sure about chromium, but it makes
sense for some standalone configurations

R=avakulenko@chromium.org, dpranke@chromium.org

Change-Id: Id9ccb7be96cc11f9504f4ea5a6e6117e1c55247b
Reviewed-on: https://chromium-review.googlesource.com/852459
Commit-Queue: agrieve <agrieve@chromium.org>
Reviewed-by: Dirk Pranke <dpranke@chromium.org>
Reviewed-by: Bruce Dawson <brucedawson@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#528626}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: e3ec6398302a14ad384388a35cc1f5bd17bdbe57
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc
index 816f1d7..a8fe041 100644
--- a/tools/gn/visual_studio_writer.cc
+++ b/tools/gn/visual_studio_writer.cc
@@ -512,6 +512,8 @@
 
   project.SubElement("PropertyGroup", XmlAttributes("Label", "UserMacros"));
 
+  std::string ninja_target = GetNinjaTarget(target);
+
   {
     std::unique_ptr<XmlElementWriter> properties =
         project.SubElement("PropertyGroup");
@@ -524,8 +526,7 @@
     }
     properties->SubElement("TargetName")->Text("$(ProjectName)");
     if (target->output_type() != Target::GROUP) {
-      properties->SubElement("TargetPath")
-          ->Text("$(OutDir)\\$(ProjectName)$(TargetExt)");
+      properties->SubElement("TargetPath")->Text("$(OutDir)\\" + ninja_target);
     }
   }
 
@@ -636,8 +637,6 @@
                     "$(VCTargetsPath)\\BuildCustomizations\\masm.targets"));
   project.SubElement("ImportGroup", XmlAttributes("Label", "ExtensionTargets"));
 
-  std::string ninja_target = GetNinjaTarget(target);
-
   {
     std::unique_ptr<XmlElementWriter> build =
         project.SubElement("Target", XmlAttributes("Name", "Build"));