forked from OSchip/llvm-project
parent
33ec43d653
commit
89628f6414
|
@ -41,8 +41,8 @@ static bool IsBlank(char C) {
|
|||
}
|
||||
|
||||
static StringRef getLineCommentIndentPrefix(StringRef Comment) {
|
||||
static const char *const KnownPrefixes[] = {
|
||||
"///<", "//!<", "///", "//", "//!"};
|
||||
static const char *const KnownPrefixes[] = {"///<", "//!<", "///", "//",
|
||||
"//!"};
|
||||
StringRef LongestPrefix;
|
||||
for (StringRef KnownPrefix : KnownPrefixes) {
|
||||
if (Comment.startswith(KnownPrefix)) {
|
||||
|
@ -225,8 +225,7 @@ void BreakableStringLiteral::insertBreak(unsigned LineIndex,
|
|||
}
|
||||
|
||||
BreakableComment::BreakableComment(const FormatToken &Token,
|
||||
unsigned StartColumn,
|
||||
bool InPPDirective,
|
||||
unsigned StartColumn, bool InPPDirective,
|
||||
encoding::Encoding Encoding,
|
||||
const FormatStyle &Style)
|
||||
: BreakableToken(Token, InPPDirective, Encoding, Style),
|
||||
|
@ -309,7 +308,7 @@ static bool mayReflowContent(StringRef Content) {
|
|||
// Lines starting with '@' commonly have special meaning.
|
||||
// Lines starting with '-', '-#', '+' or '*' are bulleted/numbered lists.
|
||||
static const SmallVector<StringRef, 8> kSpecialMeaningPrefixes = {
|
||||
"@", "TODO", "FIXME", "XXX", "-# ", "- ", "+ ", "* " };
|
||||
"@", "TODO", "FIXME", "XXX", "-# ", "- ", "+ ", "* "};
|
||||
bool hasSpecialMeaningPrefix = false;
|
||||
for (StringRef Prefix : kSpecialMeaningPrefixes) {
|
||||
if (Content.startswith(Prefix)) {
|
||||
|
@ -322,8 +321,8 @@ static bool mayReflowContent(StringRef Content) {
|
|||
// To avoid issues if a line starts with a number which is actually the end
|
||||
// of a previous line, we only consider numbers with up to 2 digits.
|
||||
static llvm::Regex kNumberedListRegexp = llvm::Regex("^[1-9][0-9]?\\. ");
|
||||
hasSpecialMeaningPrefix = hasSpecialMeaningPrefix ||
|
||||
kNumberedListRegexp.match(Content);
|
||||
hasSpecialMeaningPrefix =
|
||||
hasSpecialMeaningPrefix || kNumberedListRegexp.match(Content);
|
||||
|
||||
// Simple heuristic for what to reflow: content should contain at least two
|
||||
// characters and either the first or second character must be
|
||||
|
@ -385,8 +384,7 @@ BreakableBlockComment::BreakableBlockComment(
|
|||
// If the last line is empty, the closing "*/" will have a star.
|
||||
if (i + 1 == e && Content[i].empty())
|
||||
break;
|
||||
if (!Content[i].empty() && i + 1 != e &&
|
||||
Decoration.startswith(Content[i]))
|
||||
if (!Content[i].empty() && i + 1 != e && Decoration.startswith(Content[i]))
|
||||
continue;
|
||||
while (!Content[i].startswith(Decoration))
|
||||
Decoration = Decoration.substr(0, Decoration.size() - 1);
|
||||
|
@ -428,8 +426,7 @@ BreakableBlockComment::BreakableBlockComment(
|
|||
IndentAtLineBreak =
|
||||
std::min<int>(IndentAtLineBreak, std::max(0, ContentColumn[i]));
|
||||
}
|
||||
IndentAtLineBreak =
|
||||
std::max<unsigned>(IndentAtLineBreak, Decoration.size());
|
||||
IndentAtLineBreak = std::max<unsigned>(IndentAtLineBreak, Decoration.size());
|
||||
|
||||
// Detect a multiline jsdoc comment and set DelimitersOnNewline in that case.
|
||||
if (Style.Language == FormatStyle::LK_JavaScript ||
|
||||
|
@ -441,8 +438,11 @@ BreakableBlockComment::BreakableBlockComment(
|
|||
// Detect a long single-line comment, like:
|
||||
// /** long long long */
|
||||
// Below, '2' is the width of '*/'.
|
||||
unsigned EndColumn = ContentColumn[0] + encoding::columnWidthWithTabs(
|
||||
Lines[0], ContentColumn[0], Style.TabWidth, Encoding) + 2;
|
||||
unsigned EndColumn =
|
||||
ContentColumn[0] +
|
||||
encoding::columnWidthWithTabs(Lines[0], ContentColumn[0],
|
||||
Style.TabWidth, Encoding) +
|
||||
2;
|
||||
DelimitersOnNewline = EndColumn > Style.ColumnLimit;
|
||||
}
|
||||
}
|
||||
|
@ -559,27 +559,24 @@ BreakableToken::Split BreakableBlockComment::getSplitBefore(
|
|||
return Result;
|
||||
}
|
||||
|
||||
unsigned BreakableBlockComment::getReflownColumn(
|
||||
StringRef Content,
|
||||
unsigned LineIndex,
|
||||
unsigned PreviousEndColumn) const {
|
||||
unsigned StartColumn = PreviousEndColumn + ReflowPrefix.size();
|
||||
// If this is the last line, it will carry around its '*/' postfix.
|
||||
unsigned PostfixLength = (LineIndex + 1 == Lines.size() ? 2 : 0);
|
||||
// The line is composed of previous text, reflow prefix, reflown text and
|
||||
// postfix.
|
||||
unsigned ReflownColumn =
|
||||
StartColumn + encoding::columnWidthWithTabs(Content, StartColumn,
|
||||
Style.TabWidth, Encoding) +
|
||||
PostfixLength;
|
||||
return ReflownColumn;
|
||||
unsigned
|
||||
BreakableBlockComment::getReflownColumn(StringRef Content, unsigned LineIndex,
|
||||
unsigned PreviousEndColumn) const {
|
||||
unsigned StartColumn = PreviousEndColumn + ReflowPrefix.size();
|
||||
// If this is the last line, it will carry around its '*/' postfix.
|
||||
unsigned PostfixLength = (LineIndex + 1 == Lines.size() ? 2 : 0);
|
||||
// The line is composed of previous text, reflow prefix, reflown text and
|
||||
// postfix.
|
||||
unsigned ReflownColumn = StartColumn +
|
||||
encoding::columnWidthWithTabs(
|
||||
Content, StartColumn, Style.TabWidth, Encoding) +
|
||||
PostfixLength;
|
||||
return ReflownColumn;
|
||||
}
|
||||
|
||||
unsigned BreakableBlockComment::getLineLengthAfterSplitBefore(
|
||||
unsigned LineIndex, unsigned TailOffset,
|
||||
unsigned PreviousEndColumn,
|
||||
unsigned ColumnLimit,
|
||||
Split SplitBefore) const {
|
||||
unsigned LineIndex, unsigned TailOffset, unsigned PreviousEndColumn,
|
||||
unsigned ColumnLimit, Split SplitBefore) const {
|
||||
if (SplitBefore.first == StringRef::npos ||
|
||||
// Block comment line contents contain the trailing whitespace after the
|
||||
// decoration, so the need of left trim. Note that this behavior is
|
||||
|
@ -607,13 +604,13 @@ void BreakableBlockComment::replaceWhitespaceBefore(
|
|||
Split SplitBefore, WhitespaceManager &Whitespaces) {
|
||||
if (LineIndex == 0) {
|
||||
if (DelimitersOnNewline) {
|
||||
// Since we're breaking af index 1 below, the break position and the
|
||||
// break length are the same.
|
||||
size_t BreakLength = Lines[0].substr(1).find_first_not_of(Blanks);
|
||||
if (BreakLength != StringRef::npos) {
|
||||
insertBreak(LineIndex, 0, Split(1, BreakLength), Whitespaces);
|
||||
DelimitersOnNewline = true;
|
||||
}
|
||||
// Since we're breaking af index 1 below, the break position and the
|
||||
// break length are the same.
|
||||
size_t BreakLength = Lines[0].substr(1).find_first_not_of(Blanks);
|
||||
if (BreakLength != StringRef::npos) {
|
||||
insertBreak(LineIndex, 0, Split(1, BreakLength), Whitespaces);
|
||||
DelimitersOnNewline = true;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -625,11 +622,11 @@ void BreakableBlockComment::replaceWhitespaceBefore(
|
|||
// This is the offset of the end of the last line relative to the start of
|
||||
// the token text in the token.
|
||||
unsigned WhitespaceOffsetInToken = Content[LineIndex - 1].data() +
|
||||
Content[LineIndex - 1].size() -
|
||||
tokenAt(LineIndex).TokenText.data();
|
||||
Content[LineIndex - 1].size() -
|
||||
tokenAt(LineIndex).TokenText.data();
|
||||
unsigned WhitespaceLength = TrimmedContent.data() -
|
||||
tokenAt(LineIndex).TokenText.data() -
|
||||
WhitespaceOffsetInToken;
|
||||
tokenAt(LineIndex).TokenText.data() -
|
||||
WhitespaceOffsetInToken;
|
||||
Whitespaces.replaceWhitespaceInToken(
|
||||
tokenAt(LineIndex), WhitespaceOffsetInToken,
|
||||
/*ReplaceChars=*/WhitespaceLength, /*PreviousPostfix=*/"",
|
||||
|
@ -762,17 +759,12 @@ BreakableLineCommentSection::BreakableLineCommentSection(
|
|||
Tokens[i] = LineTok;
|
||||
Content[i] = Lines[i].substr(IndentPrefix.size());
|
||||
OriginalContentColumn[i] =
|
||||
StartColumn +
|
||||
encoding::columnWidthWithTabs(OriginalPrefix[i],
|
||||
StartColumn,
|
||||
Style.TabWidth,
|
||||
Encoding);
|
||||
StartColumn + encoding::columnWidthWithTabs(OriginalPrefix[i],
|
||||
StartColumn,
|
||||
Style.TabWidth, Encoding);
|
||||
ContentColumn[i] =
|
||||
StartColumn +
|
||||
encoding::columnWidthWithTabs(Prefix[i],
|
||||
StartColumn,
|
||||
Style.TabWidth,
|
||||
Encoding);
|
||||
StartColumn + encoding::columnWidthWithTabs(Prefix[i], StartColumn,
|
||||
Style.TabWidth, Encoding);
|
||||
|
||||
// Calculate the end of the non-whitespace text in this line.
|
||||
size_t EndOfLine = Content[i].find_last_not_of(Blanks);
|
||||
|
@ -845,10 +837,8 @@ BreakableComment::Split BreakableLineCommentSection::getSplitBefore(
|
|||
}
|
||||
|
||||
unsigned BreakableLineCommentSection::getLineLengthAfterSplitBefore(
|
||||
unsigned LineIndex, unsigned TailOffset,
|
||||
unsigned PreviousEndColumn,
|
||||
unsigned ColumnLimit,
|
||||
Split SplitBefore) const {
|
||||
unsigned LineIndex, unsigned TailOffset, unsigned PreviousEndColumn,
|
||||
unsigned ColumnLimit, Split SplitBefore) const {
|
||||
if (SplitBefore.first == StringRef::npos ||
|
||||
SplitBefore.first + SplitBefore.second < Content[LineIndex].size()) {
|
||||
// A piece of line, not the whole line, gets reflown.
|
||||
|
@ -856,10 +846,9 @@ unsigned BreakableLineCommentSection::getLineLengthAfterSplitBefore(
|
|||
} else {
|
||||
// The whole line gets reflown.
|
||||
unsigned StartColumn = PreviousEndColumn + ReflowPrefix.size();
|
||||
return StartColumn + encoding::columnWidthWithTabs(Content[LineIndex],
|
||||
StartColumn,
|
||||
Style.TabWidth,
|
||||
Encoding);
|
||||
return StartColumn +
|
||||
encoding::columnWidthWithTabs(Content[LineIndex], StartColumn,
|
||||
Style.TabWidth, Encoding);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -932,7 +921,7 @@ void BreakableLineCommentSection::replaceWhitespaceBefore(
|
|||
}
|
||||
}
|
||||
|
||||
void BreakableLineCommentSection::updateNextToken(LineState& State) const {
|
||||
void BreakableLineCommentSection::updateNextToken(LineState &State) const {
|
||||
if (LastLineTok) {
|
||||
State.NextToken = LastLineTok->Next;
|
||||
}
|
||||
|
|
|
@ -12,8 +12,8 @@
|
|||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "BreakableToken.h"
|
||||
#include "ContinuationIndenter.h"
|
||||
#include "BreakableToken.h"
|
||||
#include "WhitespaceManager.h"
|
||||
#include "clang/Basic/OperatorPrecedence.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
|
@ -127,9 +127,8 @@ bool ContinuationIndenter::canBreak(const LineState &State) {
|
|||
const FormatToken &Current = *State.NextToken;
|
||||
const FormatToken &Previous = *Current.Previous;
|
||||
assert(&Previous == Current.Previous);
|
||||
if (!Current.CanBreakBefore &&
|
||||
!(State.Stack.back().BreakBeforeClosingBrace &&
|
||||
Current.closesBlockOrBlockTypeList(Style)))
|
||||
if (!Current.CanBreakBefore && !(State.Stack.back().BreakBeforeClosingBrace &&
|
||||
Current.closesBlockOrBlockTypeList(Style)))
|
||||
return false;
|
||||
// The opening "{" of a braced list has to be on the same line as the first
|
||||
// element if it is nested in another braced init list or function call.
|
||||
|
@ -428,9 +427,8 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
|
|||
if (Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak &&
|
||||
Previous.isOneOf(tok::l_paren, TT_TemplateOpener, tok::l_square) &&
|
||||
State.Column > getNewLineColumn(State) &&
|
||||
(!Previous.Previous ||
|
||||
!Previous.Previous->isOneOf(tok::kw_for, tok::kw_while,
|
||||
tok::kw_switch)) &&
|
||||
(!Previous.Previous || !Previous.Previous->isOneOf(
|
||||
tok::kw_for, tok::kw_while, tok::kw_switch)) &&
|
||||
// Don't do this for simple (no expressions) one-argument function calls
|
||||
// as that feels like needlessly wasting whitespace, e.g.:
|
||||
//
|
||||
|
@ -895,8 +893,10 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
|
|||
// Next(...)
|
||||
// ^ line up here.
|
||||
State.Stack.back().Indent =
|
||||
State.Column + (Style.BreakConstructorInitializers ==
|
||||
FormatStyle::BCIS_BeforeComma ? 0 : 2);
|
||||
State.Column +
|
||||
(Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma
|
||||
? 0
|
||||
: 2);
|
||||
State.Stack.back().NestedBlockIndent = State.Stack.back().Indent;
|
||||
if (Style.ConstructorInitializerAllOnOneLineOrOnePerLine)
|
||||
State.Stack.back().AvoidBinPacking = true;
|
||||
|
@ -908,7 +908,7 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
|
|||
State.FirstIndent + Style.ConstructorInitializerIndentWidth;
|
||||
State.Stack.back().NestedBlockIndent = State.Stack.back().Indent;
|
||||
if (Style.ConstructorInitializerAllOnOneLineOrOnePerLine)
|
||||
State.Stack.back().AvoidBinPacking = true;
|
||||
State.Stack.back().AvoidBinPacking = true;
|
||||
}
|
||||
if (Current.is(TT_InheritanceColon))
|
||||
State.Stack.back().Indent =
|
||||
|
@ -936,8 +936,9 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
|
|||
State.Stack[i].NoLineBreak = true;
|
||||
State.Stack[State.Stack.size() - 2].NestedBlockInlined = false;
|
||||
}
|
||||
if (Previous && (Previous->isOneOf(tok::l_paren, tok::comma, tok::colon) ||
|
||||
Previous->isOneOf(TT_BinaryOperator, TT_ConditionalExpr)) &&
|
||||
if (Previous &&
|
||||
(Previous->isOneOf(tok::l_paren, tok::comma, tok::colon) ||
|
||||
Previous->isOneOf(TT_BinaryOperator, TT_ConditionalExpr)) &&
|
||||
!Previous->isOneOf(TT_DictLiteral, TT_ObjCMethodExpr)) {
|
||||
State.Stack.back().NestedBlockInlined =
|
||||
!Newline &&
|
||||
|
@ -1091,14 +1092,13 @@ void ContinuationIndenter::moveStatePastScopeOpener(LineState &State,
|
|||
bool EndsInComma = Current.MatchingParen &&
|
||||
Current.MatchingParen->Previous &&
|
||||
Current.MatchingParen->Previous->is(tok::comma);
|
||||
AvoidBinPacking =
|
||||
EndsInComma || Current.is(TT_DictLiteral) ||
|
||||
Style.Language == FormatStyle::LK_Proto ||
|
||||
Style.Language == FormatStyle::LK_TextProto ||
|
||||
!Style.BinPackArguments ||
|
||||
(NextNoComment &&
|
||||
NextNoComment->isOneOf(TT_DesignatedInitializerPeriod,
|
||||
TT_DesignatedInitializerLSquare));
|
||||
AvoidBinPacking = EndsInComma || Current.is(TT_DictLiteral) ||
|
||||
Style.Language == FormatStyle::LK_Proto ||
|
||||
Style.Language == FormatStyle::LK_TextProto ||
|
||||
!Style.BinPackArguments ||
|
||||
(NextNoComment &&
|
||||
NextNoComment->isOneOf(TT_DesignatedInitializerPeriod,
|
||||
TT_DesignatedInitializerLSquare));
|
||||
BreakBeforeParameter = EndsInComma;
|
||||
if (Current.ParameterCount > 1)
|
||||
NestedBlockIndent = std::max(NestedBlockIndent, State.Column + 1);
|
||||
|
|
|
@ -125,8 +125,10 @@ template <> struct ScalarEnumerationTraits<FormatStyle::BraceBreakingStyle> {
|
|||
}
|
||||
};
|
||||
|
||||
template <> struct ScalarEnumerationTraits<FormatStyle::BreakConstructorInitializersStyle> {
|
||||
static void enumeration(IO &IO, FormatStyle::BreakConstructorInitializersStyle &Value) {
|
||||
template <>
|
||||
struct ScalarEnumerationTraits<FormatStyle::BreakConstructorInitializersStyle> {
|
||||
static void
|
||||
enumeration(IO &IO, FormatStyle::BreakConstructorInitializersStyle &Value) {
|
||||
IO.enumCase(Value, "BeforeColon", FormatStyle::BCIS_BeforeColon);
|
||||
IO.enumCase(Value, "BeforeComma", FormatStyle::BCIS_BeforeComma);
|
||||
IO.enumCase(Value, "AfterColon", FormatStyle::BCIS_AfterColon);
|
||||
|
@ -189,8 +191,10 @@ template <> struct ScalarEnumerationTraits<FormatStyle::BracketAlignmentStyle> {
|
|||
}
|
||||
};
|
||||
|
||||
template <> struct ScalarEnumerationTraits<FormatStyle::EscapedNewlineAlignmentStyle> {
|
||||
static void enumeration(IO &IO, FormatStyle::EscapedNewlineAlignmentStyle &Value) {
|
||||
template <>
|
||||
struct ScalarEnumerationTraits<FormatStyle::EscapedNewlineAlignmentStyle> {
|
||||
static void enumeration(IO &IO,
|
||||
FormatStyle::EscapedNewlineAlignmentStyle &Value) {
|
||||
IO.enumCase(Value, "DontAlign", FormatStyle::ENAS_DontAlign);
|
||||
IO.enumCase(Value, "Left", FormatStyle::ENAS_Left);
|
||||
IO.enumCase(Value, "Right", FormatStyle::ENAS_Right);
|
||||
|
@ -374,8 +378,7 @@ template <> struct MappingTraits<FormatStyle> {
|
|||
IO.mapOptional("ObjCSpaceAfterProperty", Style.ObjCSpaceAfterProperty);
|
||||
IO.mapOptional("ObjCSpaceBeforeProtocolList",
|
||||
Style.ObjCSpaceBeforeProtocolList);
|
||||
IO.mapOptional("PenaltyBreakAssignment",
|
||||
Style.PenaltyBreakAssignment);
|
||||
IO.mapOptional("PenaltyBreakAssignment", Style.PenaltyBreakAssignment);
|
||||
IO.mapOptional("PenaltyBreakBeforeFirstCallParameter",
|
||||
Style.PenaltyBreakBeforeFirstCallParameter);
|
||||
IO.mapOptional("PenaltyBreakComment", Style.PenaltyBreakComment);
|
||||
|
@ -390,7 +393,8 @@ template <> struct MappingTraits<FormatStyle> {
|
|||
IO.mapOptional("SortIncludes", Style.SortIncludes);
|
||||
IO.mapOptional("SortUsingDeclarations", Style.SortUsingDeclarations);
|
||||
IO.mapOptional("SpaceAfterCStyleCast", Style.SpaceAfterCStyleCast);
|
||||
IO.mapOptional("SpaceAfterTemplateKeyword", Style.SpaceAfterTemplateKeyword);
|
||||
IO.mapOptional("SpaceAfterTemplateKeyword",
|
||||
Style.SpaceAfterTemplateKeyword);
|
||||
IO.mapOptional("SpaceBeforeAssignmentOperators",
|
||||
Style.SpaceBeforeAssignmentOperators);
|
||||
IO.mapOptional("SpaceBeforeParens", Style.SpaceBeforeParens);
|
||||
|
@ -501,9 +505,9 @@ static FormatStyle expandPresets(const FormatStyle &Style) {
|
|||
if (Style.BreakBeforeBraces == FormatStyle::BS_Custom)
|
||||
return Style;
|
||||
FormatStyle Expanded = Style;
|
||||
Expanded.BraceWrapping = {false, false, false, false, false, false,
|
||||
false, false, false, false, false, false,
|
||||
true, true, true};
|
||||
Expanded.BraceWrapping = {false, false, false, false, false,
|
||||
false, false, false, false, false,
|
||||
false, false, true, true, true};
|
||||
switch (Style.BreakBeforeBraces) {
|
||||
case FormatStyle::BS_Linux:
|
||||
Expanded.BraceWrapping.AfterClass = true;
|
||||
|
@ -538,9 +542,8 @@ static FormatStyle expandPresets(const FormatStyle &Style) {
|
|||
Expanded.BraceWrapping.BeforeElse = true;
|
||||
break;
|
||||
case FormatStyle::BS_GNU:
|
||||
Expanded.BraceWrapping = {true, true, true, true, true, true,
|
||||
true, true, true, true, true, true,
|
||||
true, true, true};
|
||||
Expanded.BraceWrapping = {true, true, true, true, true, true, true, true,
|
||||
true, true, true, true, true, true, true};
|
||||
break;
|
||||
case FormatStyle::BS_WebKit:
|
||||
Expanded.BraceWrapping.AfterFunction = true;
|
||||
|
@ -576,9 +579,9 @@ FormatStyle getLLVMStyle() {
|
|||
LLVMStyle.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
|
||||
LLVMStyle.BreakBeforeTernaryOperators = true;
|
||||
LLVMStyle.BreakBeforeBraces = FormatStyle::BS_Attach;
|
||||
LLVMStyle.BraceWrapping = {false, false, false, false, false, false,
|
||||
false, false, false, false, false, false,
|
||||
true, true, true};
|
||||
LLVMStyle.BraceWrapping = {false, false, false, false, false,
|
||||
false, false, false, false, false,
|
||||
false, false, true, true, true};
|
||||
LLVMStyle.BreakAfterJavaFieldAnnotations = false;
|
||||
LLVMStyle.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
|
||||
LLVMStyle.BreakBeforeInheritanceComma = false;
|
||||
|
@ -738,8 +741,7 @@ FormatStyle getMozillaStyle() {
|
|||
FormatStyle MozillaStyle = getLLVMStyle();
|
||||
MozillaStyle.AllowAllParametersOfDeclarationOnNextLine = false;
|
||||
MozillaStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
|
||||
MozillaStyle.AlwaysBreakAfterReturnType =
|
||||
FormatStyle::RTBS_TopLevel;
|
||||
MozillaStyle.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
|
||||
MozillaStyle.AlwaysBreakAfterDefinitionReturnType =
|
||||
FormatStyle::DRTBS_TopLevel;
|
||||
MozillaStyle.AlwaysBreakTemplateDeclarations = true;
|
||||
|
@ -1010,7 +1012,6 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
|
||||
static bool inputUsesCRLF(StringRef Text) {
|
||||
return Text.count('\r') * 2 > Text.count('\n');
|
||||
}
|
||||
|
@ -1552,9 +1553,7 @@ bool isMpegTS(StringRef Code) {
|
|||
return Code.size() > 188 && Code[0] == 0x47 && Code[188] == 0x47;
|
||||
}
|
||||
|
||||
bool isLikelyXml(StringRef Code) {
|
||||
return Code.ltrim().startswith("<");
|
||||
}
|
||||
bool isLikelyXml(StringRef Code) { return Code.ltrim().startswith("<"); }
|
||||
|
||||
tooling::Replacements sortIncludes(const FormatStyle &Style, StringRef Code,
|
||||
ArrayRef<tooling::Range> Ranges,
|
||||
|
|
|
@ -25,10 +25,9 @@ namespace format {
|
|||
const char *getTokenTypeName(TokenType Type) {
|
||||
static const char *const TokNames[] = {
|
||||
#define TYPE(X) #X,
|
||||
LIST_TOKEN_TYPES
|
||||
LIST_TOKEN_TYPES
|
||||
#undef TYPE
|
||||
nullptr
|
||||
};
|
||||
nullptr};
|
||||
|
||||
if (Type < NUM_TOKEN_TYPES)
|
||||
return TokNames[Type];
|
||||
|
|
|
@ -26,79 +26,79 @@
|
|||
namespace clang {
|
||||
namespace format {
|
||||
|
||||
#define LIST_TOKEN_TYPES \
|
||||
TYPE(ArrayInitializerLSquare) \
|
||||
TYPE(ArraySubscriptLSquare) \
|
||||
TYPE(AttributeParen) \
|
||||
TYPE(BinaryOperator) \
|
||||
TYPE(BitFieldColon) \
|
||||
TYPE(BlockComment) \
|
||||
TYPE(CastRParen) \
|
||||
TYPE(ConditionalExpr) \
|
||||
TYPE(ConflictAlternative) \
|
||||
TYPE(ConflictEnd) \
|
||||
TYPE(ConflictStart) \
|
||||
TYPE(CtorInitializerColon) \
|
||||
TYPE(CtorInitializerComma) \
|
||||
TYPE(DesignatedInitializerLSquare) \
|
||||
TYPE(DesignatedInitializerPeriod) \
|
||||
TYPE(DictLiteral) \
|
||||
TYPE(ForEachMacro) \
|
||||
TYPE(FunctionAnnotationRParen) \
|
||||
TYPE(FunctionDeclarationName) \
|
||||
TYPE(FunctionLBrace) \
|
||||
TYPE(FunctionTypeLParen) \
|
||||
TYPE(ImplicitStringLiteral) \
|
||||
TYPE(InheritanceColon) \
|
||||
TYPE(InheritanceComma) \
|
||||
TYPE(InlineASMBrace) \
|
||||
TYPE(InlineASMColon) \
|
||||
TYPE(JavaAnnotation) \
|
||||
TYPE(JsComputedPropertyName) \
|
||||
TYPE(JsExponentiation) \
|
||||
TYPE(JsExponentiationEqual) \
|
||||
TYPE(JsFatArrow) \
|
||||
TYPE(JsNonNullAssertion) \
|
||||
TYPE(JsTypeColon) \
|
||||
TYPE(JsTypeOperator) \
|
||||
TYPE(JsTypeOptionalQuestion) \
|
||||
TYPE(LambdaArrow) \
|
||||
TYPE(LambdaLSquare) \
|
||||
TYPE(LeadingJavaAnnotation) \
|
||||
TYPE(LineComment) \
|
||||
TYPE(MacroBlockBegin) \
|
||||
TYPE(MacroBlockEnd) \
|
||||
TYPE(ObjCBlockLBrace) \
|
||||
TYPE(ObjCBlockLParen) \
|
||||
TYPE(ObjCDecl) \
|
||||
TYPE(ObjCForIn) \
|
||||
TYPE(ObjCMethodExpr) \
|
||||
TYPE(ObjCMethodSpecifier) \
|
||||
TYPE(ObjCProperty) \
|
||||
TYPE(ObjCStringLiteral) \
|
||||
TYPE(OverloadedOperator) \
|
||||
TYPE(OverloadedOperatorLParen) \
|
||||
TYPE(PointerOrReference) \
|
||||
TYPE(PureVirtualSpecifier) \
|
||||
TYPE(RangeBasedForLoopColon) \
|
||||
TYPE(RegexLiteral) \
|
||||
TYPE(SelectorName) \
|
||||
TYPE(StartOfName) \
|
||||
TYPE(StructuredBindingLSquare) \
|
||||
TYPE(TemplateCloser) \
|
||||
TYPE(TemplateOpener) \
|
||||
TYPE(TemplateString) \
|
||||
TYPE(TrailingAnnotation) \
|
||||
TYPE(TrailingReturnArrow) \
|
||||
TYPE(TrailingUnaryOperator) \
|
||||
TYPE(UnaryOperator) \
|
||||
#define LIST_TOKEN_TYPES \
|
||||
TYPE(ArrayInitializerLSquare) \
|
||||
TYPE(ArraySubscriptLSquare) \
|
||||
TYPE(AttributeParen) \
|
||||
TYPE(BinaryOperator) \
|
||||
TYPE(BitFieldColon) \
|
||||
TYPE(BlockComment) \
|
||||
TYPE(CastRParen) \
|
||||
TYPE(ConditionalExpr) \
|
||||
TYPE(ConflictAlternative) \
|
||||
TYPE(ConflictEnd) \
|
||||
TYPE(ConflictStart) \
|
||||
TYPE(CtorInitializerColon) \
|
||||
TYPE(CtorInitializerComma) \
|
||||
TYPE(DesignatedInitializerLSquare) \
|
||||
TYPE(DesignatedInitializerPeriod) \
|
||||
TYPE(DictLiteral) \
|
||||
TYPE(ForEachMacro) \
|
||||
TYPE(FunctionAnnotationRParen) \
|
||||
TYPE(FunctionDeclarationName) \
|
||||
TYPE(FunctionLBrace) \
|
||||
TYPE(FunctionTypeLParen) \
|
||||
TYPE(ImplicitStringLiteral) \
|
||||
TYPE(InheritanceColon) \
|
||||
TYPE(InheritanceComma) \
|
||||
TYPE(InlineASMBrace) \
|
||||
TYPE(InlineASMColon) \
|
||||
TYPE(JavaAnnotation) \
|
||||
TYPE(JsComputedPropertyName) \
|
||||
TYPE(JsExponentiation) \
|
||||
TYPE(JsExponentiationEqual) \
|
||||
TYPE(JsFatArrow) \
|
||||
TYPE(JsNonNullAssertion) \
|
||||
TYPE(JsTypeColon) \
|
||||
TYPE(JsTypeOperator) \
|
||||
TYPE(JsTypeOptionalQuestion) \
|
||||
TYPE(LambdaArrow) \
|
||||
TYPE(LambdaLSquare) \
|
||||
TYPE(LeadingJavaAnnotation) \
|
||||
TYPE(LineComment) \
|
||||
TYPE(MacroBlockBegin) \
|
||||
TYPE(MacroBlockEnd) \
|
||||
TYPE(ObjCBlockLBrace) \
|
||||
TYPE(ObjCBlockLParen) \
|
||||
TYPE(ObjCDecl) \
|
||||
TYPE(ObjCForIn) \
|
||||
TYPE(ObjCMethodExpr) \
|
||||
TYPE(ObjCMethodSpecifier) \
|
||||
TYPE(ObjCProperty) \
|
||||
TYPE(ObjCStringLiteral) \
|
||||
TYPE(OverloadedOperator) \
|
||||
TYPE(OverloadedOperatorLParen) \
|
||||
TYPE(PointerOrReference) \
|
||||
TYPE(PureVirtualSpecifier) \
|
||||
TYPE(RangeBasedForLoopColon) \
|
||||
TYPE(RegexLiteral) \
|
||||
TYPE(SelectorName) \
|
||||
TYPE(StartOfName) \
|
||||
TYPE(StructuredBindingLSquare) \
|
||||
TYPE(TemplateCloser) \
|
||||
TYPE(TemplateOpener) \
|
||||
TYPE(TemplateString) \
|
||||
TYPE(TrailingAnnotation) \
|
||||
TYPE(TrailingReturnArrow) \
|
||||
TYPE(TrailingUnaryOperator) \
|
||||
TYPE(UnaryOperator) \
|
||||
TYPE(Unknown)
|
||||
|
||||
enum TokenType {
|
||||
#define TYPE(X) TT_##X,
|
||||
LIST_TOKEN_TYPES
|
||||
LIST_TOKEN_TYPES
|
||||
#undef TYPE
|
||||
NUM_TOKEN_TYPES
|
||||
NUM_TOKEN_TYPES
|
||||
};
|
||||
|
||||
/// \brief Determines the name of a token type.
|
||||
|
@ -341,10 +341,11 @@ struct FormatToken {
|
|||
bool isSimpleTypeSpecifier() const;
|
||||
|
||||
bool isObjCAccessSpecifier() const {
|
||||
return is(tok::at) && Next && (Next->isObjCAtKeyword(tok::objc_public) ||
|
||||
Next->isObjCAtKeyword(tok::objc_protected) ||
|
||||
Next->isObjCAtKeyword(tok::objc_package) ||
|
||||
Next->isObjCAtKeyword(tok::objc_private));
|
||||
return is(tok::at) && Next &&
|
||||
(Next->isObjCAtKeyword(tok::objc_public) ||
|
||||
Next->isObjCAtKeyword(tok::objc_protected) ||
|
||||
Next->isObjCAtKeyword(tok::objc_package) ||
|
||||
Next->isObjCAtKeyword(tok::objc_private));
|
||||
}
|
||||
|
||||
/// \brief Returns whether \p Tok is ([{ or a template opening <.
|
||||
|
@ -477,7 +478,7 @@ struct FormatToken {
|
|||
bool isCppStructuredBinding(const FormatStyle &Style) const {
|
||||
if (!Style.isCpp() || isNot(tok::l_square))
|
||||
return false;
|
||||
const FormatToken* T = this;
|
||||
const FormatToken *T = this;
|
||||
do {
|
||||
T = T->getPreviousNonComment();
|
||||
} while (T && T->isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
|
||||
|
@ -517,15 +518,13 @@ private:
|
|||
return is(K1) && Next && Next->startsSequenceInternal(Tokens...);
|
||||
}
|
||||
|
||||
template <typename A>
|
||||
bool startsSequenceInternal(A K1) const {
|
||||
template <typename A> bool startsSequenceInternal(A K1) const {
|
||||
if (is(tok::comment) && Next)
|
||||
return Next->startsSequenceInternal(K1);
|
||||
return is(K1);
|
||||
}
|
||||
|
||||
template <typename A, typename... Ts>
|
||||
bool endsSequenceInternal(A K1) const {
|
||||
template <typename A, typename... Ts> bool endsSequenceInternal(A K1) const {
|
||||
if (is(tok::comment) && Previous)
|
||||
return Previous->endsSequenceInternal(K1);
|
||||
return is(K1);
|
||||
|
|
|
@ -96,12 +96,10 @@ void FormatTokenLexer::tryMergePreviousTokens() {
|
|||
}
|
||||
|
||||
if (Style.Language == FormatStyle::LK_Java) {
|
||||
static const tok::TokenKind JavaRightLogicalShift[] = {tok::greater,
|
||||
tok::greater,
|
||||
tok::greater};
|
||||
static const tok::TokenKind JavaRightLogicalShiftAssign[] = {tok::greater,
|
||||
tok::greater,
|
||||
tok::greaterequal};
|
||||
static const tok::TokenKind JavaRightLogicalShift[] = {
|
||||
tok::greater, tok::greater, tok::greater};
|
||||
static const tok::TokenKind JavaRightLogicalShiftAssign[] = {
|
||||
tok::greater, tok::greater, tok::greaterequal};
|
||||
if (tryMergeTokens(JavaRightLogicalShift, TT_BinaryOperator))
|
||||
return;
|
||||
if (tryMergeTokens(JavaRightLogicalShiftAssign, TT_BinaryOperator))
|
||||
|
@ -162,9 +160,8 @@ bool FormatTokenLexer::tryMergeTokens(ArrayRef<tok::TokenKind> Kinds,
|
|||
return false;
|
||||
unsigned AddLength = 0;
|
||||
for (unsigned i = 1; i < Kinds.size(); ++i) {
|
||||
if (!First[i]->is(Kinds[i]) ||
|
||||
First[i]->WhitespaceRange.getBegin() !=
|
||||
First[i]->WhitespaceRange.getEnd())
|
||||
if (!First[i]->is(Kinds[i]) || First[i]->WhitespaceRange.getBegin() !=
|
||||
First[i]->WhitespaceRange.getEnd())
|
||||
return false;
|
||||
AddLength += First[i]->TokenText.size();
|
||||
}
|
||||
|
|
|
@ -277,7 +277,7 @@ private:
|
|||
// Parses module references in the given lines. Returns the module references,
|
||||
// and a pointer to the first "main code" line if that is adjacent to the
|
||||
// affected lines of module references, nullptr otherwise.
|
||||
std::pair<SmallVector<JsModuleReference, 16>, AnnotatedLine*>
|
||||
std::pair<SmallVector<JsModuleReference, 16>, AnnotatedLine *>
|
||||
parseModuleReferences(const AdditionalKeywords &Keywords,
|
||||
SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
|
||||
SmallVector<JsModuleReference, 16> References;
|
||||
|
|
|
@ -57,8 +57,9 @@ Environment::CreateVirtualEnvironment(StringRef Code, StringRef FileName,
|
|||
std::unique_ptr<SourceManager> VirtualSM(
|
||||
new SourceManager(*Diagnostics, *FileMgr));
|
||||
InMemoryFileSystem->addFile(
|
||||
FileName, 0, llvm::MemoryBuffer::getMemBuffer(
|
||||
Code, FileName, /*RequiresNullTerminator=*/false));
|
||||
FileName, 0,
|
||||
llvm::MemoryBuffer::getMemBuffer(Code, FileName,
|
||||
/*RequiresNullTerminator=*/false));
|
||||
FileID ID = VirtualSM->createFileID(FileMgr->getFile(FileName),
|
||||
SourceLocation(), clang::SrcMgr::C_User);
|
||||
assert(ID.isValid());
|
||||
|
|
|
@ -47,7 +47,7 @@ private:
|
|||
if (NonTemplateLess.count(CurrentToken->Previous))
|
||||
return false;
|
||||
|
||||
const FormatToken& Previous = *CurrentToken->Previous;
|
||||
const FormatToken &Previous = *CurrentToken->Previous;
|
||||
if (Previous.Previous) {
|
||||
if (Previous.Previous->Tok.isLiteral())
|
||||
return false;
|
||||
|
@ -152,11 +152,11 @@ private:
|
|||
// export type X = (...);
|
||||
Contexts.back().IsExpression = false;
|
||||
} else if (Left->Previous &&
|
||||
(Left->Previous->isOneOf(tok::kw_static_assert, tok::kw_decltype,
|
||||
tok::kw_if, tok::kw_while, tok::l_paren,
|
||||
tok::comma) ||
|
||||
Left->Previous->endsSequence(tok::kw_constexpr, tok::kw_if) ||
|
||||
Left->Previous->is(TT_BinaryOperator))) {
|
||||
(Left->Previous->isOneOf(tok::kw_static_assert, tok::kw_decltype,
|
||||
tok::kw_if, tok::kw_while, tok::l_paren,
|
||||
tok::comma) ||
|
||||
Left->Previous->endsSequence(tok::kw_constexpr, tok::kw_if) ||
|
||||
Left->Previous->is(TT_BinaryOperator))) {
|
||||
// static_assert, if and while usually contain expressions.
|
||||
Contexts.back().IsExpression = true;
|
||||
} else if (Style.Language == FormatStyle::LK_JavaScript && Left->Previous &&
|
||||
|
@ -325,8 +325,7 @@ private:
|
|||
// In C++, this can happen either in array of templates (foo<int>[10])
|
||||
// or when array is a nested template type (unique_ptr<type1<type2>[]>).
|
||||
bool CppArrayTemplates =
|
||||
Style.isCpp() && Parent &&
|
||||
Parent->is(TT_TemplateCloser) &&
|
||||
Style.isCpp() && Parent && Parent->is(TT_TemplateCloser) &&
|
||||
(Contexts.back().CanBeExpression || Contexts.back().IsExpression ||
|
||||
Contexts.back().InTemplateArgument);
|
||||
|
||||
|
@ -607,7 +606,8 @@ private:
|
|||
break;
|
||||
case tok::kw_if:
|
||||
case tok::kw_while:
|
||||
if (Tok->is(tok::kw_if) && CurrentToken && CurrentToken->is(tok::kw_constexpr))
|
||||
if (Tok->is(tok::kw_if) && CurrentToken &&
|
||||
CurrentToken->is(tok::kw_constexpr))
|
||||
next();
|
||||
if (CurrentToken && CurrentToken->is(tok::l_paren)) {
|
||||
next();
|
||||
|
@ -633,8 +633,7 @@ private:
|
|||
// marks the first l_paren as a OverloadedOperatorLParen. Here, we make
|
||||
// the first two parens OverloadedOperators and the second l_paren an
|
||||
// OverloadedOperatorLParen.
|
||||
if (Tok->Previous &&
|
||||
Tok->Previous->is(tok::r_paren) &&
|
||||
if (Tok->Previous && Tok->Previous->is(tok::r_paren) &&
|
||||
Tok->Previous->MatchingParen &&
|
||||
Tok->Previous->MatchingParen->is(TT_OverloadedOperatorLParen)) {
|
||||
Tok->Previous->Type = TT_OverloadedOperator;
|
||||
|
@ -657,7 +656,7 @@ private:
|
|||
break;
|
||||
case tok::l_brace:
|
||||
if (Style.Language == FormatStyle::LK_TextProto) {
|
||||
FormatToken *Previous =Tok->getPreviousNonComment();
|
||||
FormatToken *Previous = Tok->getPreviousNonComment();
|
||||
if (Previous && Previous->Type != TT_DictLiteral)
|
||||
Previous->Type = TT_SelectorName;
|
||||
}
|
||||
|
@ -754,8 +753,8 @@ private:
|
|||
|
||||
void parseIncludeDirective() {
|
||||
if (CurrentToken && CurrentToken->is(tok::less)) {
|
||||
next();
|
||||
while (CurrentToken) {
|
||||
next();
|
||||
while (CurrentToken) {
|
||||
// Mark tokens up to the trailing line comments as implicit string
|
||||
// literals.
|
||||
if (CurrentToken->isNot(tok::comment) &&
|
||||
|
@ -795,9 +794,9 @@ private:
|
|||
void parseHasInclude() {
|
||||
if (!CurrentToken || !CurrentToken->is(tok::l_paren))
|
||||
return;
|
||||
next(); // '('
|
||||
next(); // '('
|
||||
parseIncludeDirective();
|
||||
next(); // ')'
|
||||
next(); // ')'
|
||||
}
|
||||
|
||||
LineType parsePreprocessorDirective() {
|
||||
|
@ -856,7 +855,7 @@ private:
|
|||
if (Tok->is(tok::l_paren))
|
||||
parseParens();
|
||||
else if (Tok->isOneOf(Keywords.kw___has_include,
|
||||
Keywords.kw___has_include_next))
|
||||
Keywords.kw___has_include_next))
|
||||
parseHasInclude();
|
||||
}
|
||||
return Type;
|
||||
|
@ -947,10 +946,11 @@ private:
|
|||
// FIXME: Closure-library specific stuff should not be hard-coded but be
|
||||
// configurable.
|
||||
return Tok.TokenText == "goog" && Tok.Next && Tok.Next->is(tok::period) &&
|
||||
Tok.Next->Next && (Tok.Next->Next->TokenText == "module" ||
|
||||
Tok.Next->Next->TokenText == "provide" ||
|
||||
Tok.Next->Next->TokenText == "require" ||
|
||||
Tok.Next->Next->TokenText == "forwardDeclare") &&
|
||||
Tok.Next->Next &&
|
||||
(Tok.Next->Next->TokenText == "module" ||
|
||||
Tok.Next->Next->TokenText == "provide" ||
|
||||
Tok.Next->Next->TokenText == "require" ||
|
||||
Tok.Next->Next->TokenText == "forwardDeclare") &&
|
||||
Tok.Next->Next->Next && Tok.Next->Next->Next->is(tok::l_paren);
|
||||
}
|
||||
|
||||
|
@ -1067,8 +1067,7 @@ private:
|
|||
Current.Previous->is(TT_CtorInitializerColon)) {
|
||||
Contexts.back().IsExpression = true;
|
||||
Contexts.back().InCtorInitializer = true;
|
||||
} else if (Current.Previous &&
|
||||
Current.Previous->is(TT_InheritanceColon)) {
|
||||
} else if (Current.Previous && Current.Previous->is(TT_InheritanceColon)) {
|
||||
Contexts.back().InInheritanceList = true;
|
||||
} else if (Current.isOneOf(tok::r_paren, tok::greater, tok::comma)) {
|
||||
for (FormatToken *Previous = Current.Previous;
|
||||
|
@ -1131,10 +1130,10 @@ private:
|
|||
Current.NestingLevel == 0) {
|
||||
Current.Type = TT_TrailingReturnArrow;
|
||||
} else if (Current.isOneOf(tok::star, tok::amp, tok::ampamp)) {
|
||||
Current.Type =
|
||||
determineStarAmpUsage(Current, Contexts.back().CanBeExpression &&
|
||||
Contexts.back().IsExpression,
|
||||
Contexts.back().InTemplateArgument);
|
||||
Current.Type = determineStarAmpUsage(Current,
|
||||
Contexts.back().CanBeExpression &&
|
||||
Contexts.back().IsExpression,
|
||||
Contexts.back().InTemplateArgument);
|
||||
} else if (Current.isOneOf(tok::minus, tok::plus, tok::caret)) {
|
||||
Current.Type = determinePlusMinusCaretUsage(Current);
|
||||
if (Current.is(TT_UnaryOperator) && Current.is(tok::caret))
|
||||
|
@ -1742,7 +1741,7 @@ void TokenAnnotator::setCommentLineLevels(
|
|||
|
||||
static unsigned maxNestingDepth(const AnnotatedLine &Line) {
|
||||
unsigned Result = 0;
|
||||
for (const auto* Tok = Line.First; Tok != nullptr; Tok = Tok->Next)
|
||||
for (const auto *Tok = Line.First; Tok != nullptr; Tok = Tok->Next)
|
||||
Result = std::max(Result, Tok->NestingLevel);
|
||||
return Result;
|
||||
}
|
||||
|
@ -1784,7 +1783,7 @@ void TokenAnnotator::annotate(AnnotatedLine &Line) {
|
|||
// function declaration.
|
||||
static bool isFunctionDeclarationName(const FormatToken &Current,
|
||||
const AnnotatedLine &Line) {
|
||||
auto skipOperatorName = [](const FormatToken* Next) -> const FormatToken* {
|
||||
auto skipOperatorName = [](const FormatToken *Next) -> const FormatToken * {
|
||||
for (; Next; Next = Next->Next) {
|
||||
if (Next->is(TT_OverloadedOperatorLParen))
|
||||
return Next;
|
||||
|
@ -1792,8 +1791,8 @@ static bool isFunctionDeclarationName(const FormatToken &Current,
|
|||
continue;
|
||||
if (Next->isOneOf(tok::kw_new, tok::kw_delete)) {
|
||||
// For 'new[]' and 'delete[]'.
|
||||
if (Next->Next && Next->Next->is(tok::l_square) &&
|
||||
Next->Next->Next && Next->Next->Next->is(tok::r_square))
|
||||
if (Next->Next && Next->Next->is(tok::l_square) && Next->Next->Next &&
|
||||
Next->Next->Next->is(tok::r_square))
|
||||
Next = Next->Next->Next;
|
||||
continue;
|
||||
}
|
||||
|
@ -2072,7 +2071,8 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
|
|||
if (Left.is(tok::comment))
|
||||
return 1000;
|
||||
|
||||
if (Left.isOneOf(TT_RangeBasedForLoopColon, TT_InheritanceColon, TT_CtorInitializerColon))
|
||||
if (Left.isOneOf(TT_RangeBasedForLoopColon, TT_InheritanceColon,
|
||||
TT_CtorInitializerColon))
|
||||
return 2;
|
||||
|
||||
if (Right.isMemberAccess()) {
|
||||
|
@ -2130,8 +2130,8 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
|
|||
Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign)
|
||||
return 100;
|
||||
if (Left.is(tok::l_paren) && Left.Previous &&
|
||||
(Left.Previous->isOneOf(tok::kw_if, tok::kw_for)
|
||||
|| Left.Previous->endsSequence(tok::kw_constexpr, tok::kw_if)))
|
||||
(Left.Previous->isOneOf(tok::kw_if, tok::kw_for) ||
|
||||
Left.Previous->endsSequence(tok::kw_constexpr, tok::kw_if)))
|
||||
return 1000;
|
||||
if (Left.is(tok::equal) && InFunctionDecl)
|
||||
return 110;
|
||||
|
@ -2201,8 +2201,8 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
|
|||
: Style.SpacesInParentheses;
|
||||
if (Right.isOneOf(tok::semi, tok::comma))
|
||||
return false;
|
||||
if (Right.is(tok::less) &&
|
||||
Line.Type == LT_ObjCDecl && Style.ObjCSpaceBeforeProtocolList)
|
||||
if (Right.is(tok::less) && Line.Type == LT_ObjCDecl &&
|
||||
Style.ObjCSpaceBeforeProtocolList)
|
||||
return true;
|
||||
if (Right.is(tok::less) && Left.is(tok::kw_template))
|
||||
return Style.SpaceAfterTemplateKeyword;
|
||||
|
@ -2351,8 +2351,8 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
|
|||
if (Left.is(TT_JsFatArrow))
|
||||
return true;
|
||||
// for await ( ...
|
||||
if (Right.is(tok::l_paren) && Left.is(Keywords.kw_await) &&
|
||||
Left.Previous && Left.Previous->is(tok::kw_for))
|
||||
if (Right.is(tok::l_paren) && Left.is(Keywords.kw_await) && Left.Previous &&
|
||||
Left.Previous->is(tok::kw_for))
|
||||
return true;
|
||||
if (Left.is(Keywords.kw_async) && Right.is(tok::l_paren) &&
|
||||
Right.MatchingParen) {
|
||||
|
@ -2509,7 +2509,8 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
|
|||
return (Left.is(TT_TemplateOpener) &&
|
||||
Style.Standard == FormatStyle::LS_Cpp03) ||
|
||||
!(Left.isOneOf(tok::l_paren, tok::r_paren, tok::l_square,
|
||||
tok::kw___super, TT_TemplateCloser, TT_TemplateOpener));
|
||||
tok::kw___super, TT_TemplateCloser,
|
||||
TT_TemplateOpener));
|
||||
if ((Left.is(TT_TemplateOpener)) != (Right.is(TT_TemplateCloser)))
|
||||
return Style.SpacesInAngles;
|
||||
if ((Right.is(TT_BinaryOperator) && !Left.is(tok::l_paren)) ||
|
||||
|
@ -2634,19 +2635,16 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
|
|||
!Style.ConstructorInitializerAllOnOneLineOrOnePerLine)
|
||||
return true;
|
||||
// Break only if we have multiple inheritance.
|
||||
if (Style.BreakBeforeInheritanceComma &&
|
||||
Right.is(TT_InheritanceComma))
|
||||
return true;
|
||||
if (Style.BreakBeforeInheritanceComma && Right.is(TT_InheritanceComma))
|
||||
return true;
|
||||
if (Right.is(tok::string_literal) && Right.TokenText.startswith("R\""))
|
||||
// Raw string literals are special wrt. line breaks. The author has made a
|
||||
// deliberate choice and might have aligned the contents of the string
|
||||
// literal accordingly. Thus, we try keep existing line breaks.
|
||||
return Right.NewlinesBefore > 0;
|
||||
if ((Right.Previous->is(tok::l_brace) ||
|
||||
(Right.Previous->is(tok::less) &&
|
||||
Right.Previous->Previous &&
|
||||
Right.Previous->Previous->is(tok::equal))
|
||||
) &&
|
||||
(Right.Previous->is(tok::less) && Right.Previous->Previous &&
|
||||
Right.Previous->Previous->is(tok::equal))) &&
|
||||
Right.NestingLevel == 1 && Style.Language == FormatStyle::LK_Proto) {
|
||||
// Don't put enums or option definitions onto single lines in protocol
|
||||
// buffers.
|
||||
|
@ -2656,7 +2654,8 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
|
|||
return Right.HasUnescapedNewline;
|
||||
if (isAllmanBrace(Left) || isAllmanBrace(Right))
|
||||
return (Line.startsWith(tok::kw_enum) && Style.BraceWrapping.AfterEnum) ||
|
||||
(Line.startsWith(tok::kw_typedef, tok::kw_enum) && Style.BraceWrapping.AfterEnum) ||
|
||||
(Line.startsWith(tok::kw_typedef, tok::kw_enum) &&
|
||||
Style.BraceWrapping.AfterEnum) ||
|
||||
(Line.startsWith(tok::kw_class) && Style.BraceWrapping.AfterClass) ||
|
||||
(Line.startsWith(tok::kw_struct) && Style.BraceWrapping.AfterStruct);
|
||||
if (Left.is(TT_ObjCBlockLBrace) && !Style.AllowShortBlocksOnASingleLine)
|
||||
|
@ -2750,8 +2749,7 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
|
|||
// list.
|
||||
return Left.BlockKind == BK_BracedInit ||
|
||||
(Left.is(TT_CtorInitializerColon) &&
|
||||
Style.BreakConstructorInitializers ==
|
||||
FormatStyle::BCIS_AfterColon);
|
||||
Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon);
|
||||
if (Left.is(tok::question) && Right.is(tok::colon))
|
||||
return false;
|
||||
if (Right.is(TT_ConditionalExpr) || Right.is(tok::question))
|
||||
|
@ -2876,10 +2874,9 @@ void TokenAnnotator::printDebugInfo(const AnnotatedLine &Line) {
|
|||
<< " T=" << getTokenTypeName(Tok->Type)
|
||||
<< " S=" << Tok->SpacesRequiredBefore
|
||||
<< " B=" << Tok->BlockParameterCount
|
||||
<< " BK=" << Tok->BlockKind
|
||||
<< " P=" << Tok->SplitPenalty << " Name=" << Tok->Tok.getName()
|
||||
<< " L=" << Tok->TotalLength << " PPK=" << Tok->PackingKind
|
||||
<< " FakeLParens=";
|
||||
<< " BK=" << Tok->BlockKind << " P=" << Tok->SplitPenalty
|
||||
<< " Name=" << Tok->Tok.getName() << " L=" << Tok->TotalLength
|
||||
<< " PPK=" << Tok->PackingKind << " FakeLParens=";
|
||||
for (unsigned i = 0, e = Tok->FakeLParens.size(); i != e; ++i)
|
||||
llvm::errs() << Tok->FakeLParens[i] << "/";
|
||||
llvm::errs() << " FakeRParens=" << Tok->FakeRParens;
|
||||
|
|
|
@ -164,8 +164,7 @@ public:
|
|||
return nullptr;
|
||||
const AnnotatedLine *Current = *Next;
|
||||
IndentTracker.nextLine(*Current);
|
||||
unsigned MergedLines =
|
||||
tryFitMultipleLinesInOne(IndentTracker, Next, End);
|
||||
unsigned MergedLines = tryFitMultipleLinesInOne(IndentTracker, Next, End);
|
||||
if (MergedLines > 0 && Style.ColumnLimit == 0)
|
||||
// Disallow line merging if there is a break at the start of one of the
|
||||
// input lines.
|
||||
|
@ -228,7 +227,8 @@ private:
|
|||
|
||||
if (Tok && Tok->getNamespaceToken())
|
||||
return !Style.BraceWrapping.SplitEmptyNamespace && EmptyBlock
|
||||
? tryMergeSimpleBlock(I, E, Limit) : 0;
|
||||
? tryMergeSimpleBlock(I, E, Limit)
|
||||
: 0;
|
||||
|
||||
if (Tok && Tok->is(tok::kw_typedef))
|
||||
Tok = Tok->getNextNonComment();
|
||||
|
@ -311,8 +311,8 @@ private:
|
|||
// Try to merge a block with left brace wrapped that wasn't yet covered
|
||||
if (TheLine->Last->is(tok::l_brace)) {
|
||||
return !Style.BraceWrapping.AfterFunction ||
|
||||
(I[1]->First->is(tok::r_brace) &&
|
||||
!Style.BraceWrapping.SplitEmptyRecord)
|
||||
(I[1]->First->is(tok::r_brace) &&
|
||||
!Style.BraceWrapping.SplitEmptyRecord)
|
||||
? tryMergeSimpleBlock(I, E, Limit)
|
||||
: 0;
|
||||
}
|
||||
|
@ -849,7 +849,8 @@ private:
|
|||
|
||||
/// \brief The BFS queue type.
|
||||
typedef std::priority_queue<QueueItem, std::vector<QueueItem>,
|
||||
std::greater<QueueItem>> QueueType;
|
||||
std::greater<QueueItem>>
|
||||
QueueType;
|
||||
|
||||
/// \brief Analyze the entire solution space starting from \p InitialState.
|
||||
///
|
||||
|
@ -1085,7 +1086,7 @@ UnwrappedLineFormatter::format(const SmallVectorImpl<AnnotatedLine *> &Lines,
|
|||
void UnwrappedLineFormatter::formatFirstToken(const AnnotatedLine &Line,
|
||||
const AnnotatedLine *PreviousLine,
|
||||
unsigned Indent) {
|
||||
FormatToken& RootToken = *Line.First;
|
||||
FormatToken &RootToken = *Line.First;
|
||||
if (RootToken.is(tok::eof)) {
|
||||
unsigned Newlines = std::min(RootToken.NewlinesBefore, 1u);
|
||||
Whitespaces->replaceWhitespace(RootToken, Newlines, /*Spaces=*/0,
|
||||
|
|
|
@ -35,8 +35,7 @@ public:
|
|||
const SourceManager &SourceMgr,
|
||||
FormattingAttemptStatus *Status)
|
||||
: Indenter(Indenter), Whitespaces(Whitespaces), Style(Style),
|
||||
Keywords(Keywords), SourceMgr(SourceMgr),
|
||||
Status(Status) {}
|
||||
Keywords(Keywords), SourceMgr(SourceMgr), Status(Status) {}
|
||||
|
||||
/// \brief Format the current block and return the penalty.
|
||||
unsigned format(const SmallVectorImpl<AnnotatedLine *> &Lines,
|
||||
|
|
|
@ -56,8 +56,7 @@ private:
|
|||
};
|
||||
|
||||
static bool isLineComment(const FormatToken &FormatTok) {
|
||||
return FormatTok.is(tok::comment) &&
|
||||
FormatTok.TokenText.startswith("//");
|
||||
return FormatTok.is(tok::comment) && FormatTok.TokenText.startswith("//");
|
||||
}
|
||||
|
||||
// Checks if \p FormatTok is a line comment that continues the line comment
|
||||
|
@ -331,7 +330,8 @@ void UnwrappedLineParser::parseLevel(bool HasOpeningBrace) {
|
|||
break;
|
||||
case tok::kw_default:
|
||||
case tok::kw_case:
|
||||
if (Style.Language == FormatStyle::LK_JavaScript && Line->MustBeDeclaration) {
|
||||
if (Style.Language == FormatStyle::LK_JavaScript &&
|
||||
Line->MustBeDeclaration) {
|
||||
// A 'case: string' style field declaration.
|
||||
parseStructuralElement();
|
||||
break;
|
||||
|
@ -356,7 +356,7 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
|
|||
// definitions, too.
|
||||
unsigned StoredPosition = Tokens->getPosition();
|
||||
FormatToken *Tok = FormatTok;
|
||||
const FormatToken *PrevTok = Tok->Previous;
|
||||
const FormatToken *PrevTok = Tok->Previous;
|
||||
// Keep a stack of positions of lbrace tokens. We will
|
||||
// update information about whether an lbrace starts a
|
||||
// braced init list or a different block during the loop.
|
||||
|
@ -591,9 +591,8 @@ void UnwrappedLineParser::parseChildBlock() {
|
|||
FormatTok->BlockKind = BK_Block;
|
||||
nextToken();
|
||||
{
|
||||
bool SkipIndent =
|
||||
(Style.Language == FormatStyle::LK_JavaScript &&
|
||||
(isGoogScope(*Line) || isIIFE(*Line, Keywords)));
|
||||
bool SkipIndent = (Style.Language == FormatStyle::LK_JavaScript &&
|
||||
(isGoogScope(*Line) || isIIFE(*Line, Keywords)));
|
||||
ScopedLineState LineState(*this);
|
||||
ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack,
|
||||
/*MustBeDeclaration=*/false);
|
||||
|
@ -835,8 +834,8 @@ static bool mustBeJSIdent(const AdditionalKeywords &Keywords,
|
|||
Keywords.kw_function, Keywords.kw_import, Keywords.kw_is,
|
||||
Keywords.kw_let, Keywords.kw_var, tok::kw_const,
|
||||
Keywords.kw_abstract, Keywords.kw_extends, Keywords.kw_implements,
|
||||
Keywords.kw_instanceof, Keywords.kw_interface,
|
||||
Keywords.kw_throws, Keywords.kw_from));
|
||||
Keywords.kw_instanceof, Keywords.kw_interface, Keywords.kw_throws,
|
||||
Keywords.kw_from));
|
||||
}
|
||||
|
||||
static bool mustBeJSIdentOrValue(const AdditionalKeywords &Keywords,
|
||||
|
@ -1290,7 +1289,7 @@ void UnwrappedLineParser::parseStructuralElement() {
|
|||
nextToken();
|
||||
parseBracedList();
|
||||
} else if (Style.Language == FormatStyle::LK_Proto &&
|
||||
FormatTok->Tok.is(tok::less)) {
|
||||
FormatTok->Tok.is(tok::less)) {
|
||||
nextToken();
|
||||
parseBracedList(/*ContinueOnSemicolons=*/false,
|
||||
/*ClosingBraceKind=*/tok::greater);
|
||||
|
@ -1356,12 +1355,12 @@ bool UnwrappedLineParser::tryToParseLambda() {
|
|||
}
|
||||
|
||||
bool UnwrappedLineParser::tryToParseLambdaIntroducer() {
|
||||
const FormatToken* Previous = FormatTok->Previous;
|
||||
const FormatToken *Previous = FormatTok->Previous;
|
||||
if (Previous &&
|
||||
(Previous->isOneOf(tok::identifier, tok::kw_operator, tok::kw_new,
|
||||
tok::kw_delete) ||
|
||||
FormatTok->isCppStructuredBinding(Style) ||
|
||||
Previous->closesScope() || Previous->isSimpleTypeSpecifier())) {
|
||||
FormatTok->isCppStructuredBinding(Style) || Previous->closesScope() ||
|
||||
Previous->isSimpleTypeSpecifier())) {
|
||||
nextToken();
|
||||
return false;
|
||||
}
|
||||
|
@ -2200,8 +2199,8 @@ LLVM_ATTRIBUTE_UNUSED static void printDebugInfo(const UnwrappedLine &Line,
|
|||
E = Line.Tokens.end();
|
||||
I != E; ++I) {
|
||||
llvm::dbgs() << I->Tok->Tok.getName() << "["
|
||||
<< "T=" << I->Tok->Type
|
||||
<< ", OC=" << I->Tok->OriginalColumn << "] ";
|
||||
<< "T=" << I->Tok->Type << ", OC=" << I->Tok->OriginalColumn
|
||||
<< "] ";
|
||||
}
|
||||
for (std::list<UnwrappedLineNode>::const_iterator I = Line.Tokens.begin(),
|
||||
E = Line.Tokens.end();
|
||||
|
@ -2381,7 +2380,7 @@ void UnwrappedLineParser::nextToken(int LevelDifference) {
|
|||
return;
|
||||
flushComments(isOnNewLine(*FormatTok));
|
||||
pushToken(FormatTok);
|
||||
FormatToken* Previous = FormatTok;
|
||||
FormatToken *Previous = FormatTok;
|
||||
if (Style.Language != FormatStyle::LK_JavaScript)
|
||||
readToken(LevelDifference);
|
||||
else
|
||||
|
@ -2426,8 +2425,7 @@ void UnwrappedLineParser::distributeComments(
|
|||
}
|
||||
for (unsigned i = 0, e = Comments.size(); i < e; ++i) {
|
||||
FormatToken *FormatTok = Comments[i];
|
||||
if (HasTrailAlignedWithNextToken &&
|
||||
i == StartOfTrailAlignedWithNextToken) {
|
||||
if (HasTrailAlignedWithNextToken && i == StartOfTrailAlignedWithNextToken) {
|
||||
FormatTok->ContinuesLineCommentSection = false;
|
||||
} else {
|
||||
FormatTok->ContinuesLineCommentSection =
|
||||
|
|
|
@ -262,8 +262,9 @@ struct UnwrappedLineNode {
|
|||
SmallVector<UnwrappedLine, 0> Children;
|
||||
};
|
||||
|
||||
inline UnwrappedLine::UnwrappedLine() : Level(0), InPPDirective(false),
|
||||
MustBeDeclaration(false), MatchingOpeningBlockLineIndex(kInvalidIndex) {}
|
||||
inline UnwrappedLine::UnwrappedLine()
|
||||
: Level(0), InPPDirective(false), MustBeDeclaration(false),
|
||||
MatchingOpeningBlockLineIndex(kInvalidIndex) {}
|
||||
|
||||
} // end namespace format
|
||||
} // end namespace clang
|
||||
|
|
|
@ -166,15 +166,15 @@ void WhitespaceManager::calculateLineBreakInformation() {
|
|||
// BreakableLineCommentSection does comment reflow changes and here is
|
||||
// the aligning of trailing comments. Consider the case where we reflow
|
||||
// the second line up in this example:
|
||||
//
|
||||
//
|
||||
// // line 1
|
||||
// // line 2
|
||||
//
|
||||
//
|
||||
// That amounts to 2 changes by BreakableLineCommentSection:
|
||||
// - the first, delimited by (), for the whitespace between the tokens,
|
||||
// - and second, delimited by [], for the whitespace at the beginning
|
||||
// of the second token:
|
||||
//
|
||||
//
|
||||
// // line 1(
|
||||
// )[// ]line 2
|
||||
//
|
||||
|
@ -622,8 +622,7 @@ void WhitespaceManager::generateChanges() {
|
|||
}
|
||||
}
|
||||
|
||||
void WhitespaceManager::storeReplacement(SourceRange Range,
|
||||
StringRef Text) {
|
||||
void WhitespaceManager::storeReplacement(SourceRange Range, StringRef Text) {
|
||||
unsigned WhitespaceLength = SourceMgr.getFileOffset(Range.getEnd()) -
|
||||
SourceMgr.getFileOffset(Range.getBegin());
|
||||
// Don't create a replacement, if it does not change anything.
|
||||
|
@ -646,10 +645,9 @@ void WhitespaceManager::appendNewlineText(std::string &Text,
|
|||
Text.append(UseCRLF ? "\r\n" : "\n");
|
||||
}
|
||||
|
||||
void WhitespaceManager::appendEscapedNewlineText(std::string &Text,
|
||||
unsigned Newlines,
|
||||
unsigned PreviousEndOfTokenColumn,
|
||||
unsigned EscapedNewlineColumn) {
|
||||
void WhitespaceManager::appendEscapedNewlineText(
|
||||
std::string &Text, unsigned Newlines, unsigned PreviousEndOfTokenColumn,
|
||||
unsigned EscapedNewlineColumn) {
|
||||
if (Newlines > 0) {
|
||||
unsigned Spaces =
|
||||
std::max<int>(1, EscapedNewlineColumn - PreviousEndOfTokenColumn - 1);
|
||||
|
|
Loading…
Reference in New Issue