15 #include "clang/Tooling/Core/Replacement.h" 16 #include "llvm/Support/Error.h" 17 #include "gmock/gmock.h" 18 #include "gtest/gtest.h" 26 std::pair<llvm::StringRef, llvm::StringRef> wrapping(Context
Ctx) {
31 return {
"void wrapperFunction(){\n",
"\n}"};
33 return {
"auto expressionWrapper(){return\n",
"\n;}"};
35 llvm_unreachable(
"Unknown TweakTest::CodeContext enum");
38 std::string
wrap(Context Ctx, llvm::StringRef Inner) {
39 auto Wrapping = wrapping(Ctx);
40 return (Wrapping.first + Inner + Wrapping.second).str();
43 llvm::StringRef unwrap(Context Ctx, llvm::StringRef Outer) {
44 auto Wrapping = wrapping(Ctx);
47 if (Outer.startswith(Wrapping.first) && Outer.endswith(Wrapping.second) &&
48 Outer.size() >= Wrapping.first.size() + Wrapping.second.size())
49 return Outer.drop_front(Wrapping.first.size()).drop_back(Wrapping.second.size());
53 std::pair<unsigned, unsigned> rangeOrPoint(
const Annotations &A) {
55 if (A.points().size() != 0) {
56 assert(A.ranges().size() == 0 &&
57 "both a cursor point and a selection range were specified");
58 SelectionRng =
Range{A.point(), A.point()};
60 SelectionRng = A.range();
66 MATCHER_P7(TweakIsAvailable, TweakID, Ctx, Header, ExtraArgs, ExtraFiles,
Index,
68 (TweakID + (negation ?
" is unavailable" :
" is available")).str()) {
69 std::string WrappedCode =
wrap(Ctx, arg);
70 Annotations Input(WrappedCode);
71 auto Selection = rangeOrPoint(Input);
74 TU.HeaderCode = Header;
75 TU.Code = Input.code();
76 TU.ExtraArgs = ExtraArgs;
77 TU.AdditionalFiles = std::move(ExtraFiles);
78 ParsedAST AST = TU.
build();
79 Tweak::Selection S(
Index, AST, Selection.first, Selection.second);
83 llvm::consumeError(PrepareResult.takeError());
90 llvm::StringMap<std::string> *EditedFiles)
const {
91 std::string WrappedCode =
wrap(
Context, MarkedCode);
93 auto Selection = rangeOrPoint(Input);
99 TU.
Code = Input.code();
106 llvm::consumeError(T.takeError());
107 return "unavailable";
109 llvm::Expected<Tweak::Effect> Result = (*T)->apply(S);
112 if (Result->ShowMessage)
113 return "message:\n" + *Result->ShowMessage;
114 if (Result->ApplyEdits.empty())
117 std::string EditedMainFile;
118 for (
auto &It : Result->ApplyEdits) {
119 auto NewText = It.second.apply();
122 llvm::StringRef Unwrapped = unwrap(
Context, *NewText);
124 EditedMainFile = Unwrapped;
127 ADD_FAILURE() <<
"There were changes to additional files, but client " 128 "provided a nullptr for EditedFiles.";
130 EditedFiles->insert_or_assign(It.first(), Unwrapped.str());
133 return EditedMainFile;
143 llvm::StringRef
Code = Test.code();
144 std::vector<std::string> Cases;
145 for (
const auto& Point : Test.
points()) {
147 Cases.push_back((Code.substr(0, Offset) +
"^" + Code.substr(Offset)).str());
152 Cases.push_back((Code.substr(0, Begin) +
"[[" +
153 Code.substr(Begin, End - Begin) +
"]]" + Code.substr(End))
156 assert(!Cases.empty() &&
"No markings in MarkedCode?");
Position start
The range's start position.
std::vector< const char * > ExtraArgs
llvm::Expected< std::unique_ptr< Tweak > > prepareTweak(StringRef ID, const Tweak::Selection &S)
::testing::Matcher< llvm::StringRef > isAvailable() const
static llvm::StringRef toString(SpecialMemberFunctionsCheck::SpecialMemberFunctionKind K)
static std::vector< std::string > expandCases(llvm::StringRef MarkedCode)
std::string apply(llvm::StringRef MarkedCode, llvm::StringMap< std::string > *EditedFiles=nullptr) const
std::vector< clangd::Range > ranges(llvm::StringRef Name="") const
std::unique_ptr< const SymbolIndex > Index
std::vector< const char * > ExtraArgs
llvm::StringMap< std::string > ExtraFiles
llvm::Expected< size_t > positionToOffset(llvm::StringRef Code, Position P, bool AllowColumnsBeyondLineLength)
Turn a [line, column] pair into an offset in Code.
std::string testPath(PathRef File)
std::vector< Position > points(llvm::StringRef Name="") const
A context is an immutable container for per-request data that must be propagated through layers that ...
Input to prepare and apply tweaks.
Stores and provides access to parsed AST.
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
CharSourceRange Range
SourceRange for the file name.
Same as llvm::Annotations, but adjusts functions to LSP-specific types for positions and ranges...
static llvm::Optional< ParsedAST > build(std::unique_ptr< clang::CompilerInvocation > CI, llvm::ArrayRef< Diag > CompilerInvocationDiags, std::shared_ptr< const PreambleData > Preamble, std::unique_ptr< llvm::MemoryBuffer > Buffer, llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS, const SymbolIndex *Index, const ParseOptions &Opts)
Attempts to run Clang and store parsed AST.
Position end
The range's end position.
llvm::StringMap< std::string > AdditionalFiles
const SymbolIndex * Index