-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clangd] Support parsing comments without ASTContext #78491
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This is in preparation for implementing doxygen parsing, see discussion in clangd/clangd#529. Differential Revision: https://reviews.llvm.org/D143112
@llvm/pr-subscribers-clang @llvm/pr-subscribers-clangd Author: Tom Praschan (tom-anders) ChangesThis is in preparation for implementing doxygen parsing, see discussion in clangd/clangd#529. (Old Phabricator review: https://reviews.llvm.org/D143112) Full diff: https://github.com/llvm/llvm-project/pull/78491.diff 3 Files Affected:
diff --git a/clang-tools-extra/clangd/CodeCompletionStrings.cpp b/clang-tools-extra/clangd/CodeCompletionStrings.cpp
index 2075e5965f181e..540eaa9a3eb6d7 100644
--- a/clang-tools-extra/clangd/CodeCompletionStrings.cpp
+++ b/clang-tools-extra/clangd/CodeCompletionStrings.cpp
@@ -9,6 +9,9 @@
#include "CodeCompletionStrings.h"
#include "clang-c/Index.h"
#include "clang/AST/ASTContext.h"
+#include "clang/AST/CommentLexer.h"
+#include "clang/AST/CommentParser.h"
+#include "clang/AST/CommentSema.h"
#include "clang/AST/RawCommentList.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Sema/CodeCompleteConsumer.h"
@@ -316,5 +319,26 @@ std::string getReturnType(const CodeCompletionString &CCS) {
return "";
}
+comments::FullComment *parseComment(llvm::StringRef Comment,
+ llvm::BumpPtrAllocator &Allocator,
+ comments::CommandTraits &Traits) {
+ // The comment lexer expects markers, so add them back
+ auto CommentWithMarkers = "/*" + Comment.str() + "*/";
+
+ SourceManagerForFile SourceMgrForFile("mock_file.cpp", CommentWithMarkers);
+ SourceManager &SourceMgr = SourceMgrForFile.get();
+
+ comments::Lexer L(Allocator, SourceMgr.getDiagnostics(), Traits,
+ SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()),
+ CommentWithMarkers.data(),
+ CommentWithMarkers.data() + CommentWithMarkers.size());
+ comments::Sema S(Allocator, SourceMgr, SourceMgr.getDiagnostics(), Traits,
+ nullptr);
+ comments::Parser P(L, S, Allocator, SourceMgr, SourceMgr.getDiagnostics(),
+ Traits);
+
+ return P.parseFullComment();
+}
+
} // namespace clangd
} // namespace clang
diff --git a/clang-tools-extra/clangd/CodeCompletionStrings.h b/clang-tools-extra/clangd/CodeCompletionStrings.h
index fa81ad64d406c3..b93420c68f32db 100644
--- a/clang-tools-extra/clangd/CodeCompletionStrings.h
+++ b/clang-tools-extra/clangd/CodeCompletionStrings.h
@@ -19,6 +19,11 @@
namespace clang {
class ASTContext;
+namespace comments {
+class CommandTraits;
+class FullComment;
+} // namespace comments
+
namespace clangd {
/// Gets a minimally formatted documentation comment of \p Result, with comment
@@ -67,6 +72,12 @@ std::string formatDocumentation(const CodeCompletionString &CCS,
/// is usually the return type of a function.
std::string getReturnType(const CodeCompletionString &CCS);
+/// Parse the \p Comment, storing the result in \p Allocator, assuming
+/// that comment markers have already been stripped (e.g. via getDocComment())
+comments::FullComment *parseComment(llvm::StringRef Comment,
+ llvm::BumpPtrAllocator &Allocator,
+ comments::CommandTraits &Traits);
+
} // namespace clangd
} // namespace clang
diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h
index d2ece14da0b11a..07e3fca1641c73 100644
--- a/clang/include/clang/Basic/SourceManager.h
+++ b/clang/include/clang/Basic/SourceManager.h
@@ -1971,7 +1971,7 @@ class BeforeThanCompare<SourceRange> {
};
/// SourceManager and necessary dependencies (e.g. VFS, FileManager) for a
-/// single in-memorty file.
+/// single in-memory file.
class SourceManagerForFile {
public:
/// Creates SourceManager and necessary dependencies (e.g. VFS, FileManager).
|
When will this ever get merged? Would really like to see |
Well, the last ready-to-go PR was from September (#65448), so probably a while. |
@aaronliu0130 Do you know if a patch for this exists? |
As mentioned in clangd/clangd#529 (comment), they're here. Hopefully you can follow the build instructions. |
I'm new to the processes of open-source software, so pardon my confusion. I just read through this issue and am wondering: |
LLVM has 2.5k PRs to review while working on their own changes |
PRs need to be reviewed before they can be merged. |
What's "ping PR"? Do you mean pinging the LLVM organization? |
It just means posting a comment on the PR that says "ping", as a reminder for reviewers. (But please only do that if you're the patch author, or, in the case of a patch author who's not active any more, if you're volunteering to take over the patch from the patch author and do the work of addressing any remaining review comments.)
Yes, code reviewer bandwidth is the bottleneck for clangd patches at the moment. I have some other patches in my review queue which I've been trying to get to (and unfortunately haven't had much time to spend on them), so I'm hoping Kadir can review this one, especially as he has reviewed earlier versions of this and related patches and has more familiarity with the affected code areas. But if no one else gets to this, I would like to at some point. |
It seems this PR is still stuck. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't know much about the clang-d implementation, but this seems reasonable.
@@ -1971,7 +1971,7 @@ class BeforeThanCompare<SourceRange> { | |||
}; | |||
|
|||
/// SourceManager and necessary dependencies (e.g. VFS, FileManager) for a | |||
/// single in-memorty file. | |||
/// single in-memory file. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unrelated chage, please put this in a different patch.
SourceManagerForFile SourceMgrForFile("mock_file.cpp", CommentWithMarkers); | ||
SourceManager &SourceMgr = SourceMgrForFile.get(); | ||
|
||
comments::Lexer L(Allocator, SourceMgr.getDiagnostics(), Traits, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The order of these constructors seems odd. I would expect us to build these up in the 'correct' order of dependence/execution/etc. So I think you should swap the Lexer
and Sema
lines.
CommentWithMarkers.data(), | ||
CommentWithMarkers.data() + CommentWithMarkers.size()); | ||
comments::Sema S(Allocator, SourceMgr, SourceMgr.getDiagnostics(), Traits, | ||
nullptr); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we need a /*stuff=*/
style comment for the nullptr
here.
Hi everyone, I shifted focus to other projects and currently don't have time to work on this PR anymore. If somebody wants to take over, feel free to do so |
@AaronBallman @erichkeane what do you want to do here? |
Because the author is no longer available for the time being, I'd recommend we close the PR. Someone can always come along to commandeer it if they have the bandwidth to work on it. WDYT? |
Closing due to author nonavailability. Commandeering encouraged! |
This is in preparation for implementing doxygen parsing, see discussion in clangd/clangd#529.
(Old Phabricator review: https://reviews.llvm.org/D143112)