Coverage Report

Created: 2026-09-14 06:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Source/cmCMakePresetsGraphInternal.h
Line
Count
Source
1
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2
   file LICENSE.rst or https://cmake.org/licensing for details.  */
3
#pragma once
4
5
#include <cstddef>
6
#include <memory>
7
#include <string>
8
#include <vector>
9
10
#include <cm/optional>
11
#include <cm/string_view>
12
#include <cmext/string_view>
13
14
#include <cm3p/json/value.h>
15
16
#include "cmCMakePresetsErrors.h"
17
#include "cmCMakePresetsGraph.h"
18
#include "cmJSONHelpers.h"
19
#include "cmSystemTools.h"
20
21
#define CHECK_OK(expr)                                                        \
22
89.2k
  do {                                                                        \
23
89.2k
    auto _result = expr;                                                      \
24
89.2k
    if (_result != true)                                                      \
25
89.2k
      return _result;                                                         \
26
89.2k
  } while (false)
27
28
namespace cmCMakePresetsGraphInternal {
29
enum class ExpandMacroResult
30
{
31
  Ok,
32
  Ignore,
33
  Defer,
34
  Error,
35
};
36
37
class MacroExpander
38
{
39
public:
40
  virtual ExpandMacroResult operator()(std::string const& macroNamespace,
41
                                       std::string const& macroName,
42
                                       std::string& macroOut,
43
                                       int version) const = 0;
44
218k
  virtual ~MacroExpander() = default;
45
};
46
using MacroExpanderVector = std::vector<std::unique_ptr<MacroExpander>>;
47
48
ExpandMacroResult ExpandMacros(std::string& out,
49
                               MacroExpanderVector const& macroExpanders,
50
                               int version);
51
52
ExpandMacroResult ExpandMacro(std::string& out,
53
                              std::string const& macroNamespace,
54
                              std::string const& macroName,
55
                              MacroExpanderVector const& macroExpanders,
56
                              int version);
57
}
58
59
class cmCMakePresetsGraph::Condition
60
{
61
public:
62
91.6k
  virtual ~Condition() = default;
63
64
  std::string ConditionJson;
65
66
  virtual bool Evaluate(
67
    cmCMakePresetsGraphInternal::MacroExpanderVector const& expanders,
68
    int version, cm::optional<bool>& out) const = 0;
69
57.9k
  virtual bool IsNull() const { return false; }
70
};
71
72
namespace cmCMakePresetsGraphInternal {
73
class BaseMacroExpander : public MacroExpander
74
{
75
  cmCMakePresetsGraph const& Graph;
76
  cm::optional<std::string> File;
77
78
public:
79
  BaseMacroExpander(cmCMakePresetsGraph const& graph)
80
37.6k
    : Graph(graph)
81
37.6k
  {
82
37.6k
  }
83
  BaseMacroExpander(cmCMakePresetsGraph const& graph, std::string const& file)
84
2.89k
    : Graph(graph)
85
2.89k
    , File(file)
86
2.89k
  {
87
2.89k
  }
88
  ExpandMacroResult operator()(std::string const& macroNamespace,
89
                               std::string const& macroName,
90
                               std::string& macroOut,
91
                               int version) const override;
92
};
93
94
template <typename T>
95
std::string const* GetConfigurePresetName(T const& /*preset*/)
96
0
{
97
0
  return nullptr;
98
0
}
99
100
inline std::string const* GetConfigurePresetName(
101
  cmCMakePresetsGraph::ConfigurePreset const& preset)
102
48
{
103
48
  return &preset.Name;
104
48
}
105
106
inline std::string const* GetConfigurePresetName(
107
  cmCMakePresetsGraph::BuildPreset const& preset)
108
0
{
109
0
  return &preset.ConfigurePreset;
110
0
}
111
112
inline std::string const* GetConfigurePresetName(
113
  cmCMakePresetsGraph::TestPreset const& preset)
114
0
{
115
0
  return &preset.ConfigurePreset;
116
0
}
117
118
inline std::string const* GetConfigurePresetName(
119
  cmCMakePresetsGraph::PackagePreset const& preset)
120
0
{
121
0
  return &preset.ConfigurePreset;
122
0
}
123
124
template <typename T>
125
class PresetMacroExpander : public MacroExpander
126
{
127
  cmCMakePresetsGraph const& Graph;
128
  T const& Preset;
129
130
public:
131
  PresetMacroExpander(cmCMakePresetsGraph const& graph, T const& preset)
132
37.6k
    : Graph(graph)
133
37.6k
    , Preset(preset)
134
37.6k
  {
135
37.6k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::BuildPreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::BuildPreset const&)
Line
Count
Source
132
1.80k
    : Graph(graph)
133
1.80k
    , Preset(preset)
134
1.80k
  {
135
1.80k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::TestPreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::TestPreset const&)
Line
Count
Source
132
1.10k
    : Graph(graph)
133
1.10k
    , Preset(preset)
134
1.10k
  {
135
1.10k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::PackagePreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::PackagePreset const&)
Line
Count
Source
132
975
    : Graph(graph)
133
975
    , Preset(preset)
134
975
  {
135
975
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::ConfigurePreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::ConfigurePreset const&)
Line
Count
Source
132
33.6k
    : Graph(graph)
133
33.6k
    , Preset(preset)
134
33.6k
  {
135
33.6k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::WorkflowPreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::WorkflowPreset const&)
Line
Count
Source
132
39
    : Graph(graph)
133
39
    , Preset(preset)
134
39
  {
135
39
  }
136
  ExpandMacroResult operator()(std::string const& macroNamespace,
137
                               std::string const& macroName,
138
                               std::string& macroOut,
139
                               int version) const override
140
276k
  {
141
276k
    if (macroNamespace.empty()) {
142
178k
      if (macroName == "presetName") {
143
39.9k
        macroOut += Preset.Name;
144
39.9k
        return ExpandMacroResult::Ok;
145
39.9k
      }
146
138k
      if (macroName == "configurePresetName") {
147
66
        if (version < 13) {
148
18
          return ExpandMacroResult::Error;
149
18
        }
150
48
        if (auto const* configurePresetName = GetConfigurePresetName(Preset)) {
151
48
          macroOut += *configurePresetName;
152
48
          return ExpandMacroResult::Ok;
153
48
        }
154
0
        return ExpandMacroResult::Error;
155
48
      }
156
138k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
68.1k
        if (!Preset.Hidden) {
159
61.6k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
61.6k
        }
161
68.1k
        return ExpandMacroResult::Ok;
162
68.1k
      }
163
70.2k
      if (macroName == "fileDir") {
164
66.8k
        if (version < 4) {
165
9
          return ExpandMacroResult::Error;
166
9
        }
167
66.8k
        macroOut +=
168
66.8k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
66.8k
        return ExpandMacroResult::Ok;
170
66.8k
      }
171
70.2k
    }
172
101k
    return ExpandMacroResult::Ignore;
173
276k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::BuildPreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
Line
Count
Source
140
63.7k
  {
141
63.7k
    if (macroNamespace.empty()) {
142
39.5k
      if (macroName == "presetName") {
143
8.16k
        macroOut += Preset.Name;
144
8.16k
        return ExpandMacroResult::Ok;
145
8.16k
      }
146
31.3k
      if (macroName == "configurePresetName") {
147
6
        if (version < 13) {
148
6
          return ExpandMacroResult::Error;
149
6
        }
150
0
        if (auto const* configurePresetName = GetConfigurePresetName(Preset)) {
151
0
          macroOut += *configurePresetName;
152
0
          return ExpandMacroResult::Ok;
153
0
        }
154
0
        return ExpandMacroResult::Error;
155
0
      }
156
31.3k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
14.0k
        if (!Preset.Hidden) {
159
14.0k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
14.0k
        }
161
14.0k
        return ExpandMacroResult::Ok;
162
14.0k
      }
163
17.2k
      if (macroName == "fileDir") {
164
16.8k
        if (version < 4) {
165
0
          return ExpandMacroResult::Error;
166
0
        }
167
16.8k
        macroOut +=
168
16.8k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
16.8k
        return ExpandMacroResult::Ok;
170
16.8k
      }
171
17.2k
    }
172
24.6k
    return ExpandMacroResult::Ignore;
173
63.7k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::TestPreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
Line
Count
Source
140
29.2k
  {
141
29.2k
    if (macroNamespace.empty()) {
142
19.5k
      if (macroName == "presetName") {
143
6.16k
        macroOut += Preset.Name;
144
6.16k
        return ExpandMacroResult::Ok;
145
6.16k
      }
146
13.4k
      if (macroName == "configurePresetName") {
147
0
        if (version < 13) {
148
0
          return ExpandMacroResult::Error;
149
0
        }
150
0
        if (auto const* configurePresetName = GetConfigurePresetName(Preset)) {
151
0
          macroOut += *configurePresetName;
152
0
          return ExpandMacroResult::Ok;
153
0
        }
154
0
        return ExpandMacroResult::Error;
155
0
      }
156
13.4k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
7.22k
        if (!Preset.Hidden) {
159
7.22k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
7.22k
        }
161
7.22k
        return ExpandMacroResult::Ok;
162
7.22k
      }
163
6.20k
      if (macroName == "fileDir") {
164
6.20k
        if (version < 4) {
165
0
          return ExpandMacroResult::Error;
166
0
        }
167
6.20k
        macroOut +=
168
6.20k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
6.20k
        return ExpandMacroResult::Ok;
170
6.20k
      }
171
6.20k
    }
172
9.63k
    return ExpandMacroResult::Ignore;
173
29.2k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::PackagePreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
Line
Count
Source
140
29.4k
  {
141
29.4k
    if (macroNamespace.empty()) {
142
19.6k
      if (macroName == "presetName") {
143
6.18k
        macroOut += Preset.Name;
144
6.18k
        return ExpandMacroResult::Ok;
145
6.18k
      }
146
13.5k
      if (macroName == "configurePresetName") {
147
0
        if (version < 13) {
148
0
          return ExpandMacroResult::Error;
149
0
        }
150
0
        if (auto const* configurePresetName = GetConfigurePresetName(Preset)) {
151
0
          macroOut += *configurePresetName;
152
0
          return ExpandMacroResult::Ok;
153
0
        }
154
0
        return ExpandMacroResult::Error;
155
0
      }
156
13.5k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
7.28k
        if (!Preset.Hidden) {
159
7.28k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
7.28k
        }
161
7.28k
        return ExpandMacroResult::Ok;
162
7.28k
      }
163
6.22k
      if (macroName == "fileDir") {
164
6.22k
        if (version < 4) {
165
0
          return ExpandMacroResult::Error;
166
0
        }
167
6.22k
        macroOut +=
168
6.22k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
6.22k
        return ExpandMacroResult::Ok;
170
6.22k
      }
171
6.22k
    }
172
9.75k
    return ExpandMacroResult::Ignore;
173
29.4k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::ConfigurePreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
Line
Count
Source
140
154k
  {
141
154k
    if (macroNamespace.empty()) {
142
99.6k
      if (macroName == "presetName") {
143
19.4k
        macroOut += Preset.Name;
144
19.4k
        return ExpandMacroResult::Ok;
145
19.4k
      }
146
80.2k
      if (macroName == "configurePresetName") {
147
60
        if (version < 13) {
148
12
          return ExpandMacroResult::Error;
149
12
        }
150
48
        if (auto const* configurePresetName = GetConfigurePresetName(Preset)) {
151
48
          macroOut += *configurePresetName;
152
48
          return ExpandMacroResult::Ok;
153
48
        }
154
0
        return ExpandMacroResult::Error;
155
48
      }
156
80.1k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
39.6k
        if (!Preset.Hidden) {
159
33.1k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
33.1k
        }
161
39.6k
        return ExpandMacroResult::Ok;
162
39.6k
      }
163
40.5k
      if (macroName == "fileDir") {
164
37.5k
        if (version < 4) {
165
9
          return ExpandMacroResult::Error;
166
9
        }
167
37.5k
        macroOut +=
168
37.5k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
37.5k
        return ExpandMacroResult::Ok;
170
37.5k
      }
171
40.5k
    }
172
57.8k
    return ExpandMacroResult::Ignore;
173
154k
  }
Unexecuted instantiation: cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::WorkflowPreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
174
};
175
176
template <class T>
177
class ImmediateMacroExpander : public MacroExpander
178
{
179
  T const& Preset;
180
181
public:
182
  ImmediateMacroExpander(T const& preset)
183
84.8k
    : Preset(preset)
184
84.8k
  {
185
84.8k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::ConfigurePreset>::ImmediateMacroExpander(cmCMakePresetsGraph::ConfigurePreset const&)
Line
Count
Source
183
47.7k
    : Preset(preset)
184
47.7k
  {
185
47.7k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::BuildPreset>::ImmediateMacroExpander(cmCMakePresetsGraph::BuildPreset const&)
Line
Count
Source
183
11.7k
    : Preset(preset)
184
11.7k
  {
185
11.7k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::TestPreset>::ImmediateMacroExpander(cmCMakePresetsGraph::TestPreset const&)
Line
Count
Source
183
12.9k
    : Preset(preset)
184
12.9k
  {
185
12.9k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::PackagePreset>::ImmediateMacroExpander(cmCMakePresetsGraph::PackagePreset const&)
Line
Count
Source
183
10.6k
    : Preset(preset)
184
10.6k
  {
185
10.6k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::WorkflowPreset>::ImmediateMacroExpander(cmCMakePresetsGraph::WorkflowPreset const&)
Line
Count
Source
183
1.91k
    : Preset(preset)
184
1.91k
  {
185
1.91k
  }
186
  ExpandMacroResult operator()(std::string const& macroNamespace,
187
                               std::string const& macroName,
188
                               std::string& macroOut,
189
                               int version) const override
190
29.3k
  {
191
29.3k
    if (macroNamespace.empty()) {
192
18.2k
      if (macroName == "fileDir") {
193
1.62k
        if (version < 12) {
194
510
          return ExpandMacroResult::Defer;
195
510
        }
196
1.11k
        macroOut +=
197
1.11k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
198
1.11k
        return ExpandMacroResult::Ok;
199
1.62k
      }
200
18.2k
    }
201
27.7k
    return ExpandMacroResult::Defer;
202
29.3k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::ConfigurePreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
Line
Count
Source
190
17.4k
  {
191
17.4k
    if (macroNamespace.empty()) {
192
15.3k
      if (macroName == "fileDir") {
193
213
        if (version < 12) {
194
168
          return ExpandMacroResult::Defer;
195
168
        }
196
45
        macroOut +=
197
45
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
198
45
        return ExpandMacroResult::Ok;
199
213
      }
200
15.3k
    }
201
17.2k
    return ExpandMacroResult::Defer;
202
17.4k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::BuildPreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
Line
Count
Source
190
11.8k
  {
191
11.8k
    if (macroNamespace.empty()) {
192
2.93k
      if (macroName == "fileDir") {
193
1.41k
        if (version < 12) {
194
342
          return ExpandMacroResult::Defer;
195
342
        }
196
1.07k
        macroOut +=
197
1.07k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
198
1.07k
        return ExpandMacroResult::Ok;
199
1.41k
      }
200
2.93k
    }
201
10.4k
    return ExpandMacroResult::Defer;
202
11.8k
  }
Unexecuted instantiation: cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::TestPreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
Unexecuted instantiation: cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::PackagePreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
Unexecuted instantiation: cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::WorkflowPreset>::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, int) const
203
};
204
205
template <typename T>
206
bool ExpandImmediateMacros(T& preset);
207
208
extern template bool ExpandImmediateMacros<
209
  cmCMakePresetsGraph::ConfigurePreset>(cmCMakePresetsGraph::ConfigurePreset&);
210
extern template bool ExpandImmediateMacros<cmCMakePresetsGraph::BuildPreset>(
211
  cmCMakePresetsGraph::BuildPreset&);
212
extern template bool ExpandImmediateMacros<cmCMakePresetsGraph::TestPreset>(
213
  cmCMakePresetsGraph::TestPreset&);
214
extern template bool ExpandImmediateMacros<cmCMakePresetsGraph::PackagePreset>(
215
  cmCMakePresetsGraph::PackagePreset&);
216
extern template bool ExpandImmediateMacros<
217
  cmCMakePresetsGraph::WorkflowPreset>(cmCMakePresetsGraph::WorkflowPreset&);
218
219
class NullCondition : public cmCMakePresetsGraph::Condition
220
{
221
  bool Evaluate(MacroExpanderVector const& /*expanders*/, int /*version*/,
222
                cm::optional<bool>& out) const override
223
0
  {
224
0
    out = true;
225
0
    return true;
226
0
  }
227
228
0
  bool IsNull() const override { return true; }
229
};
230
231
class ConstCondition : public cmCMakePresetsGraph::Condition
232
{
233
public:
234
  bool Evaluate(MacroExpanderVector const& /*expanders*/, int /*version*/,
235
                cm::optional<bool>& out) const override
236
570
  {
237
570
    out = this->Value;
238
570
    return true;
239
570
  }
240
241
  bool Value;
242
};
243
244
class EqualsCondition : public cmCMakePresetsGraph::Condition
245
{
246
public:
247
  bool Evaluate(MacroExpanderVector const& expanders, int version,
248
                cm::optional<bool>& out) const override;
249
250
  std::string Lhs;
251
  std::string Rhs;
252
};
253
254
class InListCondition : public cmCMakePresetsGraph::Condition
255
{
256
public:
257
  bool Evaluate(MacroExpanderVector const& expanders, int version,
258
                cm::optional<bool>& out) const override;
259
260
  std::string String;
261
  std::vector<std::string> List;
262
};
263
264
class MatchesCondition : public cmCMakePresetsGraph::Condition
265
{
266
public:
267
  bool Evaluate(MacroExpanderVector const& expanders, int version,
268
                cm::optional<bool>& out) const override;
269
270
  std::string String;
271
  std::string Regex;
272
};
273
274
class AnyAllOfCondition : public cmCMakePresetsGraph::Condition
275
{
276
public:
277
  bool Evaluate(MacroExpanderVector const& expanders, int version,
278
                cm::optional<bool>& out) const override;
279
280
  std::vector<std::unique_ptr<Condition>> Conditions;
281
  bool StopValue;
282
};
283
284
class NotCondition : public cmCMakePresetsGraph::Condition
285
{
286
public:
287
  bool Evaluate(MacroExpanderVector const& expanders, int version,
288
                cm::optional<bool>& out) const override;
289
290
  std::unique_ptr<Condition> SubCondition;
291
};
292
293
bool PresetStringHelper(std::string& out, Json::Value const* value,
294
                        cmJSONState* state);
295
296
bool PresetNameHelper(std::string& out, Json::Value const* value,
297
                      cmJSONState* state);
298
299
bool PresetVectorStringHelper(std::vector<std::string>& out,
300
                              Json::Value const* value, cmJSONState* state);
301
302
bool PresetBoolHelper(bool& out, Json::Value const* value, cmJSONState* state);
303
304
bool PresetOptionalBoolHelper(cm::optional<bool>& out,
305
                              Json::Value const* value, cmJSONState* state);
306
307
template <typename K>
308
bool PresetMapToBoolHelper(std::map<K, bool>& out, Json::Value const* value,
309
                           K key, cmJSONState* state)
310
1.86M
{
311
1.86M
  cm::optional<bool> temp;
312
1.86M
  if (!PresetOptionalBoolHelper(temp, value, state)) {
313
0
    return false;
314
0
  }
315
316
1.86M
  if (temp) {
317
0
    out[key] = *temp;
318
0
  }
319
320
1.86M
  return true;
321
1.86M
}
322
323
bool PresetIntHelper(int& out, Json::Value const* value, cmJSONState* state);
324
325
bool PresetOptionalIntHelper(cm::optional<int>& out, Json::Value const* value,
326
                             cmJSONState* state);
327
328
bool PresetUIntHelper(unsigned int& out, Json::Value const* value,
329
                      cmJSONState* state);
330
331
bool PresetOptionalUIntHelper(cm::optional<unsigned int>& out,
332
                              Json::Value const* value, cmJSONState* state);
333
334
bool PresetVectorIntHelper(std::vector<int>& out, Json::Value const* value,
335
                           cmJSONState* state);
336
337
bool ConfigurePresetsHelper(
338
  std::vector<cmCMakePresetsGraph::ConfigurePreset>& out,
339
  Json::Value const* value, cmJSONState* state);
340
341
bool BuildPresetsHelper(std::vector<cmCMakePresetsGraph::BuildPreset>& out,
342
                        Json::Value const* value, cmJSONState* state);
343
344
bool TestPresetsHelper(std::vector<cmCMakePresetsGraph::TestPreset>& out,
345
                       Json::Value const* value, cmJSONState* state);
346
347
bool PackagePresetsHelper(std::vector<cmCMakePresetsGraph::PackagePreset>& out,
348
                          Json::Value const* value, cmJSONState* state);
349
350
bool WorkflowPresetsHelper(
351
  std::vector<cmCMakePresetsGraph::WorkflowPreset>& out,
352
  Json::Value const* value, cmJSONState* state);
353
354
cm::string_view GetDiagnosticJSONName(cmDiagnosticCategory category);
355
356
cmJSONHelper<std::nullptr_t> VendorHelper(ErrorGenerator const& error);
357
358
bool PresetConditionHelper(
359
  std::shared_ptr<cmCMakePresetsGraph::Condition>& out,
360
  Json::Value const* value, cmJSONState* state);
361
362
bool PresetVectorOneOrMoreStringHelper(std::vector<std::string>& out,
363
                                       Json::Value const* value,
364
                                       cmJSONState* state);
365
366
bool EnvironmentMapHelper(
367
  std::map<std::string, cm::optional<std::string>>& out,
368
  Json::Value const* value, cmJSONState* state);
369
370
cmJSONHelper<std::nullptr_t> SchemaHelper();
371
372
bool CheckDiagnostics(cmJSONState* state, int version,
373
                      cmCMakePresetsGraph::ConfigurePreset& preset);
374
375
// Binds the fields common to every preset kind.
376
template <typename T>
377
cmJSONHelperBuilder::Object<T> BindPresetIdentityFields(
378
  cmJSONHelperBuilder::Object<T> obj)
379
24
{
380
24
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
24
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
24
          PresetVectorOneOrMoreStringHelper, false)
383
24
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
24
          false)
385
24
    .template Bind<std::nullptr_t>(
386
24
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
24
      false)
388
24
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
24
          PresetStringHelper, false)
390
24
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
24
          PresetStringHelper, false)
392
24
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
24
          PresetConditionHelper, false);
394
24
  return obj;
395
24
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::BuildPreset> cmCMakePresetsGraphInternal::BindPresetIdentityFields<cmCMakePresetsGraph::BuildPreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::BuildPreset>)
Line
Count
Source
379
6
{
380
6
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
6
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
6
          PresetVectorOneOrMoreStringHelper, false)
383
6
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
6
          false)
