clang-tools  11.0.0
ConfigTesting.h
Go to the documentation of this file.
1 //===-- ConfigTesting.h - Helpers for configuration tests -------*- C++ -*-===//
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 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_CONFIGTESTING_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_CONFIGTESTING_H
11 
12 #include "Protocol.h"
13 #include "llvm/Support/ScopedPrinter.h"
14 #include "llvm/Support/SourceMgr.h"
15 #include "gmock/gmock.h"
16 #include <functional>
17 
18 namespace clang {
19 namespace clangd {
20 namespace config {
21 
22 // Provides a DiagnosticsCallback that records diganostics.
23 // Unlike just pushing them into a vector, underlying storage need not survive.
24 struct CapturedDiags {
25  std::function<void(const llvm::SMDiagnostic &)> callback() {
26  return [this](const llvm::SMDiagnostic &D) {
27  Diagnostics.emplace_back();
28  Diag &Out = Diagnostics.back();
29  Out.Message = D.getMessage().str();
30  Out.Kind = D.getKind();
31  Out.Pos.line = D.getLineNo() - 1;
32  Out.Pos.character = D.getColumnNo(); // Zero-based - bug in SourceMgr?
33  if (!D.getRanges().empty()) {
34  const auto &R = D.getRanges().front();
35  Out.Rng.emplace();
36  Out.Rng->start.line = Out.Rng->end.line = Out.Pos.line;
37  Out.Rng->start.character = R.first;
38  Out.Rng->end.character = R.second;
39  }
40  };
41  }
42  struct Diag {
43  std::string Message;
44  llvm::SourceMgr::DiagKind Kind;
46  llvm::Optional<Range> Rng;
47 
48  friend void PrintTo(const Diag &D, std::ostream *OS) {
49  *OS << (D.Kind == llvm::SourceMgr::DK_Error ? "error: " : "warning: ")
50  << D.Message << "@" << llvm::to_string(D.Pos);
51  }
52  };
53  std::vector<Diag> Diagnostics;
54 };
55 
56 MATCHER_P(DiagMessage, M, "") { return arg.Message == M; }
57 MATCHER_P(DiagKind, K, "") { return arg.Kind == K; }
58 MATCHER_P(DiagPos, P, "") { return arg.Pos == P; }
59 MATCHER_P(DiagRange, R, "") { return arg.Rng == R; }
60 
61 inline Position toPosition(llvm::SMLoc L, const llvm::SourceMgr &SM) {
62  auto LineCol = SM.getLineAndColumn(L);
63  Position P;
64  P.line = LineCol.first - 1;
65  P.character = LineCol.second - 1;
66  return P;
67 }
68 
69 inline Range toRange(llvm::SMRange R, const llvm::SourceMgr &SM) {
70  return Range{toPosition(R.Start, SM), toPosition(R.End, SM)};
71 }
72 
73 } // namespace config
74 } // namespace clangd
75 } // namespace clang
76 
77 #endif
clang::clangd::config::CapturedDiags::Diag::Rng
llvm::Optional< Range > Rng
Definition: ConfigTesting.h:46
clang::clangd::config::CapturedDiags::Diag::Message
std::string Message
Definition: ConfigTesting.h:43
clang::clangd::config::CapturedDiags::callback
std::function< void(const llvm::SMDiagnostic &)> callback()
Definition: ConfigTesting.h:25
clang::clangd::config::CapturedDiags::Diag
Definition: ConfigTesting.h:42
SourceMgr
llvm::SourceMgr * SourceMgr
Definition: ConfigCompile.cpp:72
clang::clangd::Position::line
int line
Line position in a document (zero-based).
Definition: Protocol.h:146
Protocol.h
clang::clangd::Position
Definition: Protocol.h:144
clang::clangd::config::MATCHER_P
MATCHER_P(DiagMessage, M, "")
Definition: ConfigTesting.h:56
clang::clangd::config::toPosition
Position toPosition(llvm::SMLoc L, const llvm::SourceMgr &SM)
Definition: ConfigTesting.h:61
clang::clangd::Position::character
int character
Character offset on a line in a document (zero-based).
Definition: Protocol.h:151
clang::clangd::config::CapturedDiags::Diag::Pos
Position Pos
Definition: ConfigTesting.h:45
clang::clangd::config::CapturedDiags
Definition: ConfigTesting.h:24
clang::clangd::Range
Definition: Protocol.h:173
clang::clangd::config::CapturedDiags::Diag::PrintTo
friend void PrintTo(const Diag &D, std::ostream *OS)
Definition: ConfigTesting.h:48
clang
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Definition: ApplyReplacements.h:27
OS
llvm::raw_string_ostream OS
Definition: TraceTests.cpp:162
clang::clangd::config::CapturedDiags::Diag::Kind
llvm::SourceMgr::DiagKind Kind
Definition: ConfigTesting.h:44
clang::clangd::config::CapturedDiags::Diagnostics
std::vector< Diag > Diagnostics
Definition: ConfigTesting.h:53
clang::clangd::config::toRange
Range toRange(llvm::SMRange R, const llvm::SourceMgr &SM)
Definition: ConfigTesting.h:69
Out
CompiledFragmentImpl & Out
Definition: ConfigCompile.cpp:70