@@ -986,16 +986,59 @@ class AnnotatingParser {
986986 return false ;
987987 }
988988
989+ // Judge if the token is a operator ID to insert line break in DAGArg.
990+ // That is, TableGenBreakingDAGArgOperators is empty (by the definition of the
991+ // option) or the token is in the list.
992+ bool isTableGenDAGArgBreakingOperator (const FormatToken &Tok) {
993+ auto &Opes = Style.TableGenBreakingDAGArgOperators ;
994+ // If the list is empty, all operators are breaking operators.
995+ if (Opes.empty ())
996+ return true ;
997+ // Otherwise, the operator is limited to normal identifiers.
998+ if (Tok.isNot (tok::identifier) ||
999+ Tok.isOneOf (TT_TableGenBangOperator, TT_TableGenCondOperator)) {
1000+ return false ;
1001+ }
1002+ // The case next is colon, it is not a operator of identifier.
1003+ if (!Tok.Next || Tok.Next ->is (tok::colon))
1004+ return false ;
1005+ return std::find (Opes.begin (), Opes.end (), Tok.TokenText .str ()) !=
1006+ Opes.end ();
1007+ }
1008+
9891009 // SimpleValue6 ::= "(" DagArg [DagArgList] ")"
9901010 // This parses SimpleValue 6's inside part of "(" ")"
9911011 bool parseTableGenDAGArgAndList (FormatToken *Opener) {
1012+ FormatToken *FirstTok = CurrentToken;
9921013 if (!parseTableGenDAGArg ())
9931014 return false ;
1015+ bool BreakInside = false ;
1016+ if (Style.TableGenBreakInsideDAGArg != FormatStyle::DAS_DontBreak) {
1017+ // Specialized detection for DAGArgOperator, that determines the way of
1018+ // line break for this DAGArg elements.
1019+ if (isTableGenDAGArgBreakingOperator (*FirstTok)) {
1020+ // Special case for identifier DAGArg operator.
1021+ BreakInside = true ;
1022+ Opener->setType (TT_TableGenDAGArgOpenerToBreak);
1023+ if (FirstTok->isOneOf (TT_TableGenBangOperator,
1024+ TT_TableGenCondOperator)) {
1025+ // Special case for bang/cond operators. Set the whole operator as
1026+ // the DAGArg operator. Always break after it.
1027+ CurrentToken->Previous ->setType (TT_TableGenDAGArgOperatorToBreak);
1028+ } else if (FirstTok->is (tok::identifier)) {
1029+ if (Style.TableGenBreakInsideDAGArg == FormatStyle::DAS_BreakAll)
1030+ FirstTok->setType (TT_TableGenDAGArgOperatorToBreak);
1031+ else
1032+ FirstTok->setType (TT_TableGenDAGArgOperatorID);
1033+ }
1034+ }
1035+ }
9941036 // Parse the [DagArgList] part
9951037 bool FirstDAGArgListElm = true ;
9961038 while (CurrentToken) {
9971039 if (!FirstDAGArgListElm && CurrentToken->is (tok::comma)) {
998- CurrentToken->setType (TT_TableGenDAGArgListComma);
1040+ CurrentToken->setType (BreakInside ? TT_TableGenDAGArgListCommaToBreak
1041+ : TT_TableGenDAGArgListComma);
9991042 skipToNextNonComment ();
10001043 }
10011044 if (CurrentToken && CurrentToken->is (tok::r_paren)) {
@@ -5086,6 +5129,11 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
50865129 }
50875130 if (Right.is (TT_TableGenCondOperatorColon))
50885131 return false ;
5132+ if (Left.isOneOf (TT_TableGenDAGArgOperatorID,
5133+ TT_TableGenDAGArgOperatorToBreak) &&
5134+ Right.isNot (TT_TableGenDAGArgCloser)) {
5135+ return true ;
5136+ }
50895137 // Do not insert bang operators and consequent openers.
50905138 if (Right.isOneOf (tok::l_paren, tok::less) &&
50915139 Left.isOneOf (TT_TableGenBangOperator, TT_TableGenCondOperator)) {
@@ -5462,6 +5510,18 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
54625510 // case2:0);
54635511 if (Left.is (TT_TableGenCondOperatorComma))
54645512 return true ;
5513+ if (Left.is (TT_TableGenDAGArgOperatorToBreak) &&
5514+ Right.isNot (TT_TableGenDAGArgCloser)) {
5515+ return true ;
5516+ }
5517+ if (Left.is (TT_TableGenDAGArgListCommaToBreak))
5518+ return true ;
5519+ if (Right.is (TT_TableGenDAGArgCloser) && Right.MatchingParen &&
5520+ Right.MatchingParen ->is (TT_TableGenDAGArgOpenerToBreak) &&
5521+ &Left != Right.MatchingParen ->Next ) {
5522+ // Check to avoid empty DAGArg such as (ins).
5523+ return Style.TableGenBreakInsideDAGArg == FormatStyle::DAS_BreakAll;
5524+ }
54655525 }
54665526
54675527 if (Line.startsWith (tok::kw_asm) && Right.is (TT_InlineASMColon) &&
@@ -5876,6 +5936,8 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
58765936 // Avoid to break around paste operator.
58775937 if (Left.is (tok::hash) || Right.is (tok::hash))
58785938 return false ;
5939+ if (Left.isOneOf (TT_TableGenBangOperator, TT_TableGenCondOperator))
5940+ return false ;
58795941 }
58805942
58815943 if (Left.is (tok::at))
0 commit comments