Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/clang-tools-extra/pseudo/lib/Token.cpp
Line
Count
Source (jump to first uncovered line)
1
//===--- Token.cpp - Tokens and token streams in the pseudoparser ---------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "clang-pseudo/Token.h"
10
#include "clang/Basic/LangOptions.h"
11
#include "llvm/ADT/StringExtras.h"
12
#include "llvm/Support/Format.h"
13
#include "llvm/Support/FormatVariadic.h"
14
15
namespace clang {
16
namespace pseudo {
17
18
0
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Token &T) {
19
0
  OS << llvm::formatv("{0} {1}:{2} ", clang::tok::getTokenName(T.Kind), T.Line,
20
0
                      T.Indent);
21
0
  OS << '"';
22
0
  llvm::printEscapedString(T.text(), OS);
23
0
  OS << '"';
24
0
  if (T.Flags)
25
0
    OS << llvm::format(" flags=%x", T.Flags);
26
0
  return OS;
27
0
}
28
29
0
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const TokenStream &TS) {
30
0
  OS << "Index               Kind    Line  Text\n";
31
0
  for (const auto &T : TS.tokens()) {
32
0
    OS << llvm::format("%5d:  %16s %4d:%-2d  ", TS.index(T),
33
0
                       clang::tok::getTokenName(T.Kind), T.Line, T.Indent);
34
0
    OS << '"';
35
0
    llvm::printEscapedString(T.text(), OS);
36
0
    OS << '"';
37
0
    if (T.Flags)
38
0
      OS << llvm::format("  flags=%x", T.Flags);
39
0
    OS << '\n';
40
0
  }
41
0
  return OS;
42
0
}
43
44
0
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Token::Range &R) {
45
0
  OS << llvm::formatv("[{0},{1})", R.Begin, R.End);
46
0
  return OS;
47
0
}
48
49
TokenStream::TokenStream(std::shared_ptr<void> Payload)
50
28.6k
    : Payload(std::move(Payload)) {
51
28.6k
  Storage.emplace_back();
52
28.6k
  Storage.back().Kind = clang::tok::eof;
53
28.6k
}
54
55
28.6k
void TokenStream::finalize() {
56
28.6k
  assert(!isFinalized());
57
0
  unsigned LastLine = Storage.back().Line;
58
28.6k
  Storage.emplace_back();
59
28.6k
  Storage.back().Kind = tok::eof;
60
28.6k
  Storage.back().Line = LastLine + 1;
61
62
28.6k
  Tokens = Storage;
63
28.6k
  Tokens = Tokens.drop_front().drop_back();
64
28.6k
}
65
66
165M
bool TokenStream::isFinalized() const {
67
165M
  assert(!Storage.empty() && Storage.front().Kind == tok::eof);
68
165M
  if (Storage.size() == 1)
69
28.6k
    return false;
70
165M
  return Storage.back().Kind == tok::eof;
71
165M
}
72
73
0
void TokenStream::print(llvm::raw_ostream &OS) const {
74
0
  bool FirstToken = true;
75
0
  unsigned LastLine = -1;
76
0
  StringRef LastText;
77
0
  for (const auto &T : tokens()) {
78
0
    StringRef Text = T.text();
79
0
    if (FirstToken) {
80
0
      FirstToken = false;
81
0
    } else if (T.Line == LastLine) {
82
0
      if (LastText.data() + LastText.size() != Text.data())
83
0
        OS << ' ';
84
0
    } else {
85
0
      OS << '\n';
86
0
      OS.indent(T.Indent);
87
0
    }
88
0
    OS << Text;
89
0
    LastLine = T.Line;
90
0
    LastText = Text;
91
0
  }
92
0
  if (!FirstToken)
93
0
    OS << '\n';
94
0
}
95
96
clang::LangOptions genericLangOpts(clang::Language Lang,
97
2
                                   clang::LangStandard::Kind Standard) {
98
2
  clang::LangOptions Opts;
99
2
  std::vector<std::string> UnusedIncludes;
100
2
  LangOptions::setLangDefaults(Opts, Lang, llvm::Triple(), UnusedIncludes,
101
2
                               Standard);
102
103
  // Some options are "on by default", but e.g. at the driver level.
104
2
  if (Opts.CPlusPlus)
105
2
    Opts.CXXOperatorNames = true;
106
2
  if (Opts.CPlusPlus20)
107
0
    Opts.Coroutines = true;
108
109
  // Some options are off by default, but define keywords we want to tolerate.
110
2
  if (Opts.CPlusPlus)
111
2
    Opts.MicrosoftExt = true;  // kw__try, kw__finally
112
2
  Opts.DeclSpecKeyword = true; // __declspec
113
2
  Opts.WChar = true;
114
115
2
  return Opts;
116
2
}
117
118
9.56k
TokenStream stripComments(const TokenStream &Input) {
119
9.56k
  TokenStream Out(Input.getPayload());
120
53.1M
  for (const Token &T : Input.tokens()) {
121
53.1M
    if (T.Kind == tok::comment)
122
24.2k
      continue;
123
53.1M
    Out.push(T);
124
53.1M
  }
125
9.56k
  Out.finalize();
126
9.56k
  return Out;
127
9.56k
}
128
129
} // namespace pseudo
130
} // namespace clang