[PATCH] D72594: [clangd] Include expression in DecltypeTypeLoc sourcerange while building SelectionTree
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 13 11:41:18 PST 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rGf5465e74ef4c: [clangd] Include expression in DecltypeTypeLoc sourcerange while building… (authored by kadircet).
Changed prior to commit:
https://reviews.llvm.org/D72594?vs=237610&id=237743#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D72594/new/
https://reviews.llvm.org/D72594
Files:
clang-tools-extra/clangd/Selection.cpp
clang-tools-extra/clangd/unittests/SelectionTests.cpp
Index: clang-tools-extra/clangd/unittests/SelectionTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -323,6 +323,12 @@
Foo x = [[^12_ud]];
)cpp",
"UserDefinedLiteral"},
+ {
+ R"cpp(
+ int a;
+ decltype([[^a]] + a) b;
+ )cpp",
+ "DeclRefExpr"},
};
for (const Case &C : Cases) {
Annotations Test(C.Code);
Index: clang-tools-extra/clangd/Selection.cpp
===================================================================
--- clang-tools-extra/clangd/Selection.cpp
+++ clang-tools-extra/clangd/Selection.cpp
@@ -527,6 +527,19 @@
// 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));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D72594.237743.patch
Type: text/x-patch
Size: 1711 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200113/68dfb3bb/attachment-0001.bin>
More information about the cfe-commits
mailing list