cmVisualStudioSlnData.cxx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 "cmStringAlgorithms.h"
  7. #include "cmSystemTools.h"
  8. void cmSlnProjectEntry::AddProjectConfiguration(
  9. const std::string& solutionConfiguration,
  10. const std::string& projectConfiguration)
  11. {
  12. projectConfigurationMap[solutionConfiguration] = projectConfiguration;
  13. }
  14. std::string cmSlnProjectEntry::GetProjectConfiguration(
  15. const std::string& solutionConfiguration)
  16. {
  17. return projectConfigurationMap[solutionConfiguration];
  18. }
  19. cm::optional<cmSlnProjectEntry> cmSlnData::GetProjectByGUID(
  20. const std::string& projectGUID) const
  21. {
  22. auto it(ProjectsByGUID.find(projectGUID));
  23. if (it != ProjectsByGUID.end()) {
  24. return it->second;
  25. }
  26. return cm::nullopt;
  27. }
  28. cm::optional<cmSlnProjectEntry> cmSlnData::GetProjectByName(
  29. const std::string& projectName) const
  30. {
  31. auto it(ProjectNameIndex.find(projectName));
  32. if (it != ProjectNameIndex.end()) {
  33. return it->second->second;
  34. }
  35. return cm::nullopt;
  36. }
  37. std::vector<cmSlnProjectEntry> cmSlnData::GetProjects() const
  38. {
  39. auto it(this->ProjectNameIndex.begin());
  40. auto itEnd(this->ProjectNameIndex.end());
  41. std::vector<cmSlnProjectEntry> result;
  42. for (; it != itEnd; ++it) {
  43. result.push_back(it->second->second);
  44. }
  45. return result;
  46. }
  47. cmSlnProjectEntry* cmSlnData::AddProject(
  48. const std::string& projectGUID, const std::string& projectName,
  49. const std::string& projectRelativePath)
  50. {
  51. auto it(ProjectsByGUID.find(projectGUID));
  52. if (it != ProjectsByGUID.end()) {
  53. return nullptr;
  54. }
  55. it = ProjectsByGUID
  56. .insert(ProjectStorage::value_type(
  57. projectGUID,
  58. cmSlnProjectEntry(projectGUID, projectName, projectRelativePath)))
  59. .first;
  60. ProjectNameIndex[projectName] = it;
  61. return &it->second;
  62. }
  63. std::string cmSlnData::GetConfigurationTarget(
  64. const std::string& projectName, const std::string& solutionConfiguration,
  65. const std::string& platformName)
  66. {
  67. std::string solutionTarget =
  68. cmStrCat(solutionConfiguration, '|', platformName);
  69. cm::optional<cmSlnProjectEntry> project = GetProjectByName(projectName);
  70. if (!project) {
  71. return platformName;
  72. }
  73. std::string projectTarget = project->GetProjectConfiguration(solutionTarget);
  74. if (projectTarget.empty()) {
  75. return platformName;
  76. }
  77. std::vector<std::string> targetElements =
  78. cmSystemTools::SplitString(projectTarget, '|');
  79. if (targetElements.size() != 2) {
  80. return platformName;
  81. }
  82. return targetElements[1];
  83. }