cmVisualStudioSlnData.cxx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmVisualStudioSlnData.h"
  4. #include <cstddef>
  5. #include <utility>
  6. #include "cmSystemTools.h"
  7. void cmSlnProjectEntry::AddProjectConfiguration(
  8. const std::string& solutionConfiguration,
  9. const std::string& projectConfiguration)
  10. {
  11. projectConfigurationMap[solutionConfiguration] = projectConfiguration;
  12. }
  13. std::string cmSlnProjectEntry::GetProjectConfiguration(
  14. const std::string& solutionConfiguration)
  15. {
  16. return projectConfigurationMap[solutionConfiguration];
  17. }
  18. const cm::optional<cmSlnProjectEntry> cmSlnData::GetProjectByGUID(
  19. const std::string& projectGUID) const
  20. {
  21. auto it(ProjectsByGUID.find(projectGUID));
  22. if (it != ProjectsByGUID.end())
  23. return it->second;
  24. return cm::nullopt;
  25. }
  26. const cm::optional<cmSlnProjectEntry> cmSlnData::GetProjectByName(
  27. const std::string& projectName) const
  28. {
  29. auto it(ProjectNameIndex.find(projectName));
  30. if (it != ProjectNameIndex.end())
  31. return it->second->second;
  32. return cm::nullopt;
  33. }
  34. std::vector<cmSlnProjectEntry> cmSlnData::GetProjects() const
  35. {
  36. auto it(this->ProjectNameIndex.begin()), itEnd(this->ProjectNameIndex.end());
  37. std::vector<cmSlnProjectEntry> result;
  38. for (; it != itEnd; ++it)
  39. result.push_back(it->second->second);
  40. return result;
  41. }
  42. cmSlnProjectEntry* cmSlnData::AddProject(
  43. const std::string& projectGUID, const std::string& projectName,
  44. const std::string& projectRelativePath)
  45. {
  46. auto it(ProjectsByGUID.find(projectGUID));
  47. if (it != ProjectsByGUID.end())
  48. return nullptr;
  49. it = ProjectsByGUID
  50. .insert(ProjectStorage::value_type(
  51. projectGUID,
  52. cmSlnProjectEntry(projectGUID, projectName, projectRelativePath)))
  53. .first;
  54. ProjectNameIndex[projectName] = it;
  55. return &it->second;
  56. }
  57. std::string cmSlnData::GetConfigurationTarget(
  58. const std::string& projectName, const std::string& solutionConfiguration,
  59. const std::string& platformName)
  60. {
  61. std::string solutionTarget = solutionConfiguration + "|" + platformName;
  62. cm::optional<cmSlnProjectEntry> project = GetProjectByName(projectName);
  63. if (!project)
  64. return platformName;
  65. std::string projectTarget = project->GetProjectConfiguration(solutionTarget);
  66. if (projectTarget.empty())
  67. return platformName;
  68. std::vector<std::string> targetElements =
  69. cmSystemTools::SplitString(projectTarget, '|');
  70. if (targetElements.size() != 2)
  71. return platformName;
  72. return targetElements[1];
  73. }