diff options
author | Ilya Biryukov <ibiryukov@google.com> | 2018-06-15 08:31:17 +0000 |
---|---|---|
committer | Ilya Biryukov <ibiryukov@google.com> | 2018-06-15 08:31:17 +0000 |
commit | ae6351a89bc0b0812af4678765532fb4c45f6238 (patch) | |
tree | 8bff1f5a6d54cf2daed16323668e1addf58b582b /clang-tools-extra | |
parent | 4c04298f9e8b012bc1ee890f897fff8961024c7b (diff) |
[clangd] Do not report comments that only have special chars.
Summary:
Like the following:
// -------
// =======
// *******
It does not cover all the cases, but those are definitely not very
useful.
Reviewers: sammccall, ioeric, hokein
Reviewed By: sammccall
Subscribers: MaskRay, jkorous, cfe-commits
Differential Revision: https://reviews.llvm.org/D48171
Diffstat (limited to 'clang-tools-extra')
-rw-r--r-- | clang-tools-extra/clangd/CodeCompletionStrings.cpp | 20 | ||||
-rw-r--r-- | clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp | 59 |
2 files changed, 77 insertions, 2 deletions
diff --git a/clang-tools-extra/clangd/CodeCompletionStrings.cpp b/clang-tools-extra/clangd/CodeCompletionStrings.cpp index 8cdaa3380b8..c3066939a5a 100644 --- a/clang-tools-extra/clangd/CodeCompletionStrings.cpp +++ b/clang-tools-extra/clangd/CodeCompletionStrings.cpp @@ -151,6 +151,16 @@ bool canRequestComment(const ASTContext &Ctx, const NamedDecl &D, const ObjCPropertyDecl *PDecl = M ? M->findPropertyDecl() : nullptr; return !PDecl || canRequestForDecl(*PDecl); } + +bool LooksLikeDocComment(llvm::StringRef CommentText) { + // We don't report comments that only contain "special" chars. + // This avoids reporting various delimiters, like: + // ================= + // ----------------- + // ***************** + return CommentText.find_first_not_of("/*-= \t\r\n") != llvm::StringRef::npos; +} + } // namespace std::string getDocComment(const ASTContext &Ctx, @@ -167,7 +177,10 @@ std::string getDocComment(const ASTContext &Ctx, const RawComment *RC = getCompletionComment(Ctx, Decl); if (!RC) return ""; - return RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics()); + std::string Doc = RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics()); + if (!LooksLikeDocComment(Doc)) + return ""; + return Doc; } std::string @@ -180,7 +193,10 @@ getParameterDocComment(const ASTContext &Ctx, const RawComment *RC = getParameterComment(Ctx, Result, ArgIndex); if (!RC) return ""; - return RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics()); + std::string Doc = RC->getFormattedText(Ctx.getSourceManager(), Ctx.getDiagnostics()); + if (!LooksLikeDocComment(Doc)) + return ""; + return Doc; } void getLabelAndInsertText(const CodeCompletionString &CCS, std::string *Label, diff --git a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp index 534b554fcfa..5f22fe9385a 100644 --- a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp +++ b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp @@ -1100,6 +1100,65 @@ TEST(CompletionTest, DocumentationFromChangedFileCrash) { Contains(AllOf(Not(IsDocumented()), Named("func")))); } +TEST(CompletionTest, NonDocComments) { + MockFSProvider FS; + auto FooCpp = testPath("foo.cpp"); + FS.Files[FooCpp] = ""; + + MockCompilationDatabase CDB; + IgnoreDiagnostics DiagConsumer; + ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest()); + + Annotations Source(R"cpp( + // ------------------ + int comments_foo(); + + // A comment and a decl are separated by newlines. + // Therefore, the comment shouldn't show up as doc comment. + + int comments_bar(); + + // this comment should be in the results. + int comments_baz(); + + + template <class T> + struct Struct { + int comments_qux(); + int comments_quux(); + }; + + + // This comment should not be there. + + template <class T> + int Struct<T>::comments_qux() { + } + + // This comment **should** be in results. + template <class T> + int Struct<T>::comments_quux() { + int a = comments^; + } + )cpp"); + Server.addDocument(FooCpp, Source.code(), WantDiagnostics::Yes); + CompletionList Completions = cantFail(runCodeComplete( + Server, FooCpp, Source.point(), clangd::CodeCompleteOptions())); + + // We should not get any of those comments in completion. + EXPECT_THAT( + Completions.items, + UnorderedElementsAre(AllOf(Not(IsDocumented()), Named("comments_foo")), + AllOf(IsDocumented(), Named("comments_baz")), + AllOf(IsDocumented(), Named("comments_quux")), + // FIXME(ibiryukov): the following items should have + // empty documentation, since they are separated from + // a comment with an empty line. Unfortunately, I + // couldn't make Sema tests pass if we ignore those. + AllOf(IsDocumented(), Named("comments_bar")), + AllOf(IsDocumented(), Named("comments_qux")))); +} + TEST(CompletionTest, CompleteOnInvalidLine) { auto FooCpp = testPath("foo.cpp"); |