#ifndef TOOLS_GN_VISUAL_STUDIO_WRITER_H_
#define TOOLS_GN_VISUAL_STUDIO_WRITER_H_
#include <iosfwd>
#include <memory>
#include <string>
#include <vector>
#include "base/gtest_prod_util.h"
#include "gn/path_output.h"
namespace base {
class FilePath;
}
class Builder;
class BuildSettings;
class Err;
class SourceFile;
class Target;
class VisualStudioWriter {
public:
enum Version {
Vs2013 = 1,
Vs2015,
Vs2017,
Vs2019,
Vs2022,
};
static bool RunAndWriteFiles(const BuildSettings* build_settings,
const Builder& builder,
Version version,
const std::string& sln_name,
const std::string& filters,
const std::string& win_sdk,
const std::string& ninja_extra_args,
const std::string& ninja_executable,
bool no_deps,
Err* err);
private:
FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest, ResolveSolutionFolders);
FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest,
ResolveSolutionFolders_AbsPath);
FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest, NoDotSlash);
FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest, NinjaExecutable);
struct SolutionEntry {
SolutionEntry(const std::string& name,
const std::string& path,
const std::string& guid);
virtual ~SolutionEntry();
std::string name;
std::string path;
std::string guid;
SolutionEntry* parent_folder;
};
struct SolutionProject : public SolutionEntry {
SolutionProject(const std::string& name,
const std::string& path,
const std::string& guid,
const std::string& label_dir_path,
const std::string& config_platform);
~SolutionProject() override;
std::string label_dir_path;
std::string config_platform;
};
struct SourceFileCompileTypePair {
SourceFileCompileTypePair(const SourceFile* file, const char* compile_type);
~SourceFileCompileTypePair();
const SourceFile* file;
const char* compile_type;
};
using SolutionProjects = std::vector<std::unique_ptr<SolutionProject>>;
using SolutionFolders = std::vector<std::unique_ptr<SolutionEntry>>;
using SourceFileCompileTypePairs = std::vector<SourceFileCompileTypePair>;
VisualStudioWriter(const BuildSettings* build_settings,
const char* config_platform,
Version version,
const std::string& win_kit);
~VisualStudioWriter();
bool WriteProjectFiles(const Target* target,
const std::string& ninja_extra_args,
const std::string& ninja_executable,
Err* err);
bool WriteProjectFileContents(std::ostream& out,
const SolutionProject& solution_project,
const Target* target,
const std::string& ninja_extra_args,
const std::string& ninja_executable,
SourceFileCompileTypePairs* source_types,
Err* err);
void WriteFiltersFileContents(std::ostream& out,
const Target* target,
const SourceFileCompileTypePairs& source_types);
bool WriteSolutionFile(const std::string& sln_name, Err* err);
void WriteSolutionFileContents(std::ostream& out,
const base::FilePath& solution_dir_path);
void ResolveSolutionFolders();
std::pair<std::string, bool> GetNinjaTarget(const Target* target);
const BuildSettings* build_settings_;
const char* toolset_version_;
const char* project_version_;
const char* version_string_;
const char* config_platform_;
SolutionProjects projects_;
std::string root_folder_path_;
SolutionFolders folders_;
std::string windows_kits_include_dirs_;
PathOutput ninja_path_output_;
std::string windows_sdk_version_;
VisualStudioWriter(const VisualStudioWriter&) = delete;
VisualStudioWriter& operator=(const VisualStudioWriter&) = delete;
};
#endif