@@ -986,16 +986,59 @@ class AnnotatingParser {
986
986
return false ;
987
987
}
988
988
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
+
989
1009
// SimpleValue6 ::= "(" DagArg [DagArgList] ")"
990
1010
// This parses SimpleValue 6's inside part of "(" ")"
991
1011
bool parseTableGenDAGArgAndList (FormatToken *Opener) {
1012
+ FormatToken *FirstTok = CurrentToken;
992
1013
if (!parseTableGenDAGArg ())
993
1014
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
+ }
994
1036
// Parse the [DagArgList] part
995
1037
bool FirstDAGArgListElm = true ;
996
1038
while (CurrentToken) {
997
1039
if (!FirstDAGArgListElm && CurrentToken->is (tok::comma)) {
998
- CurrentToken->setType (TT_TableGenDAGArgListComma);
1040
+ CurrentToken->setType (BreakInside ? TT_TableGenDAGArgListCommaToBreak
1041
+ : TT_TableGenDAGArgListComma);
999
1042
skipToNextNonComment ();
1000
1043
}
1001
1044
if (CurrentToken && CurrentToken->is (tok::r_paren)) {
@@ -5086,6 +5129,11 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
5086
5129
}
5087
5130
if (Right.is (TT_TableGenCondOperatorColon))
5088
5131
return false ;
5132
+ if (Left.isOneOf (TT_TableGenDAGArgOperatorID,
5133
+ TT_TableGenDAGArgOperatorToBreak) &&
5134
+ Right.isNot (TT_TableGenDAGArgCloser)) {
5135
+ return true ;
5136
+ }
5089
5137
// Do not insert bang operators and consequent openers.
5090
5138
if (Right.isOneOf (tok::l_paren, tok::less) &&
5091
5139
Left.isOneOf (TT_TableGenBangOperator, TT_TableGenCondOperator)) {
@@ -5462,6 +5510,18 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
5462
5510
// case2:0);
5463
5511
if (Left.is (TT_TableGenCondOperatorComma))
5464
5512
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
+ }
5465
5525
}
5466
5526
5467
5527
if (Line.startsWith (tok::kw_asm) && Right.is (TT_InlineASMColon) &&
@@ -5876,6 +5936,8 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
5876
5936
// Avoid to break around paste operator.
5877
5937
if (Left.is (tok::hash) || Right.is (tok::hash))
5878
5938
return false ;
5939
+ if (Left.isOneOf (TT_TableGenBangOperator, TT_TableGenCondOperator))
5940
+ return false ;
5879
5941
}
5880
5942
5881
5943
if (Left.is (tok::at))
0 commit comments