Support Visual Studio 2019 project generation.

Default vs option is still kept as vs2017 for now.

Change-Id: I8804049700c8e529eae7cab4fedd9d8589c259a4
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/4440
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/tools/gn/command_gen.cc b/tools/gn/command_gen.cc
index 82046d2..a8033ab 100644
--- a/tools/gn/command_gen.cc
+++ b/tools/gn/command_gen.cc
@@ -39,6 +39,7 @@
 const char kSwitchIdeValueVs2013[] = "vs2013";
 const char kSwitchIdeValueVs2015[] = "vs2015";
 const char kSwitchIdeValueVs2017[] = "vs2017";
+const char kSwitchIdeValueVs2019[] = "vs2019";
 const char kSwitchIdeValueWinSdk[] = "winsdk";
 const char kSwitchIdeValueXcode[] = "xcode";
 const char kSwitchIdeValueJson[] = "json";
@@ -200,12 +201,15 @@
     }
     return res;
   } else if (ide == kSwitchIdeValueVs || ide == kSwitchIdeValueVs2013 ||
-             ide == kSwitchIdeValueVs2015 || ide == kSwitchIdeValueVs2017) {
+             ide == kSwitchIdeValueVs2015 || ide == kSwitchIdeValueVs2017 ||
+             ide == kSwitchIdeValueVs2019) {
     VisualStudioWriter::Version version = VisualStudioWriter::Version::Vs2017;
     if (ide == kSwitchIdeValueVs2013)
       version = VisualStudioWriter::Version::Vs2013;
     else if (ide == kSwitchIdeValueVs2015)
       version = VisualStudioWriter::Version::Vs2015;
+    else if (ide == kSwitchIdeValueVs2019)
+      version = VisualStudioWriter::Version::Vs2019;
 
     std::string sln_name;
     if (command_line->HasSwitch(kSwitchSln))
@@ -333,6 +337,7 @@
       "vs2013" - Visual Studio 2013 project/solution files.
       "vs2015" - Visual Studio 2015 project/solution files.
       "vs2017" - Visual Studio 2017 project/solution files.
+      "vs2019" - Visual Studio 2019 project/solution files.
       "xcode" - Xcode workspace/solution files.
       "qtcreator" - QtCreator project files.
       "json" - JSON file containing target information
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc
index 7033358..9870fbc 100644
--- a/tools/gn/visual_studio_writer.cc
+++ b/tools/gn/visual_studio_writer.cc
@@ -72,12 +72,15 @@
 const char kToolsetVersionVs2013[] = "v120";               // Visual Studio 2013
 const char kToolsetVersionVs2015[] = "v140";               // Visual Studio 2015
 const char kToolsetVersionVs2017[] = "v141";               // Visual Studio 2017
+const char kToolsetVersionVs2019[] = "v142";               // Visual Studio 2019
 const char kProjectVersionVs2013[] = "12.0";               // Visual Studio 2013
 const char kProjectVersionVs2015[] = "14.0";               // Visual Studio 2015
 const char kProjectVersionVs2017[] = "15.0";               // Visual Studio 2017
+const char kProjectVersionVs2019[] = "16.0";               // Visual Studio 2019
 const char kVersionStringVs2013[] = "Visual Studio 2013";  // Visual Studio 2013
 const char kVersionStringVs2015[] = "Visual Studio 2015";  // Visual Studio 2015
 const char kVersionStringVs2017[] = "Visual Studio 2017";  // Visual Studio 2017
+const char kVersionStringVs2019[] = "Visual Studio 2019";  // Visual Studio 2019
 const char kWindowsKitsVersion[] = "10";                   // Windows 10 SDK
 const char kWindowsKitsDefaultVersion[] = "10.0.17134.0";  // Windows 10 SDK
 
@@ -299,6 +302,11 @@
       toolset_version_ = kToolsetVersionVs2017;
       version_string_ = kVersionStringVs2017;
       break;
+    case Version::Vs2019:
+      project_version_ = kProjectVersionVs2019;
+      toolset_version_ = kToolsetVersionVs2019;
+      version_string_ = kVersionStringVs2019;
+      break;
     default:
       NOTREACHED() << "Not a valid Visual Studio Version: " << version;
   }
@@ -517,9 +525,7 @@
   {
     std::unique_ptr<XmlElementWriter> properties =
         project.SubElement("PropertyGroup");
-    {
-      properties->SubElement("OutDir")->Text("$(SolutionDir)");
-    }
+    properties->SubElement("OutDir")->Text("$(SolutionDir)");
     properties->SubElement("TargetName")->Text("$(ProjectName)");
     if (target->output_type() != Target::GROUP) {
       properties->SubElement("TargetPath")->Text("$(OutDir)\\" + ninja_target);
diff --git a/tools/gn/visual_studio_writer.h b/tools/gn/visual_studio_writer.h
index 3193646..9b2a239 100644
--- a/tools/gn/visual_studio_writer.h
+++ b/tools/gn/visual_studio_writer.h
@@ -29,7 +29,8 @@
   enum Version {
     Vs2013 = 1,  // Visual Studio 2013
     Vs2015,      // Visual Studio 2015
-    Vs2017       // Visual Studio 2017
+    Vs2017,      // Visual Studio 2017
+    Vs2019,      // Visual Studio 2019
   };
 
   // Writes Visual Studio project and solution files. |sln_name| is the optional