Author: Kadir Cetinkaya Date: 2022-01-14T14:32:43+01:00 New Revision: 1093b9f2e9842982d97534940a643e3a4657c60b
URL: https://github.com/llvm/llvm-project/commit/1093b9f2e9842982d97534940a643e3a4657c60b DIFF: https://github.com/llvm/llvm-project/commit/1093b9f2e9842982d97534940a643e3a4657c60b.diff LOG: Revert "[clangd] Elide even more checks in SelectionTree." This reverts commit 07f9fb8b51417ec3e6f46508e1b5ef78287b32ad. Added: Modified: clang-tools-extra/clangd/Selection.cpp clang-tools-extra/clangd/unittests/SelectionTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Selection.cpp b/clang-tools-extra/clangd/Selection.cpp index 8fb5918c5d000..011e24ee70b2f 100644 --- a/clang-tools-extra/clangd/Selection.cpp +++ b/clang-tools-extra/clangd/Selection.cpp @@ -274,37 +274,22 @@ class SelectionTester { for (unsigned I = 0; I < Sel.size(); ++I) { if (shouldIgnore(Sel[I]) || PPIgnored[I]) continue; - SelectedSpelled.emplace_back(); - Tok &S = SelectedSpelled.back(); + SpelledTokens.emplace_back(); + Tok &S = SpelledTokens.back(); S.Offset = SM.getFileOffset(Sel[I].location()); if (S.Offset >= SelBegin && S.Offset + Sel[I].length() <= SelEnd) S.Selected = SelectionTree::Complete; else S.Selected = SelectionTree::Partial; } - MaybeSelectedExpanded = computeMaybeSelectedExpandedTokens(Buf); } // Test whether a consecutive range of tokens is selected. // The tokens are taken from the expanded token stream. SelectionTree::Selection test(llvm::ArrayRef<syntax::Token> ExpandedTokens) const { - if (ExpandedTokens.empty()) + if (SpelledTokens.empty()) return NoTokens; - if (SelectedSpelled.empty()) - return SelectionTree::Unselected; - // Cheap (pointer) check whether any of the tokens could touch selection. - // In most cases, the node's overall source range touches ExpandedTokens, - // or we would have failed mayHit(). However now we're only considering - // the *unclaimed* spans of expanded tokens. - // This is a significant performance improvement when a lot of nodes - // surround the selection, including when generated by macros. - if (MaybeSelectedExpanded.empty() || - &ExpandedTokens.front() > &MaybeSelectedExpanded.back() || - &ExpandedTokens.back() < &MaybeSelectedExpanded.front()) { - return SelectionTree::Unselected; - } - SelectionTree::Selection Result = NoTokens; while (!ExpandedTokens.empty()) { // Take consecutive tokens from the same context together for efficiency. @@ -327,14 +312,14 @@ class SelectionTester { // If it returns false, test() will return NoTokens or Unselected. // If it returns true, test() may return any value. bool mayHit(SourceRange R) const { - if (SelectedSpelled.empty() || MaybeSelectedExpanded.empty()) + if (SpelledTokens.empty()) return false; // If the node starts after the selection ends, it is not selected. // Tokens a macro location might claim are >= its expansion start. // So if the expansion start > last selected token, we can prune it. // (This is particularly helpful for GTest's TEST macro). if (auto B = offsetInSelFile(getExpansionStart(R.getBegin()))) - if (*B > SelectedSpelled.back().Offset) + if (*B > SpelledTokens.back().Offset) return false; // If the node ends before the selection begins, it is not selected. SourceLocation EndLoc = R.getEnd(); @@ -343,72 +328,12 @@ class SelectionTester { // In the rare case that the expansion range is a char range, EndLoc is // ~one token too far to the right. We may fail to prune, that's OK. if (auto E = offsetInSelFile(EndLoc)) - if (*E < SelectedSpelled.front().Offset) + if (*E < SpelledTokens.front().Offset) return false; return true; } private: - // Plausible expanded tokens that might be affected by the selection. - // This is an overestimate, it may contain tokens that are not selected. - // The point is to allow cheap pruning in test() - llvm::ArrayRef<syntax::Token> - computeMaybeSelectedExpandedTokens(const syntax::TokenBuffer &Toks) { - if (SelectedSpelled.empty()) - return {}; - - bool StartInvalid = false; - const syntax::Token *Start = llvm::partition_point( - Toks.expandedTokens(), - [&, First = SelectedSpelled.front().Offset](const syntax::Token &Tok) { - if (Tok.kind() == tok::eof) - return false; - // Implausible if upperbound(Tok) < First. - SourceLocation Loc = Tok.location(); - auto Offset = offsetInSelFile(Loc); - while (Loc.isValid() && !Offset) { - Loc = Loc.isMacroID() ? SM.getImmediateExpansionRange(Loc).getEnd() - : SM.getIncludeLoc(SM.getFileID(Loc)); - Offset = offsetInSelFile(Loc); - } - if (Offset) - return *Offset < First; - StartInvalid = true; - return false; // conservatively assume this token can overlap - }); - if (StartInvalid) { - assert(false && "Expanded tokens could not be resolved to main file!"); - Start = Toks.expandedTokens().begin(); - } - - bool EndInvalid = false; - const syntax::Token *End = llvm::partition_point( - Toks.expandedTokens(), - [&, Last = SelectedSpelled.back().Offset](const syntax::Token &Tok) { - if (Tok.kind() == tok::eof) - return false; - // Plausible if lowerbound(Tok) <= Last. - SourceLocation Loc = Tok.location(); - auto Offset = offsetInSelFile(Loc); - while (Loc.isValid() && !Offset) { - Loc = Loc.isMacroID() - ? SM.getImmediateExpansionRange(Loc).getBegin() - : SM.getIncludeLoc(SM.getFileID(Loc)); - Offset = offsetInSelFile(Loc); - } - if (Offset) - return *Offset <= Last; - EndInvalid = true; - return true; // conservatively assume this token can overlap - }); - if (EndInvalid) { - assert(false && "Expanded tokens could not be resolved to main file!"); - End = Toks.expandedTokens().end(); - } - - return llvm::makeArrayRef(Start, End); - } - // Hit-test a consecutive range of tokens from a single file ID. SelectionTree::Selection testChunk(FileID FID, llvm::ArrayRef<syntax::Token> Batch) const { @@ -464,20 +389,19 @@ class SelectionTester { SelectionTree::Selection testTokenRange(unsigned Begin, unsigned End) const { assert(Begin <= End); // Outside the selection entirely? - if (End < SelectedSpelled.front().Offset || - Begin > SelectedSpelled.back().Offset) + if (End < SpelledTokens.front().Offset || + Begin > SpelledTokens.back().Offset) return SelectionTree::Unselected; // Compute range of tokens. auto B = llvm::partition_point( - SelectedSpelled, [&](const Tok &T) { return T.Offset < Begin; }); - auto E = std::partition_point(B, SelectedSpelled.end(), [&](const Tok &T) { - return T.Offset <= End; - }); + SpelledTokens, [&](const Tok &T) { return T.Offset < Begin; }); + auto E = std::partition_point( + B, SpelledTokens.end(), [&](const Tok &T) { return T.Offset <= End; }); // Aggregate selectedness of tokens in range. - bool ExtendsOutsideSelection = Begin < SelectedSpelled.front().Offset || - End > SelectedSpelled.back().Offset; + bool ExtendsOutsideSelection = Begin < SpelledTokens.front().Offset || + End > SpelledTokens.back().Offset; SelectionTree::Selection Result = ExtendsOutsideSelection ? SelectionTree::Unselected : NoTokens; for (auto It = B; It != E; ++It) @@ -488,13 +412,13 @@ class SelectionTester { // Is the token at `Offset` selected? SelectionTree::Selection testToken(unsigned Offset) const { // Outside the selection entirely? - if (Offset < SelectedSpelled.front().Offset || - Offset > SelectedSpelled.back().Offset) + if (Offset < SpelledTokens.front().Offset || + Offset > SpelledTokens.back().Offset) return SelectionTree::Unselected; // Find the token, if it exists. auto It = llvm::partition_point( - SelectedSpelled, [&](const Tok &T) { return T.Offset < Offset; }); - if (It != SelectedSpelled.end() && It->Offset == Offset) + SpelledTokens, [&](const Tok &T) { return T.Offset < Offset; }); + if (It != SpelledTokens.end() && It->Offset == Offset) return It->Selected; return NoTokens; } @@ -520,8 +444,7 @@ class SelectionTester { unsigned Offset; SelectionTree::Selection Selected; }; - std::vector<Tok> SelectedSpelled; - llvm::ArrayRef<syntax::Token> MaybeSelectedExpanded; + std::vector<Tok> SpelledTokens; FileID SelFile; SourceRange SelFileBounds; const SourceManager &SM; diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp index 41ced0cae22e1..b3a0847c2a4a8 100644 --- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -201,13 +201,6 @@ TEST(SelectionTest, CommonAncestor) { )cpp", nullptr, }, - { - R"cpp( - #define TARGET void foo() - [[TAR^GET{ return; }]] - )cpp", - "FunctionDecl", - }, { R"cpp( struct S { S(const char*); }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits