diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp --- a/clang-tools-extra/clangd/ClangdServer.cpp +++ b/clang-tools-extra/clangd/ClangdServer.cpp @@ -711,7 +711,8 @@ [CB = std::move(CB)](llvm::Expected InpAST) mutable { if (!InpAST) return CB(InpAST.takeError()); - CB(clangd::getFoldingRanges(InpAST->AST)); + CB(clangd::getFoldingRanges(InpAST->AST.getASTContext(), + InpAST->AST.getTokens())); }; WorkScheduler.runWithAST("foldingRanges", File, std::move(Action), TUScheduler::InvalidateOnUpdate); diff --git a/clang-tools-extra/clangd/SemanticSelection.h b/clang-tools-extra/clangd/SemanticSelection.h --- a/clang-tools-extra/clangd/SemanticSelection.h +++ b/clang-tools-extra/clangd/SemanticSelection.h @@ -14,6 +14,7 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_SEMANTICSELECTION_H #include "ParsedAST.h" #include "Protocol.h" +#include "clang/Tooling/Syntax/Tokens.h" #include "llvm/Support/Error.h" #include namespace clang { @@ -27,7 +28,8 @@ /// Returns a list of ranges whose contents might be collapsible in an editor. /// This should include large scopes, preprocessor blocks etc. -llvm::Expected> getFoldingRanges(ParsedAST &AST); +llvm::Expected> +getFoldingRanges(ASTContext &Context, const syntax::TokenBuffer &Tokens); } // namespace clangd } // namespace clang diff --git a/clang-tools-extra/clangd/SemanticSelection.cpp b/clang-tools-extra/clangd/SemanticSelection.cpp --- a/clang-tools-extra/clangd/SemanticSelection.cpp +++ b/clang-tools-extra/clangd/SemanticSelection.cpp @@ -12,6 +12,7 @@ #include "Protocol.h" #include "Selection.h" #include "SourceCode.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/DeclBase.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" @@ -158,11 +159,12 @@ // other code regions (e.g. public/private/protected sections of classes, // control flow statement bodies). // Related issue: https://github.com/clangd/clangd/issues/310 -llvm::Expected> getFoldingRanges(ParsedAST &AST) { - syntax::Arena A(AST.getSourceManager(), AST.getLangOpts(), AST.getTokens()); +llvm::Expected> +getFoldingRanges(ASTContext &Context, const syntax::TokenBuffer &Tokens) { + syntax::Arena A(Context.getSourceManager(), Context.getLangOpts(), Tokens); const auto *SyntaxTree = - syntax::buildSyntaxTree(A, *AST.getASTContext().getTranslationUnitDecl()); - return collectFoldingRanges(SyntaxTree, AST.getSourceManager()); + syntax::buildSyntaxTree(A, *Context.getTranslationUnitDecl()); + return collectFoldingRanges(SyntaxTree, Context.getSourceManager()); } } // namespace clangd diff --git a/clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp b/clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp --- a/clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp @@ -263,7 +263,8 @@ for (const char *Test : Tests) { auto T = Annotations(Test); auto AST = TestTU::withCode(T.code()).build(); - EXPECT_THAT(gatherFoldingRanges(llvm::cantFail(getFoldingRanges(AST))), + EXPECT_THAT(gatherFoldingRanges(llvm::cantFail( + getFoldingRanges(AST.getASTContext(), AST.getTokens()))), UnorderedElementsAreArray(T.ranges())) << Test; }