Coverage Report

Created: 2026-10-28 06:38

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
131k
  do {                                                                        \
23
131k
    auto _result = expr;                                                      \
24
131k
    if (_result != true)                                                      \
25
131k
      return _result;                                                         \
26
131k
  } 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
265k
  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
139k
  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
76.6k
  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
42.4k
    : Graph(graph)
81
42.4k
  {
82
42.4k
  }
83
  BaseMacroExpander(cmCMakePresetsGraph const& graph, std::string const& file)
84
6.15k
    : Graph(graph)
85
6.15k
    , File(file)
86
6.15k
  {
87
6.15k
  }
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
2.45k
{
103
2.45k
  return &preset.Name;
104
2.45k
}
105
106
inline std::string const* GetConfigurePresetName(
107
  cmCMakePresetsGraph::BuildPreset const& preset)
108
39
{
109
39
  return &preset.ConfigurePreset;
110
39
}
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
42.4k
    : Graph(graph)
133
42.4k
    , Preset(preset)
134
42.4k
  {
135
42.4k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::BuildPreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::BuildPreset const&)
Line
Count
Source
132
1.84k
    : Graph(graph)
133
1.84k
    , Preset(preset)
134
1.84k
  {
135
1.84k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::TestPreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::TestPreset const&)
Line
Count
Source
132
1.03k
    : Graph(graph)
133
1.03k
    , Preset(preset)
134
1.03k
  {
135
1.03k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::PackagePreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::PackagePreset const&)
Line
Count
Source
132
1.05k
    : Graph(graph)
133
1.05k
    , Preset(preset)
134
1.05k
  {
135
1.05k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::ConfigurePreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::ConfigurePreset const&)
Line
Count
Source
132
38.4k
    : Graph(graph)
133
38.4k
    , Preset(preset)
134
38.4k
  {
135
38.4k
  }
cmCMakePresetsGraphInternal::PresetMacroExpander<cmCMakePresetsGraph::WorkflowPreset>::PresetMacroExpander(cmCMakePresetsGraph const&, cmCMakePresetsGraph::WorkflowPreset const&)
Line
Count
Source
132
15
    : Graph(graph)
133
15
    , Preset(preset)
134
15
  {
135
15
  }
136
  ExpandMacroResult operator()(std::string const& macroNamespace,
137
                               std::string const& macroName,
138
                               std::string& macroOut,
139
                               int version) const override
140
243k
  {
141
243k
    if (macroNamespace.empty()) {
142
144k
      if (macroName == "presetName") {
143
27.5k
        macroOut += Preset.Name;
144
27.5k
        return ExpandMacroResult::Ok;
145
27.5k
      }
146
116k
      if (macroName == "configurePresetName") {
147
2.52k
        if (version < 13) {
148
33
          return ExpandMacroResult::Error;
149
33
        }
150
2.49k
        if (auto const* configurePresetName = GetConfigurePresetName(Preset)) {
151
2.49k
          macroOut += *configurePresetName;
152
2.49k
          return ExpandMacroResult::Ok;
153
2.49k
        }
154
0
        return ExpandMacroResult::Error;
155
2.49k
      }
156
114k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
70.1k
        if (!Preset.Hidden) {
159
65.1k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
65.1k
        }
161
70.1k
        return ExpandMacroResult::Ok;
162
70.1k
      }
163
44.1k
      if (macroName == "fileDir") {
164
41.6k
        if (version < 4) {
165
15
          return ExpandMacroResult::Error;
166
15
        }
167
41.6k
        macroOut +=
168
41.6k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
41.6k
        return ExpandMacroResult::Ok;
170
41.6k
      }
171
44.1k
    }
172
101k
    return ExpandMacroResult::Ignore;
173
243k
  }
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
35.9k
  {
141
35.9k
    if (macroNamespace.empty()) {
142
21.9k
      if (macroName == "presetName") {
143
5.78k
        macroOut += Preset.Name;
144
5.78k
        return ExpandMacroResult::Ok;
145
5.78k
      }
146
16.1k
      if (macroName == "configurePresetName") {
147
66
        if (version < 13) {
148
27
          return ExpandMacroResult::Error;
149
27
        }
150
39
        if (auto const* configurePresetName = GetConfigurePresetName(Preset)) {
151
39
          macroOut += *configurePresetName;
152
39
          return ExpandMacroResult::Ok;
153
39
        }
154
0
        return ExpandMacroResult::Error;
155
39
      }
156
16.0k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
6.95k
        if (!Preset.Hidden) {
159
6.95k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
6.95k
        }
161
6.95k
        return ExpandMacroResult::Ok;
162
6.95k
      }
163
9.11k
      if (macroName == "fileDir") {
164
8.74k
        if (version < 4) {
165
9
          return ExpandMacroResult::Error;
166
9
        }
167
8.73k
        macroOut +=
168
8.73k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
8.73k
        return ExpandMacroResult::Ok;
170
8.74k
      }
171
9.11k
    }
172
14.3k
    return ExpandMacroResult::Ignore;
173
35.9k
  }
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
34.8k
  {
141
34.8k
    if (macroNamespace.empty()) {
142
18.6k
      if (macroName == "presetName") {
143
3.99k
        macroOut += Preset.Name;
144
3.99k
        return ExpandMacroResult::Ok;
145
3.99k
      }
146
14.7k
      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
14.7k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
8.78k
        if (!Preset.Hidden) {
159
8.78k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
8.78k
        }
161
8.78k
        return ExpandMacroResult::Ok;
162
8.78k
      }
163
5.91k
      if (macroName == "fileDir") {
164
5.91k
        if (version < 4) {
165
0
          return ExpandMacroResult::Error;
166
0
        }
167
5.91k
        macroOut +=
168
5.91k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
5.91k
        return ExpandMacroResult::Ok;
170
5.91k
      }
171
5.91k
    }
172
16.1k
    return ExpandMacroResult::Ignore;
173
34.8k
  }
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
39.3k
  {
141
39.3k
    if (macroNamespace.empty()) {
142
19.7k
      if (macroName == "presetName") {
143
3.82k
        macroOut += Preset.Name;
144
3.82k
        return ExpandMacroResult::Ok;
145
3.82k
      }
146
15.9k
      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
15.9k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
9.58k
        if (!Preset.Hidden) {
159
9.58k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
9.58k
        }
161
9.58k
        return ExpandMacroResult::Ok;
162
9.58k
      }
163
6.35k
      if (macroName == "fileDir") {
164
6.35k
        if (version < 4) {
165
0
          return ExpandMacroResult::Error;
166
0
        }
167
6.35k
        macroOut +=
168
6.35k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
6.35k
        return ExpandMacroResult::Ok;
170
6.35k
      }
171
6.35k
    }
172
19.5k
    return ExpandMacroResult::Ignore;
173
39.3k
  }
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
133k
  {
141
133k
    if (macroNamespace.empty()) {
142
83.9k
      if (macroName == "presetName") {
143
13.8k
        macroOut += Preset.Name;
144
13.8k
        return ExpandMacroResult::Ok;
145
13.8k
      }
146
70.0k
      if (macroName == "configurePresetName") {
147
2.45k
        if (version < 13) {
148
6
          return ExpandMacroResult::Error;
149
6
        }
150
2.45k
        if (auto const* configurePresetName = GetConfigurePresetName(Preset)) {
151
2.45k
          macroOut += *configurePresetName;
152
2.45k
          return ExpandMacroResult::Ok;
153
2.45k
        }
154
0
        return ExpandMacroResult::Error;
155
2.45k
      }
156
67.5k
      if (macroName == "generator") {
157
        // Generator only makes sense if preset is not hidden.
158
44.7k
        if (!Preset.Hidden) {
159
39.8k
          macroOut += Graph.GetGeneratorForPreset(Preset.Name);
160
39.8k
        }
161
44.7k
        return ExpandMacroResult::Ok;
162
44.7k
      }
163
22.7k
      if (macroName == "fileDir") {
164
20.6k
        if (version < 4) {
165
6
          return ExpandMacroResult::Error;
166
6
        }
167
20.6k
        macroOut +=
168
20.6k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
169
20.6k
        return ExpandMacroResult::Ok;
170
20.6k
      }
171
22.7k
    }
172
51.2k
    return ExpandMacroResult::Ignore;
173
133k
  }
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
106k
    : Preset(preset)
