[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

llvm-svn: 334807
This commit is contained in:
Ilya Biryukov 2018-06-15 08:31:17 +00:00
parent 0531ec654a
commit 89fcf6b2b6
2 changed files with 77 additions and 2 deletions

View File

@ -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,

View File

@ -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");