11 #include "llvm/Support/Error.h"
13 using namespace clang;
19 void enumerateTokenSpans(
const syntax::Tree *Root, ProcessTokensFn Callback) {
21 Enumerator(ProcessTokensFn Callback)
22 : SpanBegin(nullptr), SpanEnd(nullptr), SpanIsOriginal(
false),
29 Callback(llvm::makeArrayRef(SpanBegin, SpanEnd), SpanIsOriginal);
34 if (
auto *T = dyn_cast<syntax::Tree>(N)) {
35 for (
const auto *C = T->getFirstChild(); C !=
nullptr;
36 C =
C->getNextSibling())
41 auto *L = cast<syntax::Leaf>(N);
42 if (SpanEnd == L->getToken() && SpanIsOriginal == L->isOriginal()) {
49 Callback(llvm::makeArrayRef(SpanBegin, SpanEnd), SpanIsOriginal);
51 SpanBegin = L->getToken();
52 SpanEnd = SpanBegin + 1;
53 SpanIsOriginal = L->isOriginal();
59 ProcessTokensFn Callback;
62 return Enumerator(Callback).run(Root);
71 assert(Buffer.expandedTokens().begin() <= Expanded.begin());
72 assert(Expanded.end() < Buffer.expandedTokens().end());
77 SM,
SM.getExpansionLoc(Expanded.begin()->location()), 0);
79 auto Spelled = Buffer.spelledForExpanded(Expanded);
80 assert(Spelled &&
"could not find spelled tokens for expanded");
87 const syntax::TranslationUnit &TU) {
95 if (ReplacedRange.empty() && Replacement.empty())
98 SM, rangeOfExpanded(A, ReplacedRange).toCharRange(
SM), Replacement)));
102 const syntax::Token *NextOriginal = Buffer.expandedTokens().begin();
110 assert(NextOriginal <= Tokens.begin());
112 if (NextOriginal != Tokens.begin()) {
119 NextOriginal = Tokens.end();
124 NextOriginal, Buffer.expandedTokens().drop_back().end()));