184
106k
  {
185
106k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::ConfigurePreset>::ImmediateMacroExpander(cmCMakePresetsGraph::ConfigurePreset const&)
Line
Count
Source
183
54.8k
    : Preset(preset)
184
54.8k
  {
185
54.8k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::BuildPreset>::ImmediateMacroExpander(cmCMakePresetsGraph::BuildPreset const&)
Line
Count
Source
183
17.6k
    : Preset(preset)
184
17.6k
  {
185
17.6k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::TestPreset>::ImmediateMacroExpander(cmCMakePresetsGraph::TestPreset const&)
Line
Count
Source
183
16.7k
    : Preset(preset)
184
16.7k
  {
185
16.7k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::PackagePreset>::ImmediateMacroExpander(cmCMakePresetsGraph::PackagePreset const&)
Line
Count
Source
183
16.2k
    : Preset(preset)
184
16.2k
  {
185
16.2k
  }
cmCMakePresetsGraphInternal::ImmediateMacroExpander<cmCMakePresetsGraph::WorkflowPreset>::ImmediateMacroExpander(cmCMakePresetsGraph::WorkflowPreset const&)
Line
Count
Source
183
1.50k
    : Preset(preset)
184
1.50k
  {
185
1.50k
  }
186
  ExpandMacroResult operator()(std::string const& macroNamespace,
187
                               std::string const& macroName,
188
                               std::string& macroOut,
189
                               int version) const override
190
32.3k
  {
191
32.3k
    if (macroNamespace.empty()) {
192
29.5k
      if (macroName == "fileDir") {
193
6.10k
        if (version < 12) {
194
2.67k
          return ExpandMacroResult::Defer;
195
2.67k
        }
196
3.43k
        macroOut +=
197
3.43k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
198
3.43k
        return ExpandMacroResult::Ok;
199
6.10k
      }
200
29.5k
    }
201
26.2k
    return ExpandMacroResult::Defer;
202
32.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
20.0k
  {
191
20.0k
    if (macroNamespace.empty()) {
192
18.9k
      if (macroName == "fileDir") {
193
2.05k
        if (version < 12) {
194
138
          return ExpandMacroResult::Defer;
195
138
        }
196
1.92k
        macroOut +=
197
1.92k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
198
1.92k
        return ExpandMacroResult::Ok;
199
2.05k
      }
200
18.9k
    }
201
17.9k
    return ExpandMacroResult::Defer;
202
20.0k
  }
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
12.3k
  {
191
12.3k
    if (macroNamespace.empty()) {
192
10.5k
      if (macroName == "fileDir") {
193
4.05k
        if (version < 12) {
194
2.53k
          return ExpandMacroResult::Defer;
195
2.53k
        }
196
1.51k
        macroOut +=
197
1.51k
          cmSystemTools::GetParentDirectory(Preset.OriginFile->Filename);
198
1.51k
        return ExpandMacroResult::Ok;
199
4.05k
      }
200
10.5k
    }
201
8.26k
    return ExpandMacroResult::Defer;
202
12.3k
  }
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
21
  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
795
  {
237
795
    out = this->Value;
238
795
    return true;
239
795
  }
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
2.38M
{
311
2.38M
  cm::optional<bool> temp;
312
2.38M
  if (!PresetOptionalBoolHelper(temp, value, state)) {
313
0
    return false;
314
0
  }
315
316
2.38M
  if (temp) {
317
0
    out[key] = *temp;
318
0
  }
319
320
2.38M
  return true;
321
2.38M
}
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
48
{
380
48
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
48
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
48
          PresetVectorOneOrMoreStringHelper, false)
383
48
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
48
          false)
385
48
    .template Bind<std::nullptr_t>(
386
48
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
48
      false)
388
48
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
48
          PresetStringHelper, false)
390
48
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
48
          PresetStringHelper, false)
392
48
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
48
          PresetConditionHelper, false);
394
48
  return obj;
395
48
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::BuildPreset> cmCMakePresetsGraphInternal::BindPresetIdentityFields<cmCMakePresetsGraph::BuildPreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::BuildPreset>)
Line
Count
Source
379
12
{
380
12
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
12
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
12
          PresetVectorOneOrMoreStringHelper, false)
383
12
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
12
          false)
385
12
    .template Bind<std::nullptr_t>(
386
12
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
12
      false)
388
12
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
12
          PresetStringHelper, false)
390
12
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
12
          PresetStringHelper, false)
392
12
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
12
          PresetConditionHelper, false);
394
12
  return obj;
395
12
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::ConfigurePreset> cmCMakePresetsGraphInternal::BindPresetIdentityFields<cmCMakePresetsGraph::ConfigurePreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::ConfigurePreset>)
Line
Count
Source
379
12
{
380
12
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
12
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
12
          PresetVectorOneOrMoreStringHelper, false)
383
12
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
12
          false)
385
12
    .template Bind<std::nullptr_t>(
386
12
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
12
      false)
388
12
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
12
          PresetStringHelper, false)
390
12
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
12
          PresetStringHelper, false)
392
12
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
12
          PresetConditionHelper, false);
394
12
  return obj;
