llvm-project/clang/unittests/AST/CommentTextTest.cpp
Ilya Biryukov 1ff7c32fc9 [AST] Added a helper to extract a user-friendly text of a comment.
Summary:
The helper is used in clangd for documentation shown in code completion
and storing the docs in the symbols. See D45999.

This patch reuses the code of the Doxygen comment lexer, disabling the
bits that do command and html tag parsing.
The new helper works on all comments, including non-doxygen comments.
However, it does not understand or transform any doxygen directives,
i.e. cannot extract brief text, etc.

Reviewers: sammccall, hokein, ioeric

Reviewed By: ioeric

Subscribers: mgorny, cfe-commits

Differential Revision: https://reviews.llvm.org/D46000

llvm-svn: 332458
2018-05-16 12:30:09 +00:00

123 lines
3.6 KiB
C++

//===- unittest/AST/CommentTextTest.cpp - Comment text extraction test ----===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Tests for user-friendly output formatting of comments, i.e.
// RawComment::getFormattedText().
//
//===----------------------------------------------------------------------===//
#include "clang/AST/RawCommentList.h"
#include "clang/Basic/CommentOptions.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/DiagnosticIDs.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/FileSystemOptions.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/VirtualFileSystem.h"
#include "llvm/Support/MemoryBuffer.h"
#include <gtest/gtest.h>
namespace clang {
class CommentTextTest : public ::testing::Test {
protected:
std::string formatComment(llvm::StringRef CommentText) {
SourceManagerForFile FileSourceMgr("comment-test.cpp", CommentText);
SourceManager& SourceMgr = FileSourceMgr.get();
auto CommentStartOffset = CommentText.find("/");
assert(CommentStartOffset != llvm::StringRef::npos);
FileID File = SourceMgr.getMainFileID();
SourceRange CommentRange(
SourceMgr.getLocForStartOfFile(File).getLocWithOffset(
CommentStartOffset),
SourceMgr.getLocForEndOfFile(File));
CommentOptions EmptyOpts;
// FIXME: technically, merged that we set here is incorrect, but that
// shouldn't matter.
RawComment Comment(SourceMgr, CommentRange, EmptyOpts, /*Merged=*/true);
DiagnosticsEngine Diags(new DiagnosticIDs, new DiagnosticOptions);
return Comment.getFormattedText(SourceMgr, Diags);
}
};
TEST_F(CommentTextTest, FormattedText) {
// clang-format off
auto ExpectedOutput =
R"(This function does this and that.
For example,
Runnning it in that case will give you
this result.
That's about it.)";
// Two-slash comments.
EXPECT_EQ(ExpectedOutput, formatComment(
R"cpp(
// This function does this and that.
// For example,
// Runnning it in that case will give you
// this result.
// That's about it.)cpp"));
// Three-slash comments.
EXPECT_EQ(ExpectedOutput, formatComment(
R"cpp(
/// This function does this and that.
/// For example,
/// Runnning it in that case will give you
/// this result.
/// That's about it.)cpp"));
// Block comments.
EXPECT_EQ(ExpectedOutput, formatComment(
R"cpp(
/* This function does this and that.
* For example,
* Runnning it in that case will give you
* this result.
* That's about it.*/)cpp"));
// Doxygen-style block comments.
EXPECT_EQ(ExpectedOutput, formatComment(
R"cpp(
/** This function does this and that.
* For example,
* Runnning it in that case will give you
* this result.
* That's about it.*/)cpp"));
// Weird indentation.
EXPECT_EQ(ExpectedOutput, formatComment(
R"cpp(
// This function does this and that.
// For example,
// Runnning it in that case will give you
// this result.
// That's about it.)cpp"));
// clang-format on
}
TEST_F(CommentTextTest, KeepsDoxygenControlSeqs) {
// clang-format off
auto ExpectedOutput =
R"(\brief This is the brief part of the comment.
\param a something about a.
@param b something about b.)";
EXPECT_EQ(ExpectedOutput, formatComment(
R"cpp(
/// \brief This is the brief part of the comment.
/// \param a something about a.
/// @param b something about b.)cpp"));
// clang-format on
}
} // namespace clang