[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:
parent
0531ec654a
commit
89fcf6b2b6
|
@ -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,
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
Loading…
Reference in New Issue