385
6
    .template Bind<std::nullptr_t>(
386
6
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
6
      false)
388
6
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
6
          PresetStringHelper, false)
390
6
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
6
          PresetStringHelper, false)
392
6
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
6
          PresetConditionHelper, false);
394
6
  return obj;
395
6
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::ConfigurePreset> cmCMakePresetsGraphInternal::BindPresetIdentityFields<cmCMakePresetsGraph::ConfigurePreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::ConfigurePreset>)
Line
Count
Source
379
6
{
380
6
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
6
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
6
          PresetVectorOneOrMoreStringHelper, false)
383
6
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
6
          false)
385
6
    .template Bind<std::nullptr_t>(
386
6
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
6
      false)
388
6
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
6
          PresetStringHelper, false)
390
6
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
6
          PresetStringHelper, false)
392
6
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
6
          PresetConditionHelper, false);
394
6
  return obj;
395
6
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::PackagePreset> cmCMakePresetsGraphInternal::BindPresetIdentityFields<cmCMakePresetsGraph::PackagePreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::PackagePreset>)
Line
Count
Source
379
6
{
380
6
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
6
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
6
          PresetVectorOneOrMoreStringHelper, false)
383
6
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
6
          false)
385
6
    .template Bind<std::nullptr_t>(
386
6
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
6
      false)
388
6
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
6
          PresetStringHelper, false)
390
6
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
6
          PresetStringHelper, false)
392
6
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
6
          PresetConditionHelper, false);
394
6
  return obj;
395
6
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::TestPreset> cmCMakePresetsGraphInternal::BindPresetIdentityFields<cmCMakePresetsGraph::TestPreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::TestPreset>)
Line
Count
Source
379
6
{
380
6
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
6
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
6
          PresetVectorOneOrMoreStringHelper, false)
383
6
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
6
          false)
385
6
    .template Bind<std::nullptr_t>(
386
6
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
6
      false)
388
6
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
6
          PresetStringHelper, false)
390
6
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
6
          PresetStringHelper, false)
392
6
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
6
          PresetConditionHelper, false);
394
6
  return obj;
395
6
}
396
397
// Binds the fields shared by build, test, and package presets, which resolve
398
// against a configure preset.
399
template <typename T>
400
cmJSONHelperBuilder::Object<T> BindDependentPresetFields(
401
  cmJSONHelperBuilder::Object<T> obj)
402
18
{
403
18
  obj
404
18
    .Bind("environment"_s, &cmCMakePresetsGraph::Preset::Environment,
405
18
          EnvironmentMapHelper, false)
406
18
    .Bind("configurePreset"_s, &T::ConfigurePreset, PresetStringHelper, false)
407
18
    .Bind("inheritConfigureEnvironment"_s, &T::InheritConfigureEnvironment,
408
18
          PresetOptionalBoolHelper, false);
409
18
  return obj;
410
18
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::BuildPreset> cmCMakePresetsGraphInternal::BindDependentPresetFields<cmCMakePresetsGraph::BuildPreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::BuildPreset>)
Line
Count
Source
402
6
{
403
6
  obj
404
6
    .Bind("environment"_s, &cmCMakePresetsGraph::Preset::Environment,
405
6
          EnvironmentMapHelper, false)
406
6
    .Bind("configurePreset"_s, &T::ConfigurePreset, PresetStringHelper, false)
407
6
    .Bind("inheritConfigureEnvironment"_s, &T::InheritConfigureEnvironment,
408
6
          PresetOptionalBoolHelper, false);
409
6
  return obj;
410
6
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::PackagePreset> cmCMakePresetsGraphInternal::BindDependentPresetFields<cmCMakePresetsGraph::PackagePreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::PackagePreset>)
Line
Count
Source
402
6
{
403
6
  obj
404
6
    .Bind("environment"_s, &cmCMakePresetsGraph::Preset::Environment,
405
6
          EnvironmentMapHelper, false)
406
6
    .Bind("configurePreset"_s, &T::ConfigurePreset, PresetStringHelper, false)
407
6
    .Bind("inheritConfigureEnvironment"_s, &T::InheritConfigureEnvironment,
408
6
          PresetOptionalBoolHelper, false);
409
6
  return obj;
410
6
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::TestPreset> cmCMakePresetsGraphInternal::BindDependentPresetFields<cmCMakePresetsGraph::TestPreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::TestPreset>)
Line
Count
Source
402
6
{
403
6
  obj
404
6
    .Bind("environment"_s, &cmCMakePresetsGraph::Preset::Environment,
405
6
          EnvironmentMapHelper, false)
406
6
    .Bind("configurePreset"_s, &T::ConfigurePreset, PresetStringHelper, false)
407
6
    .Bind("inheritConfigureEnvironment"_s, &T::InheritConfigureEnvironment,
408
6
          PresetOptionalBoolHelper, false);
409
6
  return obj;
410
6
}
411
}