395
12
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::PackagePreset> cmCMakePresetsGraphInternal::BindPresetIdentityFields<cmCMakePresetsGraph::PackagePreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::PackagePreset>)
Line
Count
Source
379
12
{
380
12
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
12
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
12
          PresetVectorOneOrMoreStringHelper, false)
383
12
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
12
          false)
385
12
    .template Bind<std::nullptr_t>(
386
12
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
12
      false)
388
12
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
12
          PresetStringHelper, false)
390
12
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
12
          PresetStringHelper, false)
392
12
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
12
          PresetConditionHelper, false);
394
12
  return obj;
395
12
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::TestPreset> cmCMakePresetsGraphInternal::BindPresetIdentityFields<cmCMakePresetsGraph::TestPreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::TestPreset>)
Line
Count
Source
379
12
{
380
12
  obj.Bind("name"_s, &cmCMakePresetsGraph::Preset::Name, PresetNameHelper)
381
12
    .Bind("inherits"_s, &cmCMakePresetsGraph::Preset::Inherits,
382
12
          PresetVectorOneOrMoreStringHelper, false)
383
12
    .Bind("hidden"_s, &cmCMakePresetsGraph::Preset::Hidden, PresetBoolHelper,
384
12
          false)
385
12
    .template Bind<std::nullptr_t>(
386
12
      "vendor"_s, nullptr, VendorHelper(cmCMakePresetsErrors::INVALID_PRESET),
387
12
      false)
388
12
    .Bind("displayName"_s, &cmCMakePresetsGraph::Preset::DisplayName,
389
12
          PresetStringHelper, false)
390
12
    .Bind("description"_s, &cmCMakePresetsGraph::Preset::Description,
391
12
          PresetStringHelper, false)
392
12
    .Bind("condition"_s, &cmCMakePresetsGraph::Preset::ConditionEvaluator,
393
12
          PresetConditionHelper, false);
394
12
  return obj;
395
12
}
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
36
{
403
36
  obj
404
36
    .Bind("environment"_s, &cmCMakePresetsGraph::Preset::Environment,
405
36
          EnvironmentMapHelper, false)
406
36
    .Bind("configurePreset"_s, &T::ConfigurePreset, PresetStringHelper, false)
407
36
    .Bind("inheritConfigureEnvironment"_s, &T::InheritConfigureEnvironment,
408
36
          PresetOptionalBoolHelper, false);
409
36
  return obj;
410
36
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::BuildPreset> cmCMakePresetsGraphInternal::BindDependentPresetFields<cmCMakePresetsGraph::BuildPreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::BuildPreset>)
Line
Count
Source
402
12
{
403
12
  obj
404
12
    .Bind("environment"_s, &cmCMakePresetsGraph::Preset::Environment,
405
12
          EnvironmentMapHelper, false)
406
12
    .Bind("configurePreset"_s, &T::ConfigurePreset, PresetStringHelper, false)
407
12
    .Bind("inheritConfigureEnvironment"_s, &T::InheritConfigureEnvironment,
408
12
          PresetOptionalBoolHelper, false);
409
12
  return obj;
410
12
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::PackagePreset> cmCMakePresetsGraphInternal::BindDependentPresetFields<cmCMakePresetsGraph::PackagePreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::PackagePreset>)
Line
Count
Source
402
12
{
403
12
  obj
404
12
    .Bind("environment"_s, &cmCMakePresetsGraph::Preset::Environment,
405
12
          EnvironmentMapHelper, false)
406
12
    .Bind("configurePreset"_s, &T::ConfigurePreset, PresetStringHelper, false)
407
12
    .Bind("inheritConfigureEnvironment"_s, &T::InheritConfigureEnvironment,
408
12
          PresetOptionalBoolHelper, false);
409
12
  return obj;
410
12
}
cmJSONHelperBuilder::Object<cmCMakePresetsGraph::TestPreset> cmCMakePresetsGraphInternal::BindDependentPresetFields<cmCMakePresetsGraph::TestPreset>(cmJSONHelperBuilder::Object<cmCMakePresetsGraph::TestPreset>)
Line
Count
Source
402
12
{
403
12
  obj
404
12
    .Bind("environment"_s, &cmCMakePresetsGraph::Preset::Environment,
405
12
          EnvironmentMapHelper, false)
406
12
    .Bind("configurePreset"_s, &T::ConfigurePreset, PresetStringHelper, false)
407
12
    .Bind("inheritConfigureEnvironment"_s, &T::InheritConfigureEnvironment,
408
12
          PresetOptionalBoolHelper, false);
409
12
  return obj;
410
12
}
411
}