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));
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));
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits