summaryrefslogtreecommitdiff
path: root/clang-tools-extra
diff options
context:
space:
mode:
authorIlya Biryukov <ibiryukov@google.com>2018-06-15 08:31:17 +0000
committerIlya Biryukov <ibiryukov@google.com>2018-06-15 08:31:17 +0000
commitae6351a89bc0b0812af4678765532fb4c45f6238 (patch)
tree8bff1f5a6d54cf2daed16323668e1addf58b582b /clang-tools-extra
parent4c04298f9e8b012bc1ee890f897fff8961024c7b (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.cpp20
-rw-r--r--clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp59
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");