diff options
Diffstat (limited to 'clang/lib/Format/ContinuationIndenter.cpp')
| -rw-r--r-- | clang/lib/Format/ContinuationIndenter.cpp | 97 | 
1 files changed, 62 insertions, 35 deletions
| diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index e5abf83..9ab024a 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -356,9 +356,11 @@ bool ContinuationIndenter::canBreak(const LineState &State) {      return CurrentState.BreakBeforeClosingBrace;    } -  // Allow breaking before the right parens with block indentation if there was -  // a break after the left parens, which is tracked by BreakBeforeClosingParen. -  if (Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent && +  // Check need to break before the right parens if there was a break after +  // the left parens, which is tracked by BreakBeforeClosingParen. +  if ((Style.BreakBeforeCloseBracketFunction || +       Style.BreakBeforeCloseBracketIf || Style.BreakBeforeCloseBracketLoop || +       Style.BreakBeforeCloseBracketSwitch) &&        Current.is(tok::r_paren)) {      return CurrentState.BreakBeforeClosingParen;    } @@ -837,32 +839,38 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,        return Tok.is(tok::l_brace) && Tok.isNot(BK_Block) &&               Style.Cpp11BracedListStyle != FormatStyle::BLS_Block;      }; -    if (Tok.isNoneOf(tok::l_paren, TT_TemplateOpener, tok::l_square) && -        !IsStartOfBracedList()) { +    if (IsStartOfBracedList()) +      return Style.BreakAfterOpenBracketBracedList; +    if (Tok.isNoneOf(tok::l_paren, TT_TemplateOpener, tok::l_square))        return false; -    }      if (!Tok.Previous)        return true;      if (Tok.Previous->isIf()) -      return Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak; -    return Tok.Previous->isNoneOf(TT_CastRParen, tok::kw_for, tok::kw_while, -                                  tok::kw_switch) && -           !(Style.isJavaScript() && Tok.Previous->is(Keywords.kw_await)); +      return Style.BreakAfterOpenBracketIf; +    if (Tok.Previous->isLoop(Style)) +      return Style.BreakAfterOpenBracketLoop; +    if (Tok.Previous->is(tok::kw_switch)) +      return Style.BreakAfterOpenBracketSwitch; +    if (Style.BreakAfterOpenBracketFunction) { +      return !Tok.Previous->is(TT_CastRParen) && +             !(Style.isJavaScript() && Tok.is(Keywords.kw_await)); +    } +    return false;    };    auto IsFunctionCallParen = [](const FormatToken &Tok) {      return Tok.is(tok::l_paren) && Tok.ParameterCount > 0 && Tok.Previous &&             Tok.Previous->is(tok::identifier);    }; -  auto IsInTemplateString = [this](const FormatToken &Tok) { +  auto IsInTemplateString = [this](const FormatToken &Tok, bool NestBlocks) {      if (!Style.isJavaScript())        return false;      for (const auto *Prev = &Tok; Prev; Prev = Prev->Previous) {        if (Prev->is(TT_TemplateString) && Prev->opensScope())          return true; -      if (Prev->opensScope() || -          (Prev->is(TT_TemplateString) && Prev->closesScope())) { -        break; -      } +      if (Prev->opensScope() && !NestBlocks) +        return false; +      if (Prev->is(TT_TemplateString) && Prev->closesScope()) +        return false;      }      return false;    }; @@ -884,21 +892,25 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,           Tok.isOneOf(tok::ellipsis, Keywords.kw_await))) {        return true;      } -    if (const auto *Previous = Tok.Previous; -        !Previous || (Previous->isNoneOf(TT_FunctionDeclarationLParen, -                                         TT_LambdaDefinitionLParen) && -                      !IsFunctionCallParen(*Previous))) { +    const auto *Previous = TokAfterLParen.Previous; +    assert(Previous); // IsOpeningBracket(Previous) +    if (Previous->Previous && +        (Previous->Previous->isIf() || Previous->Previous->isLoop(Style) || +         Previous->Previous->is(tok::kw_switch))) { +      return false; +    } +    if (Previous->isNoneOf(TT_FunctionDeclarationLParen, +                           TT_LambdaDefinitionLParen) && +        !IsFunctionCallParen(*Previous)) {        return true;      } -    if (IsOpeningBracket(Tok) || IsInTemplateString(Tok)) +    if (IsOpeningBracket(Tok) || IsInTemplateString(Tok, true))        return true;      const auto *Next = Tok.Next;      return !Next || Next->isMemberAccess() ||             Next->is(TT_FunctionDeclarationLParen) || IsFunctionCallParen(*Next);    }; -  if ((Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak || -       Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) && -      IsOpeningBracket(Previous) && State.Column > getNewLineColumn(State) && +  if (IsOpeningBracket(Previous) && State.Column > getNewLineColumn(State) &&        // Don't do this for simple (no expressions) one-argument function calls        // as that feels like needlessly wasting whitespace, e.g.:        // @@ -920,7 +932,7 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,    // Note: This doesn't apply to macro expansion lines, which are MACRO( , , )    // with args as children of the '(' and ',' tokens. It does not make sense to    // align the commas with the opening paren. -  if (Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign && +  if (Style.AlignAfterOpenBracket &&        !CurrentState.IsCSharpGenericTypeConstraint && Previous.opensScope() &&        Previous.isNoneOf(TT_ObjCMethodExpr, TT_RequiresClause,                          TT_TableGenDAGArgOpener, @@ -933,7 +945,7 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,           Previous.Previous->isNoneOf(tok::identifier, tok::l_paren,                                       BK_BracedInit))) ||         Previous.is(TT_VerilogMultiLineListLParen)) && -      !IsInTemplateString(Current)) { +      !IsInTemplateString(Current, false)) {      CurrentState.Indent = State.Column + Spaces;      CurrentState.IsAligned = true;    } @@ -1271,8 +1283,20 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,    }    if (PreviousNonComment && PreviousNonComment->is(tok::l_paren)) { -    CurrentState.BreakBeforeClosingParen = -        Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent; +    if (auto Previous = PreviousNonComment->Previous) { +      if (Previous->isIf()) { +        CurrentState.BreakBeforeClosingParen = Style.BreakBeforeCloseBracketIf; +      } else if (Previous->isLoop(Style)) { +        CurrentState.BreakBeforeClosingParen = +            Style.BreakBeforeCloseBracketLoop; +      } else if (Previous->is(tok::kw_switch)) { +        CurrentState.BreakBeforeClosingParen = +            Style.BreakBeforeCloseBracketSwitch; +      } else { +        CurrentState.BreakBeforeClosingParen = +            Style.BreakBeforeCloseBracketFunction; +      } +    }    }    if (PreviousNonComment && PreviousNonComment->is(TT_TemplateOpener)) @@ -1416,13 +1440,17 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {        State.Stack.size() > 1) {      return State.Stack[State.Stack.size() - 2].LastSpace;    } -  if (Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent && -      (Current.is(tok::r_paren) || -       (Current.is(tok::r_brace) && Current.MatchingParen && -        Current.MatchingParen->is(BK_BracedInit))) && +  if (Style.BreakBeforeCloseBracketBracedList && Current.is(tok::r_brace) && +      Current.MatchingParen && Current.MatchingParen->is(BK_BracedInit) &&        State.Stack.size() > 1) {      return State.Stack[State.Stack.size() - 2].LastSpace;    } +  if ((Style.BreakBeforeCloseBracketFunction || +       Style.BreakBeforeCloseBracketIf || Style.BreakBeforeCloseBracketLoop || +       Style.BreakBeforeCloseBracketSwitch) && +      Current.is(tok::r_paren) && State.Stack.size() > 1) { +    return State.Stack[State.Stack.size() - 2].LastSpace; +  }    if (Style.BreakBeforeTemplateCloser && Current.is(TT_TemplateCloser) &&        State.Stack.size() > 1) {      return State.Stack[State.Stack.size() - 2].LastSpace; @@ -1844,8 +1872,8 @@ void ContinuationIndenter::moveStatePastFakeLParens(LineState &State,           PrecedenceLevel < prec::Assignment) &&          (!Previous || Previous->isNot(tok::kw_return) ||           (!Style.isJava() && PrecedenceLevel > 0)) && -        (Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign || -         PrecedenceLevel > prec::Comma || Current.NestingLevel == 0) && +        (Style.AlignAfterOpenBracket || PrecedenceLevel > prec::Comma || +         Current.NestingLevel == 0) &&          (!Style.isTableGen() ||           (Previous && Previous->isOneOf(TT_TableGenDAGArgListComma,                                          TT_TableGenDAGArgListCommaToBreak)))) { @@ -1885,8 +1913,7 @@ void ContinuationIndenter::moveStatePastFakeLParens(LineState &State,      if (PrecedenceLevel > prec::Unknown)        NewParenState.LastSpace = std::max(NewParenState.LastSpace, State.Column);      if (PrecedenceLevel != prec::Conditional && -        Current.isNot(TT_UnaryOperator) && -        Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign) { +        Current.isNot(TT_UnaryOperator) && Style.AlignAfterOpenBracket) {        NewParenState.StartOfFunctionCall = State.Column;      } | 
