Skip to content

Commit e6f382c

Browse files
committed
enhance table list format
1 parent 403cd16 commit e6f382c

File tree

7 files changed

+93
-59
lines changed

7 files changed

+93
-59
lines changed

CodeFormatCore/include/CodeFormatCore/Config/LuaStyle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ class LuaStyle {
150150

151151
bool break_before_braces = false;
152152

153+
BreakTableList break_table_list = BreakTableList::Smart;
153154
// [preference]
154155
bool ignore_space_after_colon = false;
155156

CodeFormatCore/include/CodeFormatCore/Config/LuaStyleEnum.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,9 @@ enum class EndStmtWithSemicolon {
9191
Always,
9292
SameLine
9393
};
94+
95+
enum class BreakTableList {
96+
Never,
97+
Smart,
98+
Lazy
99+
};

CodeFormatCore/include/CodeFormatCore/Format/Analyzer/LineBreakAnalyzer.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,19 @@ class LineBreakAnalyzer : public FormatAnalyzer {
3131

3232
void CancelBreakAfter(LuaSyntaxNode n, const LuaSyntaxTree &t);
3333
private:
34-
void AnalyzeExprList(FormatState &f, LuaSyntaxNode &exprList, const LuaSyntaxTree &t);
34+
void AnalyzeExprList(FormatState &f, LuaSyntaxNode exprList, const LuaSyntaxTree &t);
3535

36-
void AnalyzeExpr(FormatState &f, LuaSyntaxNode &expr, const LuaSyntaxTree &t);
36+
void AnalyzeExpr(FormatState &f, LuaSyntaxNode expr, const LuaSyntaxTree &t);
3737

38-
void AnalyzeConditionExpr(FormatState &f, LuaSyntaxNode &expr, const LuaSyntaxTree &t);
38+
void AnalyzeConditionExpr(FormatState &f, LuaSyntaxNode expr, const LuaSyntaxTree &t);
3939

40-
void AnalyzeNameList(FormatState &f, LuaSyntaxNode &nameList, const LuaSyntaxTree &t);
40+
void AnalyzeNameList(FormatState &f, LuaSyntaxNode nameList, const LuaSyntaxTree &t);
4141

42-
void AnalyzeSuffixedExpr(FormatState &f, LuaSyntaxNode &expr, const LuaSyntaxTree &t);
42+
void AnalyzeSuffixedExpr(FormatState &f, LuaSyntaxNode expr, const LuaSyntaxTree &t);
4343

44-
bool CanBreakAll(FormatState &f, LuaSyntaxNode &n, const LuaSyntaxTree &t);
44+
void AnalyzeTableExpr(FormatState &f, LuaSyntaxNode table, const LuaSyntaxTree &t);
45+
46+
bool CanBreakAll(FormatState &f, LuaSyntaxNode n, const LuaSyntaxTree &t);
4547

4648
bool CanCollapseLines(FormatState &f, LuaSyntaxNode &n, const LuaSyntaxTree &t);
4749

CodeFormatCore/include/CodeFormatCore/RangeFormat/RangeFormatBuilder.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ class RangeFormatBuilder : public FormatBuilder {
2828
void WriteChar(char ch) override;
2929

3030
void WriteText(std::string_view text) override;
31-
3231
private:
3332
void CheckRange(LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t, FormatResolve &resolve);
3433

CodeFormatCore/src/Config/LuaStyle.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,18 @@ void LuaStyle::Parse(std::map<std::string, std::string, std::less<>> &configMap)
268268

269269
BOOL_OPTION(break_before_braces)
270270

271+
if (configMap.count("break_table_list")) {
272+
if (configMap.at("break_table_list") == "never") {
273+
break_table_list = BreakTableList::Never;
274+
}
275+
else if(configMap.at("break_table_list") == "smart") {
276+
break_table_list = BreakTableList::Smart;
277+
}
278+
else if(configMap.at("break_table_list") == "lazy") {
279+
break_table_list = BreakTableList::Lazy;
280+
}
281+
}
282+
271283
BOOL_OPTION(ignore_space_after_colon)
272284

273285
BOOL_OPTION(remove_call_expression_list_finish_comma)

CodeFormatCore/src/Format/Analyzer/LineBreakAnalyzer.cpp

Lines changed: 63 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
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+
321369
void 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: {

Test2/src/FormatTest2.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,9 @@
88

99
int main() {
1010
std::string buffer = R"(
11-
local t = { function ()
12-
local t = 123
13-
end }
14-
15-
local t = { {
16-
okokok = 123
17-
} }
11+
local t = {
12+
{ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, cccccccccccccccccccccccccccccccccccccccccc,ddddddddddddddddddddddddddddddddd}
13+
}
1814
)";
1915

2016
auto file = std::make_shared<LuaSource>(std::move(buffer));

0 commit comments

Comments
 (0)