@@ -187,6 +187,18 @@ void IndentationAnalyzer::AddIndenter(LuaSyntaxNode n, const LuaSyntaxTree &t, I
187187 _indent[n.GetIndex ()] = indentData;
188188}
189189
190+ void IndentationAnalyzer::AddLinebreakGroup (LuaSyntaxNode parent, std::vector<LuaSyntaxNode> &group, const LuaSyntaxTree &t, std::size_t indent) {
191+ auto pos = _waitLinebreakGroups.size ();
192+ WaitLinebreakGroup g;
193+ g.Indent = indent;
194+ g.TriggerNodes = group;
195+ g.Parent = parent;
196+ _waitLinebreakGroups.emplace_back (g);
197+ for (auto n: group) {
198+ _waitLinebreak.insert ({n.GetIndex (), pos});
199+ }
200+ }
201+
190202void IndentationAnalyzer::MarkIndent (LuaSyntaxNode n, const LuaSyntaxTree &t) {
191203 _indentMark.insert (n.GetIndex ());
192204 auto p = n.GetParent (t);
@@ -199,7 +211,7 @@ void IndentationAnalyzer::MarkIndent(LuaSyntaxNode n, const LuaSyntaxTree &t) {
199211void IndentationAnalyzer::OnFormatMessage (FormatState &f, FormatEvent event, LuaSyntaxNode syntaxNode, const LuaSyntaxTree &t) {
200212 switch (event) {
201213 case FormatEvent::NodeExceedLinebreak: {
202-
214+ ProcessExceedLinebreak (f, syntaxNode, t);
203215 break ;
204216 }
205217 default : {
@@ -210,6 +222,7 @@ void IndentationAnalyzer::OnFormatMessage(FormatState &f, FormatEvent event, Lua
210222
211223void IndentationAnalyzer::AnalyzeExprList (FormatState &f, LuaSyntaxNode &exprList, const LuaSyntaxTree &t) {
212224 auto exprs = exprList.GetChildSyntaxNodes (MultiKind::Expression, t);
225+ bool shouldIndent = true ;
213226 if (exprs.size () == 1 ) {
214227 auto expr = exprs.front ();
215228 auto syntaxKind = expr.GetSyntaxKind (t);
@@ -219,24 +232,24 @@ void IndentationAnalyzer::AnalyzeExprList(FormatState &f, LuaSyntaxNode &exprLis
219232 }
220233
221234 if (!IsExprShouldIndent (expr, t)) {
222- return ;
235+ shouldIndent = false ;
223236 }
224-
225237 } else {
226- bool shouldIndent = false ;
238+ shouldIndent = false ;
227239 for (auto expr: exprs) {
228240 if (IsExprShouldIndent (expr, t)) {
229241 shouldIndent = true ;
230242 break ;
231243 }
232244 }
233-
234- if (!shouldIndent) {
235- return ;
236- }
237245 }
238246
239- AddIndenter (exprList, t, IndentData (IndentType::Standard, f.GetStyle ().continuation_indent ));
247+ if (shouldIndent) {
248+ AddIndenter (exprList, t, IndentData (IndentType::Standard, f.GetStyle ().continuation_indent ));
249+ } else {
250+ std::vector<LuaSyntaxNode> group = exprList.GetChildren (t);
251+ AddLinebreakGroup (exprList, group, t, f.GetStyle ().continuation_indent );
252+ }
240253}
241254
242255void IndentationAnalyzer::AnalyzeCallExprList (FormatState &f, LuaSyntaxNode &exprList, const LuaSyntaxTree &t) {
@@ -252,6 +265,9 @@ void IndentationAnalyzer::AnalyzeCallExprList(FormatState &f, LuaSyntaxNode &exp
252265
253266 if (shouldIndent) {
254267 AddIndenter (exprList, t, IndentData (IndentType::Standard));
268+ } else {
269+ std::vector<LuaSyntaxNode> group = exprList.GetChildren (t);
270+ AddLinebreakGroup (exprList, group, t, 0 );
255271 }
256272}
257273
@@ -318,3 +334,23 @@ void IndentationAnalyzer::AnalyzeTableFieldKeyValuePairExpr(FormatState &f, LuaS
318334 AddIndenter (expr, t, IndentData (IndentType::Standard, f.GetStyle ().continuation_indent ));
319335 }
320336}
337+
338+ void IndentationAnalyzer::ProcessExceedLinebreak (FormatState &f, LuaSyntaxNode syntaxNode, const LuaSyntaxTree &t) {
339+ auto it = _waitLinebreak.find (syntaxNode.GetIndex ());
340+ if (it == _waitLinebreak.end ()) {
341+ return ;
342+ }
343+ auto pos = it->second ;
344+ if (_waitLinebreakGroups.size () <= pos) {
345+ return ;
346+ }
347+
348+ auto &group = _waitLinebreakGroups[pos];
349+ for (auto n: group.TriggerNodes ) {
350+ _waitLinebreak.erase (n.GetIndex ());
351+ }
352+
353+ for (auto c: group.Parent .GetChildren (t)) {
354+ AddIndenter (c, t, IndentData (IndentType::WhenNewLine, group.Indent ));
355+ }
356+ }
0 commit comments