Coverage Report

Created: 2026-03-12 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Source/cmGeneratorExpressionLexer.cxx
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
#include "cmGeneratorExpressionLexer.h"
4
5
2.41k
cmGeneratorExpressionLexer::cmGeneratorExpressionLexer() = default;
6
7
static void InsertText(char const* upto, char const* c,
8
                       std::vector<cmGeneratorExpressionToken>& result)
9
495k
{
10
495k
  if (upto != c) {
11
56.0k
    result.emplace_back(cmGeneratorExpressionToken::Text, upto, c - upto);
12
56.0k
  }
13
495k
}
14
15
std::vector<cmGeneratorExpressionToken> cmGeneratorExpressionLexer::Tokenize(
16
  std::string const& input)
17
2.41k
{
18
2.41k
  std::vector<cmGeneratorExpressionToken> result;
19
20
2.41k
  if (input.find('$') == std::string::npos) {
21
243
    result.emplace_back(cmGeneratorExpressionToken::Text, input.c_str(),
22
243
                        input.size());
23
243
    return result;
24
243
  }
25
26
2.16k
  char const* c = input.c_str();
27
2.16k
  char const* upto = c;
28
29
711k
  for (; *c; ++c) {
30
709k
    switch (*c) {
31
302k
      case '$':
32
302k
        if (c[1] == '<') {
33
287k
          InsertText(upto, c, result);
34
287k
          result.emplace_back(cmGeneratorExpressionToken::BeginExpression, c,
35
287k
                              2);
36
287k
          upto = c + 2;
37
287k
          ++c;
38
287k
          this->SawBeginExpression = true;
39
287k
        }
40
302k
        break;
41
46.4k
      case '>':
42
46.4k
        InsertText(upto, c, result);
43
46.4k
        result.emplace_back(cmGeneratorExpressionToken::EndExpression, c, 1);
44
46.4k
        upto = c + 1;
45
46.4k
        this->SawGeneratorExpression = this->SawBeginExpression;
46
46.4k
        break;
47
137k
      case ':':
48
137k
        InsertText(upto, c, result);
49
137k
        result.emplace_back(cmGeneratorExpressionToken::ColonSeparator, c, 1);
50
137k
        upto = c + 1;
51
137k
        break;
52
21.9k
      case ',':
53
21.9k
        InsertText(upto, c, result);
54
21.9k
        result.emplace_back(cmGeneratorExpressionToken::CommaSeparator, c, 1);
55
21.9k
        upto = c + 1;
56
21.9k
        break;
57
201k
      default:
58
201k
        break;
59
709k
    }
60
709k
  }
61
2.16k
  InsertText(upto, c, result);
62
63
2.16k
  return result;
64
2.16k
}