From 0a17f4e996c9fd87c0fadadcd8b962a863af83af Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 12 Sep 2025 17:31:02 -0400 Subject: [PATCH] cmVisualStudioSlnParser: Fix storage of some `.sln` parse results In commit 5cdd774d51 (VS: Handle build target correct for .NET SDK style projects with Any CPU, 2022-02-02, v3.23.0-rc1~3^2), some parse results were stored in temporary copies of `cmSlnProjectEntry` and thrown away. --- Source/cmGlobalVisualStudio10Generator.cxx | 3 +-- Source/cmVisualStudioSlnData.cxx | 23 ++++++++++++---------- Source/cmVisualStudioSlnData.h | 9 +++------ Source/cmVisualStudioSlnParser.cxx | 3 +-- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx index 3c36244897..132d4145de 100644 --- a/Source/cmGlobalVisualStudio10Generator.cxx +++ b/Source/cmGlobalVisualStudio10Generator.cxx @@ -1131,8 +1131,7 @@ cmGlobalVisualStudio10Generator::GenerateBuildCommand( std::string targetProject = cmStrCat(tname, ".vcxproj"); if (targetProject.find('/') == std::string::npos) { // it might be in a subdir - if (cm::optional proj = - slnData.GetProjectByName(tname)) { + if (cmSlnProjectEntry const* proj = slnData.GetProjectByName(tname)) { targetProject = proj->GetRelativePath(); cmSystemTools::ConvertToUnixSlashes(targetProject); } diff --git a/Source/cmVisualStudioSlnData.cxx b/Source/cmVisualStudioSlnData.cxx index 95e56f8536..465b9d0ed6 100644 --- a/Source/cmVisualStudioSlnData.cxx +++ b/Source/cmVisualStudioSlnData.cxx @@ -16,29 +16,32 @@ void cmSlnProjectEntry::AddProjectConfiguration( } std::string cmSlnProjectEntry::GetProjectConfiguration( - std::string const& solutionConfiguration) + std::string const& solutionConfiguration) const { - return projectConfigurationMap[solutionConfiguration]; + auto i = projectConfigurationMap.find(solutionConfiguration); + if (i != projectConfigurationMap.end()) { + return i->second; + } + return {}; } -cm::optional cmSlnData::GetProjectByGUID( - std::string const& projectGUID) const +cmSlnProjectEntry* cmSlnData::GetProjectByGUID(std::string const& projectGUID) { auto it(ProjectsByGUID.find(projectGUID)); if (it != ProjectsByGUID.end()) { - return it->second; + return &it->second; } - return cm::nullopt; + return nullptr; } -cm::optional cmSlnData::GetProjectByName( +cmSlnProjectEntry const* cmSlnData::GetProjectByName( std::string const& projectName) const { auto it(ProjectNameIndex.find(projectName)); if (it != ProjectNameIndex.end()) { - return it->second->second; + return &it->second->second; } - return cm::nullopt; + return nullptr; } std::vector cmSlnData::GetProjects() const @@ -75,7 +78,7 @@ std::string cmSlnData::GetConfigurationTarget( { std::string solutionTarget = cmStrCat(solutionConfiguration, '|', platformName); - cm::optional project = GetProjectByName(projectName); + cmSlnProjectEntry const* project = GetProjectByName(projectName); if (!project) { return platformName; } diff --git a/Source/cmVisualStudioSlnData.h b/Source/cmVisualStudioSlnData.h index 3ed185bcba..b32f938787 100644 --- a/Source/cmVisualStudioSlnData.h +++ b/Source/cmVisualStudioSlnData.h @@ -8,8 +8,6 @@ #include #include -#include - class cmSlnProjectEntry { public: @@ -30,7 +28,7 @@ public: std::string const& projectConfiguration); std::string GetProjectConfiguration( - std::string const& solutionConfiguration); + std::string const& solutionConfiguration) const; private: std::string Guid, Name, RelativePath; @@ -56,10 +54,9 @@ public: minimumVisualStudioVersion = version; } - cm::optional GetProjectByGUID( - std::string const& projectGUID) const; + cmSlnProjectEntry* GetProjectByGUID(std::string const& projectGUID); - cm::optional GetProjectByName( + cmSlnProjectEntry const* GetProjectByName( std::string const& projectName) const; std::vector GetProjects() const; diff --git a/Source/cmVisualStudioSlnParser.cxx b/Source/cmVisualStudioSlnParser.cxx index 878e877eb3..986ac0aa37 100644 --- a/Source/cmVisualStudioSlnParser.cxx +++ b/Source/cmVisualStudioSlnParser.cxx @@ -320,8 +320,7 @@ bool cmVisualStudioSlnParser::State::Process( std::string guid = tagElements[0]; std::string solutionConfiguration = tagElements[1]; std::string activeBuild = tagElements[2]; - cm::optional projectEntry = - output.GetProjectByGUID(guid); + cmSlnProjectEntry* projectEntry = output.GetProjectByGUID(guid); if (!projectEntry) { result.SetError(ResultErrorInputStructure, this->GetCurrentLine());