summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/ClangdServer.cpp
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2019-02-01 15:09:47 +0000
committerSam McCall <sam.mccall@gmail.com>2019-02-01 15:09:47 +0000
commit9c8f432617ff23affab13238d555afa078e0ea36 (patch)
tree2a15150650e13044f43360d4698dbcde2cac5ad4 /clang-tools-extra/clangd/ClangdServer.cpp
parent2048f22892347c28a5e2d6c64b9589cb485cfb3a (diff)
downloadbcm5719-llvm-9c8f432617ff23affab13238d555afa078e0ea36.tar.gz
bcm5719-llvm-9c8f432617ff23affab13238d555afa078e0ea36.zip
[clangd] Expose SelectionTree to code tweaks, and use it for swap if branches.
Summary: This reduces the per-check implementation burden and redundant work. It also makes checks range-aware by default (treating the commonAncestor as if it were a point selection should be good baseline behavior). Reviewers: ilya-biryukov Subscribers: ioeric, MaskRay, jkorous, arphaman, kadircet Tags: #clang Differential Revision: https://reviews.llvm.org/D57570 llvm-svn: 352876
Diffstat (limited to 'clang-tools-extra/clangd/ClangdServer.cpp')
-rw-r--r--clang-tools-extra/clangd/ClangdServer.cpp41
1 files changed, 20 insertions, 21 deletions
diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp
index a677c49a8b7..595e0758513 100644
--- a/clang-tools-extra/clangd/ClangdServer.cpp
+++ b/clang-tools-extra/clangd/ClangdServer.cpp
@@ -328,23 +328,28 @@ void ClangdServer::rename(PathRef File, Position Pos, llvm::StringRef NewName,
"Rename", File, Bind(Action, File.str(), NewName.str(), std::move(CB)));
}
+static llvm::Expected<Tweak::Selection>
+tweakSelection(const Range &Sel, const InputsAndAST &AST) {
+ auto Begin = positionToOffset(AST.Inputs.Contents, Sel.start);
+ if (!Begin)
+ return Begin.takeError();
+ auto End = positionToOffset(AST.Inputs.Contents, Sel.end);
+ if (!End)
+ return End.takeError();
+ return Tweak::Selection(AST.AST, *Begin, *End);
+}
+
void ClangdServer::enumerateTweaks(PathRef File, Range Sel,
Callback<std::vector<TweakRef>> CB) {
auto Action = [Sel](decltype(CB) CB, std::string File,
Expected<InputsAndAST> InpAST) {
if (!InpAST)
return CB(InpAST.takeError());
-
- auto &AST = InpAST->AST;
- auto CursorLoc = sourceLocationInMainFile(
- AST.getASTContext().getSourceManager(), Sel.start);
- if (!CursorLoc)
- return CB(CursorLoc.takeError());
- Tweak::Selection Inputs = {InpAST->Inputs.Contents, InpAST->AST,
- *CursorLoc};
-
+ auto Selection = tweakSelection(Sel, *InpAST);
+ if (!Selection)
+ return CB(Selection.takeError());
std::vector<TweakRef> Res;
- for (auto &T : prepareTweaks(Inputs))
+ for (auto &T : prepareTweaks(*Selection))
Res.push_back({T->id(), T->title()});
CB(std::move(Res));
};
@@ -359,20 +364,14 @@ void ClangdServer::applyTweak(PathRef File, Range Sel, StringRef TweakID,
Expected<InputsAndAST> InpAST) {
if (!InpAST)
return CB(InpAST.takeError());
-
- auto &AST = InpAST->AST;
- auto CursorLoc = sourceLocationInMainFile(
- AST.getASTContext().getSourceManager(), Sel.start);
- if (!CursorLoc)
- return CB(CursorLoc.takeError());
- Tweak::Selection Inputs = {InpAST->Inputs.Contents, InpAST->AST,
- *CursorLoc};
-
- auto A = prepareTweak(TweakID, Inputs);
+ auto Selection = tweakSelection(Sel, *InpAST);
+ if (!Selection)
+ return CB(Selection.takeError());
+ auto A = prepareTweak(TweakID, *Selection);
if (!A)
return CB(A.takeError());
// FIXME: run formatter on top of resulting replacements.
- return CB((*A)->apply(Inputs));
+ return CB((*A)->apply(*Selection));
};
WorkScheduler.runWithAST(
"ApplyTweak", File,
OpenPOWER on IntegriCloud