12 #include "clang/AST/ASTContext.h" 13 #include "clang/Basic/SourceManager.h" 14 #include "clang/Lex/Lexer.h" 15 #include "llvm/Support/Errc.h" 16 #include "llvm/Support/Error.h" 17 #include "llvm/Support/Path.h" 29 template <
typename Callback>
31 for (
size_t I = 0; I < U8.size();) {
32 unsigned char C =
static_cast<unsigned char>(U8[I]);
33 if (LLVM_LIKELY(!(C & 0x80))) {
40 size_t UTF8Length = countLeadingOnes(C);
43 assert((UTF8Length >= 2 && UTF8Length <= 4) &&
44 "Invalid UTF-8, or transcoding bug?");
48 if (CB(UTF8Length, UTF8Length == 4 ? 2 : 1))
57 static size_t measureUTF16(StringRef U8,
int U16Units,
bool &Valid) {
67 return std::min(Result, U8.size());
84 bool AllowColumnsBeyondLineLength) {
86 return llvm::make_error<llvm::StringError>(
87 llvm::formatv(
"Line value can't be negative ({0})", P.
line),
88 llvm::errc::invalid_argument);
90 return llvm::make_error<llvm::StringError>(
91 llvm::formatv(
"Character value can't be negative ({0})", P.
character),
92 llvm::errc::invalid_argument);
93 size_t StartOfLine = 0;
94 for (
int I = 0; I != P.
line; ++I) {
95 size_t NextNL = Code.find(
'\n', StartOfLine);
96 if (NextNL == StringRef::npos)
97 return llvm::make_error<llvm::StringError>(
98 llvm::formatv(
"Line value is out of range ({0})", P.
line),
99 llvm::errc::invalid_argument);
100 StartOfLine = NextNL + 1;
103 size_t NextNL = Code.find(
'\n', StartOfLine);
104 if (NextNL == StringRef::npos)
105 NextNL = Code.size();
109 Code.substr(StartOfLine, NextNL - StartOfLine), P.
character, Valid);
110 if (!Valid && !AllowColumnsBeyondLineLength)
111 return llvm::make_error<llvm::StringError>(
112 llvm::formatv(
"UTF-16 offset {0} is invalid for line {1}", P.
character,
114 llvm::errc::invalid_argument);
115 return StartOfLine + ByteOffsetInLine;
119 Offset = std::min(Code.size(), Offset);
120 StringRef Before = Code.substr(0, Offset);
121 int Lines = Before.count(
'\n');
122 size_t PrevNL = Before.rfind(
'\n');
123 size_t StartOfLine = (PrevNL == StringRef::npos) ? 0 : (PrevNL + 1);
134 std::tie(FID, Offset) = SM.getDecomposedSpellingLoc(Loc);
136 P.
line =
static_cast<int>(SM.getLineNumber(FID, Offset)) - 1;
137 bool Invalid =
false;
138 StringRef Code = SM.getBufferData(FID, &Invalid);
140 auto ColumnInBytes = SM.getColumnNumber(FID, Offset) - 1;
141 auto LineSoFar = Code.substr(Offset - ColumnInBytes, ColumnInBytes);
157 Offset = std::min(Code.size(), Offset);
158 StringRef Before = Code.substr(0, Offset);
159 int Lines = Before.count(
'\n');
160 size_t PrevNL = Before.rfind(
'\n');
161 size_t StartOfLine = (PrevNL == StringRef::npos) ? 0 : (PrevNL + 1);
162 return {Lines + 1, Offset - StartOfLine + 1};
165 std::pair<llvm::StringRef, llvm::StringRef>
167 size_t Pos = QName.rfind(
"::");
168 if (Pos == llvm::StringRef::npos)
169 return {StringRef(), QName};
170 return {QName.substr(0, Pos + 2), QName.substr(Pos + 2)};
174 Range ReplacementRange = {
177 return {ReplacementRange, R.getReplacementText()};
181 const tooling::Replacements &Repls) {
182 std::vector<TextEdit> Edits;
183 for (
const auto &R : Repls)
188 llvm::Optional<std::string>
190 SmallString<64> FilePath = F->tryGetRealPathName();
191 if (FilePath.empty())
192 FilePath = F->getName();
193 if (!llvm::sys::path::is_absolute(FilePath)) {
194 if (!SourceMgr.getFileManager().makeAbsolutePath(FilePath)) {
195 log(
"Could not turn relative path to absolute: {0}", FilePath);
199 return FilePath.str().str();
SourceLocation Loc
'#' location in the include directive
std::pair< size_t, size_t > offsetToClangLineColumn(StringRef Code, size_t Offset)
Some operations such as code completion produce a set of candidates.
static bool iterateCodepoints(StringRef U8, const Callback &CB)
llvm::unique_function< void(llvm::Expected< T >)> Callback
A Callback<T> is a void function that accepts Expected<T>.
Documents should not be synced at all.
llvm::Expected< size_t > positionToOffset(StringRef Code, Position P, bool AllowColumnsBeyondLineLength)
TextEdit replacementToEdit(StringRef Code, const tooling::Replacement &R)
void log(const char *Fmt, Ts &&... Vals)
std::vector< TextEdit > replacementsToEdits(StringRef Code, const tooling::Replacements &Repls)
Position sourceLocToPosition(const SourceManager &SM, SourceLocation Loc)
Turn a SourceLocation into a [line, column] pair.
int line
Line position in a document (zero-based).
int character
Character offset on a line in a document (zero-based).
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
std::pair< llvm::StringRef, llvm::StringRef > splitQualifiedName(llvm::StringRef QName)
From "a::b::c", return {"a::b::", "c"}.
static size_t utf16Len(StringRef U8)
static size_t measureUTF16(StringRef U8, int U16Units, bool &Valid)
llvm::Optional< std::string > getAbsoluteFilePath(const FileEntry *F, const SourceManager &SourceMgr)
Get the absolute file path of a given file entry.
Range halfOpenToRange(const SourceManager &SM, CharSourceRange R)
Position offsetToPosition(StringRef Code, size_t Offset)