summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/Selection.cpp
diff options
context:
space:
mode:
authorKadir Cetinkaya <kadircet@google.com>2020-01-13 12:09:30 +0100
committerKadir Cetinkaya <kadircet@google.com>2020-01-13 20:33:13 +0100
commitf5465e74ef4c9e24f867002aa598dc9e6481ead3 (patch)
tree43afa24e997b473c31e02db121e6d013a6d36981 /clang-tools-extra/clangd/Selection.cpp
parent15078d7202b410fd15eedc49d2ab2e4fe9a9f177 (diff)
downloadbcm5719-llvm-f5465e74ef4c9e24f867002aa598dc9e6481ead3.tar.gz
bcm5719-llvm-f5465e74ef4c9e24f867002aa598dc9e6481ead3.zip
[clangd] Include expression in DecltypeTypeLoc sourcerange while building SelectionTree
Summary: Currently AST only contains the location for `decltype` keyword, therefore we were skipping expressions inside decltype while building selection tree. This patch extends source range in such cases to contain the expression as well. A proper fix would require changes to Sema and DecltypeTypeLoc to contain these location information. Fixes https://github.com/clangd/clangd/issues/250. Reviewers: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D72594
Diffstat (limited to 'clang-tools-extra/clangd/Selection.cpp')
-rw-r--r--clang-tools-extra/clangd/Selection.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/Selection.cpp b/clang-tools-extra/clangd/Selection.cpp
index ffa48f3a57d..14c05d1c0b4 100644
--- a/clang-tools-extra/clangd/Selection.cpp
+++ b/clang-tools-extra/clangd/Selection.cpp
@@ -527,6 +527,19 @@ private:
// don't intersect the selection may be recursively skipped.
bool canSafelySkipNode(const DynTypedNode &N) {
SourceRange S = N.getSourceRange();
+ if (auto *TL = N.get<TypeLoc>()) {
+ // DeclTypeTypeLoc::getSourceRange() is incomplete, which would lead to
+ // failing
+ // to descend into the child expression.
+ // decltype(2+2);
+ // ~~~~~~~~~~~~~ <-- correct range
+ // ~~~~~~~~ <-- range reported by getSourceRange()
+ // ~~~~~~~~~~~~ <-- range with this hack(i.e, missing closing paren)
+ // FIXME: Alter DecltypeTypeLoc to contain parentheses locations and get
+ // rid of this patch.
+ if (auto DT = TL->getAs<DecltypeTypeLoc>())
+ S.setEnd(DT.getUnderlyingExpr()->getEndLoc());
+ }
if (!SelChecker.mayHit(S)) {
dlog("{1}skip: {0}", printNodeToString(N, PrintPolicy), indent());
dlog("{1}skipped range = {0}", S.printToString(SM), indent(1));
OpenPOWER on IntegriCloud