11#include " CodeFormatCore/Format/Analyzer/LineBreakAnalyzer.h"
2- #include " CodeFormatCore/Format/Analyzer/IndentationAnalyzer.h"
32#include " CodeFormatCore/Format/Analyzer/SpaceAnalyzer.h"
43#include " CodeFormatCore/Format/FormatState.h"
54#include " LuaParser/Lexer/LuaTokenTypeDetail.h"
@@ -167,13 +166,6 @@ void LineBreakAnalyzer::ComplexAnalyze(FormatState &f, const LuaSyntaxTree &t) {
167166
168167 break ;
169168 }
170- case LuaSyntaxNodeKind::TableField: {
171- auto expr = syntaxNode.GetChildSyntaxNode (LuaSyntaxMultiKind::Expression, t);
172- if (expr.IsNode (t)) {
173- AnalyzeExpr (f, expr, t);
174- }
175- break ;
176- }
177169 case LuaSyntaxNodeKind::ExpressionStatement: {
178170 auto suffixedExpression = syntaxNode.GetChildSyntaxNode (NodeKind::SuffixedExpression, t);
179171 if (suffixedExpression.IsNode (t)) {
@@ -263,7 +255,7 @@ void LineBreakAnalyzer::BreakBefore(LuaSyntaxNode n, const LuaSyntaxTree &t, Lin
263255 }
264256}
265257
266- void LineBreakAnalyzer::AnalyzeExprList (FormatState &f, LuaSyntaxNode & exprList, const LuaSyntaxTree &t) {
258+ void LineBreakAnalyzer::AnalyzeExprList (FormatState &f, LuaSyntaxNode exprList, const LuaSyntaxTree &t) {
267259 auto exprs = exprList.GetChildSyntaxNodes (LuaSyntaxMultiKind::Expression, t);
268260 if (exprs.empty ()) {
269261 return ;
@@ -279,7 +271,7 @@ void LineBreakAnalyzer::AnalyzeExprList(FormatState &f, LuaSyntaxNode &exprList,
279271 }
280272}
281273
282- void LineBreakAnalyzer::AnalyzeConditionExpr (FormatState &f, LuaSyntaxNode & expr, const LuaSyntaxTree &t) {
274+ void LineBreakAnalyzer::AnalyzeConditionExpr (FormatState &f, LuaSyntaxNode expr, const LuaSyntaxTree &t) {
283275 switch (expr.GetSyntaxKind (t)) {
284276 case LuaSyntaxNodeKind::BinaryExpression: {
285277 break ;
@@ -290,7 +282,7 @@ void LineBreakAnalyzer::AnalyzeConditionExpr(FormatState &f, LuaSyntaxNode &expr
290282 }
291283}
292284
293- void LineBreakAnalyzer::AnalyzeNameList (FormatState &f, LuaSyntaxNode & nameList, const LuaSyntaxTree &t) {
285+ void LineBreakAnalyzer::AnalyzeNameList (FormatState &f, LuaSyntaxNode nameList, const LuaSyntaxTree &t) {
294286 auto names = nameList.GetChildTokens (TK_NAME, t);
295287 if (f.GetStyle ().auto_collapse_lines && CanCollapseLines (f, nameList, t)) {
296288 for (auto name: names) {
@@ -311,13 +303,69 @@ void LineBreakAnalyzer::AnalyzeNameList(FormatState &f, LuaSyntaxNode &nameList,
311303 }
312304}
313305
314- void LineBreakAnalyzer::AnalyzeSuffixedExpr (FormatState &f, LuaSyntaxNode & expr, const LuaSyntaxTree &t) {
306+ void LineBreakAnalyzer::AnalyzeSuffixedExpr (FormatState &f, LuaSyntaxNode expr, const LuaSyntaxTree &t) {
315307 auto children = expr.GetChildren (t);
316308 for (auto child: children) {
317309 AnalyzeExpr (f, child, t);
318310 }
319311}
320312
313+ // 是格式化的重点内容
314+ void LineBreakAnalyzer::AnalyzeTableExpr (FormatState &f, LuaSyntaxNode table, const LuaSyntaxTree &t) {
315+
316+ auto tableFieldList = table.GetChildSyntaxNode (LuaSyntaxNodeKind::TableFieldList, t);
317+ auto fields = tableFieldList.GetChildSyntaxNodes (LuaSyntaxNodeKind::TableField, t);
318+
319+ if (f.GetStyle ().auto_collapse_lines && CanCollapseLines (f, tableFieldList, t)) {
320+ for (auto field: fields) {
321+ MarkNotBreak (field, t);
322+ }
323+ MarkNotBreak (tableFieldList.GetNextToken (t), t);
324+ return ;
325+ }
326+
327+ if (f.GetStyle ().break_table_list == BreakTableList::Never) {
328+ return ;
329+ }
330+
331+ // force break
332+ bool breakAllList = f.GetStyle ().break_all_list_when_line_exceed && CanBreakAll (f, tableFieldList, t);
333+ if (!breakAllList && f.GetStyle ().break_table_list == BreakTableList::Smart) {
334+ breakAllList = tableFieldList.GetStartLine (t) != tableFieldList.GetEndLine (t) && std::any_of (fields.begin (), fields.end (), [&](LuaSyntaxNode &node) {
335+ return node.GetChildToken (' =' , t).IsToken (t);
336+ });
337+ }
338+ if (breakAllList) {
339+ auto leftBrace = table.GetChildToken (' {' , t);
340+ if (leftBrace.GetNextSibling (t).GetTokenKind (t) == TK_SHORT_COMMENT || leftBrace.GetNextSibling (t).GetTokenKind (t) == TK_LONG_COMMENT) {
341+ BreakAfter (leftBrace.GetNextSibling (t), t, LineSpace (LineSpaceType::Keep));
342+ } else {
343+ BreakAfter (leftBrace, t, LineSpace (LineSpaceType::Keep));
344+ }
345+
346+ for (auto field: fields) {
347+ BreakAfter (field, t, LineSpace (LineSpaceType::Keep));
348+ }
349+ }
350+
351+
352+ // 如果表的父节点也是表, 那表示格式化的期望就是
353+ // {
354+ // {},
355+ // {}
356+ // }
357+ if (f.GetStyle ().break_table_list == BreakTableList::Smart && table.GetParent (t).GetParent (t).GetSyntaxKind (t) == LuaSyntaxNodeKind::TableFieldList && table.IsSingleLineNode (t)) {
358+ return ;
359+ }
360+ for (auto field: fields) {
361+ auto exprs = field.GetChildSyntaxNodes (LuaSyntaxMultiKind::Expression, t);
362+ for (auto expr: exprs) {
363+ AnalyzeExpr (f, expr, t);
364+ }
365+ // MarkLazyBreak(field, t, LineBreakStrategy::WhenMayExceed);
366+ }
367+ }
368+
321369void LineBreakAnalyzer::MarkLazyBreak (LuaSyntaxNode n, const LuaSyntaxTree &t, LineBreakStrategy strategy) {
322370 auto prevToken = n.GetPrevToken (t);
323371 if (prevToken.IsToken (t) && !_lineBreaks.count (prevToken.GetIndex ())) {
@@ -339,7 +387,7 @@ void LineBreakAnalyzer::CancelBreakAfter(LuaSyntaxNode n, const LuaSyntaxTree &t
339387 }
340388}
341389
342- void LineBreakAnalyzer::AnalyzeExpr (FormatState &f, LuaSyntaxNode & expr, const LuaSyntaxTree &t) {
390+ void LineBreakAnalyzer::AnalyzeExpr (FormatState &f, LuaSyntaxNode expr, const LuaSyntaxTree &t) {
343391 switch (expr.GetSyntaxKind (t)) {
344392 case LuaSyntaxNodeKind::BinaryExpression: {
345393 auto exprs = expr.GetChildSyntaxNodes (LuaSyntaxMultiKind::Expression, t);
@@ -361,37 +409,7 @@ void LineBreakAnalyzer::AnalyzeExpr(FormatState &f, LuaSyntaxNode &expr, const L
361409 break ;
362410 }
363411 case LuaSyntaxNodeKind::TableExpression: {
364- auto tableFieldList = expr.GetChildSyntaxNode (LuaSyntaxNodeKind::TableFieldList, t);
365- auto fields = tableFieldList.GetChildSyntaxNodes (LuaSyntaxNodeKind::TableField, t);
366- if (f.GetStyle ().auto_collapse_lines && CanCollapseLines (f, tableFieldList, t)) {
367- for (auto field: fields) {
368- MarkNotBreak (field, t);
369- }
370- MarkNotBreak (tableFieldList.GetNextToken (t), t);
371- return ;
372- }
373- bool forceBreak = f.GetStyle ().break_all_list_when_line_exceed && CanBreakAll (f, tableFieldList, t);
374- if (!forceBreak) {
375- forceBreak = tableFieldList.GetStartLine (t) != tableFieldList.GetEndLine (t) && std::any_of (fields.begin (), fields.end (), [&](LuaSyntaxNode &node) {
376- return node.GetChildToken (' =' , t).IsToken (t);
377- });
378- }
379- if (forceBreak) {
380- auto leftBrace = expr.GetChildToken (' {' , t);
381- if (leftBrace.GetNextSibling (t).GetTokenKind (t) == TK_SHORT_COMMENT || leftBrace.GetNextSibling (t).GetTokenKind (t) == TK_LONG_COMMENT) {
382- BreakAfter (leftBrace.GetNextSibling (t), t, LineSpace (LineSpaceType::Keep));
383- } else {
384- BreakAfter (leftBrace, t, LineSpace (LineSpaceType::Keep));
385- }
386-
387- for (auto field: fields) {
388- BreakAfter (field, t, LineSpace (LineSpaceType::Keep));
389- }
390- } else {
391- for (auto field: fields) {
392- MarkLazyBreak (field, t, LineBreakStrategy::WhenMayExceed);
393- }
394- }
412+ AnalyzeTableExpr (f, expr, t);
395413 break ;
396414 }
397415 case LuaSyntaxNodeKind::CallExpression: {
@@ -415,7 +433,7 @@ void LineBreakAnalyzer::AnalyzeExpr(FormatState &f, LuaSyntaxNode &expr, const L
415433 }
416434}
417435
418- bool LineBreakAnalyzer::CanBreakAll (FormatState &f, LuaSyntaxNode & n, const LuaSyntaxTree &t) {
436+ bool LineBreakAnalyzer::CanBreakAll (FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t) {
419437 switch (n.GetSyntaxKind (t)) {
420438 case LuaSyntaxNodeKind::ParamList:
421439 case LuaSyntaxNodeKind::TableFieldList: {
0 commit comments