GN: Fix CPU detection in Visual Studio generator

The previous version assumed that if there is no build override
for "current_cpu" then it means "x86".

R=brettw@chromium.org, tmoniuszko@opera.com
BUG=

Review URL: https://codereview.chromium.org/1733023002

Cr-Original-Commit-Position: refs/heads/master@{#377577}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 5dd34fc85aab35792d7034ac3caf3a8f9f38ba8a
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc
index a404461..2c454d2 100644
--- a/tools/gn/visual_studio_writer.cc
+++ b/tools/gn/visual_studio_writer.cc
@@ -178,18 +178,15 @@
 VisualStudioWriter::SolutionProject::~SolutionProject() = default;
 
 VisualStudioWriter::VisualStudioWriter(const BuildSettings* build_settings,
+                                       bool is_debug_config,
+                                       const char* config_platform,
                                        Version version)
     : build_settings_(build_settings),
+      is_debug_config_(is_debug_config),
+      config_platform_(config_platform),
       ninja_path_output_(build_settings->build_dir(),
                          build_settings->root_path_utf8(),
                          EscapingMode::ESCAPE_NINJA_COMMAND) {
-  const Value* value = build_settings->build_args().GetArgOverride("is_debug");
-  is_debug_config_ = value == nullptr || value->boolean_value();
-  config_platform_ = "Win32";
-  value = build_settings->build_args().GetArgOverride(variables::kTargetCpu);
-  if (value != nullptr && value->string_value() == "x64")
-    config_platform_ = "x64";
-
   switch (version) {
     case Version::Vs2013:
       project_version_ = kProjectVersionVs2013;
@@ -220,7 +217,24 @@
                                           Err* err) {
   std::vector<const Target*> targets = builder->GetAllResolvedTargets();
 
-  VisualStudioWriter writer(build_settings, version);
+  bool is_debug_config = true;
+  const char* config_platform = "Win32";
+
+  // Assume the "is_debug" and "target_cpu" variables do not change
+  // between different toolchains.
+  if (!targets.empty()) {
+    const Scope* scope = targets.front()->settings()->base_config();
+    const Value* is_debug_value = scope->GetValue("is_debug");
+    is_debug_config =
+        is_debug_value == nullptr || is_debug_value->boolean_value();
+    const Value* target_cpu_value = scope->GetValue(variables::kTargetCpu);
+    if (target_cpu_value != nullptr &&
+        target_cpu_value->string_value() == "x64")
+      config_platform = "x64";
+  }
+
+  VisualStudioWriter writer(build_settings, is_debug_config, config_platform,
+                            version);
   writer.projects_.reserve(targets.size());
   writer.folders_.reserve(targets.size());
 
@@ -255,16 +269,14 @@
 
 bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) {
   std::string project_name = target->label().name();
-  std::string project_config_platform = config_platform_;
+  const char* project_config_platform = config_platform_;
   if (!target->settings()->is_default()) {
     project_name += "_" + target->toolchain()->label().name();
-    project_config_platform = target->toolchain()
-                                  ->settings()
-                                  ->build_settings()
-                                  ->build_args()
-                                  .GetArgOverride(variables::kCurrentCpu)
-                                  ->string_value();
-    if (project_config_platform == "x86")
+    const Value* value =
+        target->settings()->base_config()->GetValue(variables::kCurrentCpu);
+    if (value != nullptr && value->string_value() == "x64")
+      project_config_platform = "x64";
+    else
       project_config_platform = "Win32";
   }
 
diff --git a/tools/gn/visual_studio_writer.h b/tools/gn/visual_studio_writer.h
index 8ca92fb..e9f2658 100644
--- a/tools/gn/visual_studio_writer.h
+++ b/tools/gn/visual_studio_writer.h
@@ -75,6 +75,8 @@
   using SolutionFolders = std::vector<SolutionEntry*>;
 
   explicit VisualStudioWriter(const BuildSettings* build_settings,
+                              bool is_debug_config,
+                              const char* config_platform,
                               Version version);
   ~VisualStudioWriter();
 
@@ -110,7 +112,7 @@
 
   // Platform for solution configuration (Win32, x64). Some projects may be
   // configured for different platform.
-  std::string config_platform_;
+  const char* config_platform_;
 
   // All projects contained by solution.
   SolutionProjects projects_;
diff --git a/tools/gn/visual_studio_writer_unittest.cc b/tools/gn/visual_studio_writer_unittest.cc
index 1675e4f..e8ad75a 100644
--- a/tools/gn/visual_studio_writer_unittest.cc
+++ b/tools/gn/visual_studio_writer_unittest.cc
@@ -26,7 +26,7 @@
 }  // namespace
 
 TEST_F(VisualStudioWriterTest, ResolveSolutionFolders) {
-  VisualStudioWriter writer(setup_.build_settings(),
+  VisualStudioWriter writer(setup_.build_settings(), true, "Win32",
                             VisualStudioWriter::Version::Vs2015);
 
   std::string path =
@@ -80,7 +80,7 @@
 }
 
 TEST_F(VisualStudioWriterTest, ResolveSolutionFolders_AbsPath) {
-  VisualStudioWriter writer(setup_.build_settings(),
+  VisualStudioWriter writer(setup_.build_settings(), true, "Win32",
                             VisualStudioWriter::Version::Vs2015);
 
   std::string path =