forked from OSchip/llvm-project
clang-format: NFC. Add a function to test whether an annotated line
starts with a given sequence of tokens. Only the one-token version is used yet, but other usages are coming up momentarily. llvm-svn: 239892
This commit is contained in:
parent
afa4ea7121
commit
e285b8dd2e
|
@ -87,7 +87,7 @@ private:
|
|||
if (CurrentToken->Previous->isOneOf(tok::pipepipe, tok::ampamp) &&
|
||||
CurrentToken->Previous->is(TT_BinaryOperator) &&
|
||||
Contexts[Contexts.size() - 2].IsExpression &&
|
||||
Line.First->isNot(tok::kw_template))
|
||||
!Line.startsWith(tok::kw_template))
|
||||
return false;
|
||||
updateParameterCount(Left, CurrentToken);
|
||||
if (!consumeToken())
|
||||
|
@ -457,7 +457,7 @@ private:
|
|||
if (Contexts.back().ColonIsDictLiteral) {
|
||||
Tok->Type = TT_DictLiteral;
|
||||
} else if (Contexts.back().ColonIsObjCMethodExpr ||
|
||||
Line.First->is(TT_ObjCMethodSpecifier)) {
|
||||
Line.startsWith(TT_ObjCMethodSpecifier)) {
|
||||
Tok->Type = TT_ObjCMethodExpr;
|
||||
Tok->Previous->Type = TT_SelectorName;
|
||||
if (Tok->Previous->ColumnWidth >
|
||||
|
@ -503,7 +503,7 @@ private:
|
|||
if (!parseParens())
|
||||
return false;
|
||||
if (Line.MustBeDeclaration && Contexts.size() == 1 &&
|
||||
!Contexts.back().IsExpression && Line.First->isNot(TT_ObjCProperty) &&
|
||||
!Contexts.back().IsExpression && !Line.startsWith(TT_ObjCProperty) &&
|
||||
(!Tok->Previous ||
|
||||
!Tok->Previous->isOneOf(tok::kw_decltype, TT_LeadingJavaAnnotation)))
|
||||
Line.MightBeFunctionDecl = true;
|
||||
|
@ -581,7 +581,7 @@ private:
|
|||
if (Contexts.back().InCtorInitializer)
|
||||
Tok->Type = TT_CtorInitializerComma;
|
||||
else if (Contexts.back().FirstStartOfName &&
|
||||
(Contexts.size() == 1 || Line.First->is(tok::kw_for))) {
|
||||
(Contexts.size() == 1 || Line.startsWith(tok::kw_for))) {
|
||||
Contexts.back().FirstStartOfName->PartOfMultiVariableDeclStmt = true;
|
||||
Line.IsMultiVariableDeclStmt = true;
|
||||
}
|
||||
|
@ -724,7 +724,7 @@ public:
|
|||
if (ImportStatement)
|
||||
return LT_ImportStatement;
|
||||
|
||||
if (Line.First->is(TT_ObjCMethodSpecifier)) {
|
||||
if (Line.startsWith(TT_ObjCMethodSpecifier)) {
|
||||
if (Contexts.back().FirstObjCSelectorName)
|
||||
Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName =
|
||||
Contexts.back().LongestObjCSelectorName;
|
||||
|
@ -820,7 +820,7 @@ private:
|
|||
!Line.First->isOneOf(tok::kw_template, tok::kw_using) &&
|
||||
(!Current.Previous || Current.Previous->isNot(tok::kw_operator))) {
|
||||
Contexts.back().IsExpression = true;
|
||||
if (!Line.First->is(TT_UnaryOperator)) {
|
||||
if (!Line.startsWith(TT_UnaryOperator)) {
|
||||
for (FormatToken *Previous = Current.Previous;
|
||||
Previous && !Previous->isOneOf(tok::comma, tok::semi);
|
||||
Previous = Previous->Previous) {
|
||||
|
@ -1441,11 +1441,11 @@ void TokenAnnotator::annotate(AnnotatedLine &Line) {
|
|||
ExpressionParser ExprParser(Style, Keywords, Line);
|
||||
ExprParser.parse();
|
||||
|
||||
if (Line.First->is(TT_ObjCMethodSpecifier))
|
||||
if (Line.startsWith(TT_ObjCMethodSpecifier))
|
||||
Line.Type = LT_ObjCMethodDecl;
|
||||
else if (Line.First->is(TT_ObjCDecl))
|
||||
else if (Line.startsWith(TT_ObjCDecl))
|
||||
Line.Type = LT_ObjCDecl;
|
||||
else if (Line.First->is(TT_ObjCProperty))
|
||||
else if (Line.startsWith(TT_ObjCProperty))
|
||||
Line.Type = LT_ObjCProperty;
|
||||
|
||||
Line.First->SpacesRequiredBefore = 1;
|
||||
|
@ -1638,7 +1638,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
|
|||
|
||||
if (Right.isOneOf(TT_StartOfName, TT_FunctionDeclarationName) ||
|
||||
Right.is(tok::kw_operator)) {
|
||||
if (Line.First->is(tok::kw_for) && Right.PartOfMultiVariableDeclStmt)
|
||||
if (Line.startsWith(tok::kw_for) && Right.PartOfMultiVariableDeclStmt)
|
||||
return 3;
|
||||
if (Left.is(TT_StartOfName))
|
||||
return 110;
|
||||
|
@ -1674,8 +1674,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
|
|||
(!Right.Next || Right.Next->isNot(tok::l_paren))) {
|
||||
// Moving trailing annotations to the next line is fine for ObjC method
|
||||
// declarations.
|
||||
if (Line.First->is(TT_ObjCMethodSpecifier))
|
||||
|
||||
if (Line.startsWith(TT_ObjCMethodSpecifier))
|
||||
return 10;
|
||||
// Generally, breaking before a trailing annotation is bad unless it is
|
||||
// function-like. It seems to be especially preferable to keep standard
|
||||
|
@ -1687,7 +1686,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
|
|||
}
|
||||
|
||||
// In for-loops, prefer breaking at ',' and ';'.
|
||||
if (Line.First->is(tok::kw_for) && Left.is(tok::equal))
|
||||
if (Line.startsWith(tok::kw_for) && Left.is(tok::equal))
|
||||
return 4;
|
||||
|
||||
// In Objective-C method expressions, prefer breaking before "param:" over
|
||||
|
@ -1990,7 +1989,7 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
|
|||
Left.MatchingParen && Left.MatchingParen->is(TT_OverloadedOperatorLParen))
|
||||
return false;
|
||||
if (Right.is(tok::less) && Left.isNot(tok::l_paren) &&
|
||||
Line.First->is(tok::hash))
|
||||
Line.startsWith(tok::hash))
|
||||
return true;
|
||||
if (Right.is(TT_TrailingUnaryOperator))
|
||||
return false;
|
||||
|
@ -2094,7 +2093,7 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
|
|||
Line.First->isOneOf(tok::identifier, Keywords.kw_import,
|
||||
tok::kw_export, tok::kw_const) &&
|
||||
// kw_var is a pseudo-token that's a tok::identifier, so matches above.
|
||||
!Line.First->is(Keywords.kw_var))
|
||||
!Line.startsWith(Keywords.kw_var))
|
||||
// Object literals on the top level of a file are treated as "enum-style".
|
||||
// Each key/value pair is put on a separate line, instead of bin-packing.
|
||||
return true;
|
||||
|
|
|
@ -59,7 +59,7 @@ public:
|
|||
I->Tok->Previous = Current;
|
||||
Current = Current->Next;
|
||||
Current->Children.clear();
|
||||
for (const auto& Child : Node.Children) {
|
||||
for (const auto &Child : Node.Children) {
|
||||
Children.push_back(new AnnotatedLine(Child));
|
||||
Current->Children.push_back(Children.back());
|
||||
}
|
||||
|
@ -80,6 +80,12 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
/// \c true if this line starts with the given tokens in order, ignoring
|
||||
/// comments.
|
||||
template <typename... Ts> bool startsWith(Ts... Tokens) const {
|
||||
return startsWith(First, Tokens...);
|
||||
}
|
||||
|
||||
FormatToken *First;
|
||||
FormatToken *Last;
|
||||
|
||||
|
@ -107,6 +113,18 @@ private:
|
|||
// Disallow copying.
|
||||
AnnotatedLine(const AnnotatedLine &) = delete;
|
||||
void operator=(const AnnotatedLine &) = delete;
|
||||
|
||||
template <typename A, typename... Ts>
|
||||
bool startsWith(FormatToken *Tok, A K1) const {
|
||||
while (Tok && Tok->is(tok::comment))
|
||||
Tok = Tok->Next;
|
||||
return Tok && Tok->is(K1);
|
||||
}
|
||||
|
||||
template <typename A, typename... Ts>
|
||||
bool startsWith(FormatToken *Tok, A K1, Ts... Tokens) const {
|
||||
return startsWith(Tok, K1) && startsWith(Tok->Next, Tokens...);
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief Determines extra information about the tokens comprising an
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace {
|
|||
bool startsExternCBlock(const AnnotatedLine &Line) {
|
||||
const FormatToken *Next = Line.First->getNextNonComment();
|
||||
const FormatToken *NextNext = Next ? Next->getNextNonComment() : nullptr;
|
||||
return Line.First->is(tok::kw_extern) && Next && Next->isStringLiteral() &&
|
||||
return Line.startsWith(tok::kw_extern) && Next && Next->isStringLiteral() &&
|
||||
NextNext && NextNext->is(tok::l_brace);
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ public:
|
|||
unsigned LevelIndent = Line.First->OriginalColumn;
|
||||
if (static_cast<int>(LevelIndent) - Offset >= 0)
|
||||
LevelIndent -= Offset;
|
||||
if ((Line.First->isNot(tok::comment) || IndentForLevel[Line.Level] == -1) &&
|
||||
if ((!Line.First->is(tok::comment) || IndentForLevel[Line.Level] == -1) &&
|
||||
!Line.InPPDirective)
|
||||
IndentForLevel[Line.Level] = LevelIndent;
|
||||
}
|
||||
|
@ -280,7 +280,7 @@ private:
|
|||
TT_LineComment))
|
||||
return 0;
|
||||
// Only inline simple if's (no nested if or else).
|
||||
if (I + 2 != E && Line.First->is(tok::kw_if) &&
|
||||
if (I + 2 != E && Line.startsWith(tok::kw_if) &&
|
||||
I[2]->First->is(tok::kw_else))
|
||||
return 0;
|
||||
return 1;
|
||||
|
@ -334,12 +334,11 @@ private:
|
|||
return 0;
|
||||
if (Line.First->isOneOf(tok::kw_if, tok::kw_while, tok::kw_do, tok::kw_try,
|
||||
tok::kw___try, tok::kw_catch, tok::kw___finally,
|
||||
tok::kw_for, tok::r_brace) ||
|
||||
Line.First->is(Keywords.kw___except)) {
|
||||
tok::kw_for, tok::r_brace, Keywords.kw___except)) {
|
||||
if (!Style.AllowShortBlocksOnASingleLine)
|
||||
return 0;
|
||||
if (!Style.AllowShortIfStatementsOnASingleLine &&
|
||||
Line.First->is(tok::kw_if))
|
||||
Line.startsWith(tok::kw_if))
|
||||
return 0;
|
||||
if (!Style.AllowShortLoopsOnASingleLine &&
|
||||
Line.First->isOneOf(tok::kw_while, tok::kw_do, tok::kw_for))
|
||||
|
@ -362,7 +361,7 @@ private:
|
|||
Tok->SpacesRequiredBefore = 0;
|
||||
Tok->CanBreakBefore = true;
|
||||
return 1;
|
||||
} else if (Limit != 0 && Line.First->isNot(tok::kw_namespace) &&
|
||||
} else if (Limit != 0 && !Line.startsWith(tok::kw_namespace) &&
|
||||
!startsExternCBlock(Line)) {
|
||||
// We don't merge short records.
|
||||
if (Line.First->isOneOf(tok::kw_class, tok::kw_union, tok::kw_struct,
|
||||
|
|
Loading…
Reference in New Issue