summaryrefslogtreecommitdiffstats
path: root/clang/lib/Tooling/Refactoring/RangeSelector.cpp
diff options
context:
space:
mode:
authorYitzhak Mandelbaum <yitzhakm@google.com>2019-05-29 12:40:36 +0000
committerYitzhak Mandelbaum <yitzhakm@google.com>2019-05-29 12:40:36 +0000
commite1312c54d3dc2aa8820a505de460939a2042050d (patch)
tree3ff950e82cbcc5d4b442889bb142dde8fa014696 /clang/lib/Tooling/Refactoring/RangeSelector.cpp
parent33da02762fe129f8167924892000295991b6daf3 (diff)
downloadbcm5719-llvm-e1312c54d3dc2aa8820a505de460939a2042050d.tar.gz
bcm5719-llvm-e1312c54d3dc2aa8820a505de460939a2042050d.zip
[LibTooling] Add `before` and `after` selectors for selecting point-ranges relative to nodes.
Summary: The `before` and `after` selectors allow users to specify a zero-length range -- a point -- at the relevant location in an AST-node's source. Point ranges can be useful, for example, to insert a change using an API that takes a range to be modified (e.g. `tooling::change()`). Reviewers: ilya-biryukov Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D62419 llvm-svn: 361955
Diffstat (limited to 'clang/lib/Tooling/Refactoring/RangeSelector.cpp')
-rw-r--r--clang/lib/Tooling/Refactoring/RangeSelector.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Tooling/Refactoring/RangeSelector.cpp b/clang/lib/Tooling/Refactoring/RangeSelector.cpp
index d5f82d4262b..768c02e2277 100644
--- a/clang/lib/Tooling/Refactoring/RangeSelector.cpp
+++ b/clang/lib/Tooling/Refactoring/RangeSelector.cpp
@@ -104,6 +104,28 @@ static SourceLocation findOpenParen(const CallExpr &E, const SourceManager &SM,
return findPreviousTokenKind(EndLoc, SM, LangOpts, tok::TokenKind::l_paren);
}
+RangeSelector tooling::before(RangeSelector Selector) {
+ return [Selector](const MatchResult &Result) -> Expected<CharSourceRange> {
+ Expected<CharSourceRange> SelectedRange = Selector(Result);
+ if (!SelectedRange)
+ return SelectedRange.takeError();
+ return CharSourceRange::getCharRange(SelectedRange->getBegin());
+ };
+}
+
+RangeSelector tooling::after(RangeSelector Selector) {
+ return [Selector](const MatchResult &Result) -> Expected<CharSourceRange> {
+ Expected<CharSourceRange> SelectedRange = Selector(Result);
+ if (!SelectedRange)
+ return SelectedRange.takeError();
+ if (SelectedRange->isCharRange())
+ return CharSourceRange::getCharRange(SelectedRange->getEnd());
+ return CharSourceRange::getCharRange(Lexer::getLocForEndOfToken(
+ SelectedRange->getEnd(), 0, Result.Context->getSourceManager(),
+ Result.Context->getLangOpts()));
+ };
+}
+
RangeSelector tooling::node(std::string ID) {
return [ID](const MatchResult &Result) -> Expected<CharSourceRange> {
Expected<DynTypedNode> Node = getNode(Result.Nodes, ID);
OpenPOWER on IntegriCloud