forked from OSchip/llvm-project
[clang-format] Don't remove empty lines before namespace endings
Summary: This implements an alternative to r327861, namely preserving empty lines before namespace endings. Reviewers: djasper Reviewed By: djasper Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D45373 llvm-svn: 330324
This commit is contained in:
parent
d96ddccdb4
commit
621030523b
|
@ -107,6 +107,7 @@ void updateEndComment(const FormatToken *RBraceTok, StringRef EndCommentText,
|
|||
<< llvm::toString(std::move(Err)) << "\n";
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
const FormatToken *
|
||||
getNamespaceToken(const AnnotatedLine *line,
|
||||
|
@ -131,7 +132,6 @@ getNamespaceToken(const AnnotatedLine *line,
|
|||
return nullptr;
|
||||
return NamespaceTok;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
NamespaceEndCommentsFixer::NamespaceEndCommentsFixer(const Environment &Env,
|
||||
const FormatStyle &Style)
|
||||
|
|
|
@ -21,6 +21,16 @@
|
|||
namespace clang {
|
||||
namespace format {
|
||||
|
||||
// Finds the namespace token corresponding to a closing namespace `}`, if that
|
||||
// is to be formatted.
|
||||
// If \p Line contains the closing `}` of a namespace, is affected and is not in
|
||||
// a preprocessor directive, the result will be the matching namespace token.
|
||||
// Otherwise returns null.
|
||||
// \p AnnotatedLines is the sequence of lines from which \p Line is a member of.
|
||||
const FormatToken *
|
||||
getNamespaceToken(const AnnotatedLine *Line,
|
||||
const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines);
|
||||
|
||||
class NamespaceEndCommentsFixer : public TokenAnalyzer {
|
||||
public:
|
||||
NamespaceEndCommentsFixer(const Environment &Env, const FormatStyle &Style);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "NamespaceEndCommentsFixer.h"
|
||||
#include "UnwrappedLineFormatter.h"
|
||||
#include "WhitespaceManager.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
|
@ -1050,8 +1051,7 @@ UnwrappedLineFormatter::format(const SmallVectorImpl<AnnotatedLine *> &Lines,
|
|||
if (ShouldFormat && TheLine.Type != LT_Invalid) {
|
||||
if (!DryRun) {
|
||||
bool LastLine = Line->First->is(tok::eof);
|
||||
formatFirstToken(TheLine, PreviousLine,
|
||||
Indent,
|
||||
formatFirstToken(TheLine, PreviousLine, Lines, Indent,
|
||||
LastLine ? LastStartColumn : NextStartColumn + Indent);
|
||||
}
|
||||
|
||||
|
@ -1095,7 +1095,7 @@ UnwrappedLineFormatter::format(const SmallVectorImpl<AnnotatedLine *> &Lines,
|
|||
TheLine.LeadingEmptyLinesAffected);
|
||||
// Format the first token.
|
||||
if (ReformatLeadingWhitespace)
|
||||
formatFirstToken(TheLine, PreviousLine,
|
||||
formatFirstToken(TheLine, PreviousLine, Lines,
|
||||
TheLine.First->OriginalColumn,
|
||||
TheLine.First->OriginalColumn);
|
||||
else
|
||||
|
@ -1117,10 +1117,10 @@ UnwrappedLineFormatter::format(const SmallVectorImpl<AnnotatedLine *> &Lines,
|
|||
return Penalty;
|
||||
}
|
||||
|
||||
void UnwrappedLineFormatter::formatFirstToken(const AnnotatedLine &Line,
|
||||
const AnnotatedLine *PreviousLine,
|
||||
unsigned Indent,
|
||||
unsigned NewlineIndent) {
|
||||
void UnwrappedLineFormatter::formatFirstToken(
|
||||
const AnnotatedLine &Line, const AnnotatedLine *PreviousLine,
|
||||
const SmallVectorImpl<AnnotatedLine *> &Lines, unsigned Indent,
|
||||
unsigned NewlineIndent) {
|
||||
FormatToken &RootToken = *Line.First;
|
||||
if (RootToken.is(tok::eof)) {
|
||||
unsigned Newlines = std::min(RootToken.NewlinesBefore, 1u);
|
||||
|
@ -1134,7 +1134,9 @@ void UnwrappedLineFormatter::formatFirstToken(const AnnotatedLine &Line,
|
|||
// Remove empty lines before "}" where applicable.
|
||||
if (RootToken.is(tok::r_brace) &&
|
||||
(!RootToken.Next ||
|
||||
(RootToken.Next->is(tok::semi) && !RootToken.Next->Next)))
|
||||
(RootToken.Next->is(tok::semi) && !RootToken.Next->Next)) &&
|
||||
// Do not remove empty lines before namespace closing "}".
|
||||
!getNamespaceToken(&Line, Lines))
|
||||
Newlines = std::min(Newlines, 1u);
|
||||
// Remove empty lines at the start of nested blocks (lambdas/arrow functions)
|
||||
if (PreviousLine == nullptr && Line.Level > 0)
|
||||
|
|
|
@ -49,8 +49,9 @@ private:
|
|||
/// \brief Add a new line and the required indent before the first Token
|
||||
/// of the \c UnwrappedLine if there was no structural parsing error.
|
||||
void formatFirstToken(const AnnotatedLine &Line,
|
||||
const AnnotatedLine *PreviousLine, unsigned Indent,
|
||||
unsigned NewlineIndent);
|
||||
const AnnotatedLine *PreviousLine,
|
||||
const SmallVectorImpl<AnnotatedLine *> &Lines,
|
||||
unsigned Indent, unsigned NewlineIndent);
|
||||
|
||||
/// \brief Returns the column limit for a line, taking into account whether we
|
||||
/// need an escaped newline due to a continued preprocessor directive.
|
||||
|
|
|
@ -278,11 +278,12 @@ TEST_F(FormatTest, RemovesEmptyLines) {
|
|||
"\n"
|
||||
"}"));
|
||||
|
||||
// FIXME: This is slightly inconsistent.
|
||||
// Don't remove empty lines before namespace endings.
|
||||
FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
|
||||
LLVMWithNoNamespaceFix.FixNamespaceComments = false;
|
||||
EXPECT_EQ("namespace {\n"
|
||||
"int i;\n"
|
||||
"\n"
|
||||
"}",
|
||||
format("namespace {\n"
|
||||
"int i;\n"
|
||||
|
@ -291,6 +292,27 @@ TEST_F(FormatTest, RemovesEmptyLines) {
|
|||
EXPECT_EQ("namespace {\n"
|
||||
"int i;\n"
|
||||
"}",
|
||||
format("namespace {\n"
|
||||
"int i;\n"
|
||||
"}", LLVMWithNoNamespaceFix));
|
||||
EXPECT_EQ("namespace {\n"
|
||||
"int i;\n"
|
||||
"\n"
|
||||
"};",
|
||||
format("namespace {\n"
|
||||
"int i;\n"
|
||||
"\n"
|
||||
"};", LLVMWithNoNamespaceFix));
|
||||
EXPECT_EQ("namespace {\n"
|
||||
"int i;\n"
|
||||
"};",
|
||||
format("namespace {\n"
|
||||
"int i;\n"
|
||||
"};", LLVMWithNoNamespaceFix));
|
||||
EXPECT_EQ("namespace {\n"
|
||||
"int i;\n"
|
||||
"\n"
|
||||
"}",
|
||||
format("namespace {\n"
|
||||
"int i;\n"
|
||||
"\n"
|
||||
|
|
Loading…
Reference in New Issue