Skip to content

Commit df63fea

Browse files
committed
support align chain expr
1 parent 081b623 commit df63fea

File tree

5 files changed

+82
-26
lines changed

5 files changed

+82
-26
lines changed

CodeService/src/Format/Analyzer/AlignAnalyzer.cpp

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
#include "CodeService/Format/Analyzer/AlignAnalyzer.h"
2-
#include "LuaParser/Lexer/LuaTokenTypeDetail.h"
32
#include "CodeService/Format/FormatState.h"
3+
#include "LuaParser/Lexer/LuaTokenTypeDetail.h"
44
#include "SyntaxNodeHelper.h"
55
#include "Util/StringUtil.h"
66

77

88
AlignAnalyzer::AlignAnalyzer() {
9-
109
}
1110

1211
void AlignAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
@@ -60,6 +59,11 @@ void AlignAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
6059
AnalyzeIfStatement(f, syntaxNode, t);
6160
}
6261
}
62+
case LuaSyntaxNodeKind::SuffixedExpression: {
63+
if (f.GetStyle().align_chain_expr != AlignChainExpr::None) {
64+
AnalyzeChainExpr(f, syntaxNode, t);
65+
}
66+
}
6367
default: {
6468
break;
6569
}
@@ -129,8 +133,7 @@ void AlignAnalyzer::PushAlignGroup(AlignStrategy strategy, std::vector<std::size
129133
}
130134
}
131135

132-
void
133-
AlignAnalyzer::AnalyzeContinuousLocalOrAssign(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
136+
void AlignAnalyzer::AnalyzeContinuousLocalOrAssign(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
134137
auto children = syntaxNode.GetChildren(t);
135138
std::size_t lastLine = 0;
136139
std::vector<std::size_t> group;
@@ -142,8 +145,7 @@ AlignAnalyzer::AnalyzeContinuousLocalOrAssign(FormatState &f, LuaSyntaxNode &syn
142145
for (auto stmt: children) {
143146
auto kind = stmt.GetSyntaxKind(t);
144147
if (group.empty()) {
145-
if (kind == LuaSyntaxNodeKind::LocalStatement
146-
|| kind == LuaSyntaxNodeKind::AssignStatement) {
148+
if (kind == LuaSyntaxNodeKind::LocalStatement || kind == LuaSyntaxNodeKind::AssignStatement) {
147149
group.push_back(stmt.GetIndex());
148150
lastLine = stmt.GetEndLine(t);
149151
}
@@ -163,8 +165,7 @@ AlignAnalyzer::AnalyzeContinuousLocalOrAssign(FormatState &f, LuaSyntaxNode &syn
163165
continue;
164166
}
165167

166-
if (kind == LuaSyntaxNodeKind::LocalStatement
167-
|| kind == LuaSyntaxNodeKind::AssignStatement) {
168+
if (kind == LuaSyntaxNodeKind::LocalStatement || kind == LuaSyntaxNodeKind::AssignStatement) {
168169
auto line = stmt.GetStartLine(t);
169170
if (line - lastLine <= f.GetStyle().align_continuous_line_space) {
170171
group.push_back(stmt.GetIndex());
@@ -191,8 +192,7 @@ AlignAnalyzer::AnalyzeContinuousLocalOrAssign(FormatState &f, LuaSyntaxNode &syn
191192
}
192193

193194
bool IsRectField(LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
194-
return syntaxNode.GetSyntaxKind(t) == LuaSyntaxNodeKind::TableField
195-
&& !syntaxNode.GetChildToken('=', t).IsNull(t);
195+
return syntaxNode.GetSyntaxKind(t) == LuaSyntaxNodeKind::TableField && !syntaxNode.GetChildToken('=', t).IsNull(t);
196196
}
197197

198198
void AlignAnalyzer::AnalyzeContinuousRectField(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
@@ -270,8 +270,7 @@ bool IsArrayTableField(LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
270270
return expr.GetSyntaxKind(t) == LuaSyntaxNodeKind::TableExpression;
271271
}
272272

273-
void
274-
AlignAnalyzer::AnalyzeContinuousArrayTableField(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
273+
void AlignAnalyzer::AnalyzeContinuousArrayTableField(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
275274
auto children = syntaxNode.GetChildren(t);
276275
std::vector<LuaSyntaxNode> arrayTable;
277276
std::size_t lastLine = 0;
@@ -280,9 +279,7 @@ AlignAnalyzer::AnalyzeContinuousArrayTableField(FormatState &f, LuaSyntaxNode &s
280279
continue;
281280
}
282281

283-
if (IsArrayTableField(field, t)
284-
&& field.IsSingleLineNode(t)
285-
&& field.GetStartLine(t) > lastLine) {
282+
if (IsArrayTableField(field, t) && field.IsSingleLineNode(t) && field.GetStartLine(t) > lastLine) {
286283
lastLine = field.GetStartLine(t);
287284
auto tableExpr = field.GetFirstChild(t);
288285
arrayTable.push_back(tableExpr);
@@ -297,8 +294,7 @@ AlignAnalyzer::AnalyzeContinuousArrayTableField(FormatState &f, LuaSyntaxNode &s
297294
}
298295
}
299296

300-
void
301-
AlignAnalyzer::AnalyzeArrayTableAlign(FormatState &f, std::vector<LuaSyntaxNode> &arrayTable, const LuaSyntaxTree &t) {
297+
void AlignAnalyzer::AnalyzeArrayTableAlign(FormatState &f, std::vector<LuaSyntaxNode> &arrayTable, const LuaSyntaxTree &t) {
302298
std::vector<std::vector<LuaSyntaxNode>> arrayTableFieldVec;
303299
std::size_t maxAlign = 0;
304300
for (auto &table: arrayTable) {
@@ -351,8 +347,7 @@ AlignAnalyzer::AnalyzeArrayTableAlign(FormatState &f, std::vector<LuaSyntaxNode>
351347
}
352348
}
353349

354-
void
355-
AlignAnalyzer::ResolveAlignGroup(FormatState &f, std::size_t groupIndex, AlignGroup &group, const LuaSyntaxTree &t) {
350+
void AlignAnalyzer::ResolveAlignGroup(FormatState &f, std::size_t groupIndex, AlignGroup &group, const LuaSyntaxTree &t) {
356351
switch (group.Strategy) {
357352
case AlignStrategy::AlignToEqWhenExtraSpace: {
358353
bool allowAlign = false;
@@ -403,13 +398,13 @@ AlignAnalyzer::ResolveAlignGroup(FormatState &f, std::size_t groupIndex, AlignGr
403398
break;
404399
}
405400
case AlignStrategy::AlignToFirst: {
406-
if(group.SyntaxGroup.empty()){
407-
return ;
401+
if (group.SyntaxGroup.empty()) {
402+
return;
408403
}
409404
LuaSyntaxNode firstNode(group.SyntaxGroup.front());
410405
if (!f.IsNewLine(firstNode, t)) {
411406
auto width = f.CurrentWidth();
412-
if(f.GetMode() == FormatState::Mode::Diagnostic){
407+
if (f.GetMode() == FormatState::Mode::Diagnostic) {
413408
width = firstNode.GetStartCol(t);
414409
}
415410

@@ -535,6 +530,19 @@ void AlignAnalyzer::AnalyzeIfStatement(FormatState &f, LuaSyntaxNode &syntaxNode
535530
PushNormalAlignGroup(ifAlignPos, group);
536531
}
537532

533+
void AlignAnalyzer::AnalyzeChainExpr(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
534+
auto parent = syntaxNode.GetParent(t);
535+
if (parent.GetSyntaxKind(t) != LuaSyntaxNodeKind::ExpressionStatement && f.GetStyle().align_chain_expr == AlignChainExpr::OnlyCallStmt) {
536+
return;
537+
}
538+
539+
std::vector<std::size_t> group;
540+
for (auto indexExpr: syntaxNode.GetChildSyntaxNodes(LuaSyntaxNodeKind::IndexExpression, t)) {
541+
group.push_back(indexExpr.GetFirstToken(t).GetIndex());
542+
}
543+
PushAlignGroup(AlignStrategy::AlignToFirst, group);
544+
}
545+
538546
void AlignAnalyzer::PushNormalAlignGroup(std::size_t alignPos, std::vector<std::size_t> &data) {
539547
auto pos = _alignGroup.size();
540548
auto &alignGroup = _alignGroup.emplace_back(AlignStrategy::Normal, data);
@@ -545,9 +553,7 @@ void AlignAnalyzer::PushNormalAlignGroup(std::size_t alignPos, std::vector<std::
545553
}
546554
}
547555

548-
void
549-
AlignAnalyzer::AnalyzeContinuousSimilarCallArgs(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
550-
556+
void AlignAnalyzer::AnalyzeContinuousSimilarCallArgs(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
551557
}
552558

553559
void AlignAnalyzer::AnalyzeInlineComment(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {

Test/src/FormatStyle_unitest.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,4 +1286,45 @@ local t = {
12861286
bbaa = 2, --bb
12871287
}
12881288
)", style));
1289+
}
1290+
1291+
TEST(FormatByStyleOption, align_chain_expr){
1292+
LuaStyle style;
1293+
1294+
style.align_chain_expr = AlignChainExpr::Always;
1295+
EXPECT_TRUE(TestHelper::TestFormatted(
1296+
R"(
1297+
return aaaaaaaaaaaa.wfgoiwjofjw()
1298+
.afjoajofjw + 123131 + 123131
1299+
local t = aaaaaaaaaaaa.wfgoiwjofjw()
1300+
.afjoajofjw + 123131 + 123131
1301+
aaaaaaaaaaaa.wfgoiwjofjw()
1302+
.afjoajofjw()
1303+
)",
1304+
R"(
1305+
return aaaaaaaaaaaa.wfgoiwjofjw()
1306+
.afjoajofjw + 123131 + 123131
1307+
local t = aaaaaaaaaaaa.wfgoiwjofjw()
1308+
.afjoajofjw + 123131 + 123131
1309+
aaaaaaaaaaaa.wfgoiwjofjw()
1310+
.afjoajofjw()
1311+
)", style));
1312+
style.align_chain_expr = AlignChainExpr::OnlyCallStmt;
1313+
EXPECT_TRUE(TestHelper::TestFormatted(
1314+
R"(
1315+
return aaaaaaaaaaaa.wfgoiwjofjw()
1316+
.afjoajofjw + 123131 + 123131
1317+
local t = aaaaaaaaaaaa.wfgoiwjofjw()
1318+
.afjoajofjw + 123131 + 123131
1319+
aaaaaaaaaaaa.wfgoiwjofjw()
1320+
.afjoajofjw()
1321+
)",
1322+
R"(
1323+
return aaaaaaaaaaaa.wfgoiwjofjw()
1324+
.afjoajofjw + 123131 + 123131
1325+
local t = aaaaaaaaaaaa.wfgoiwjofjw()
1326+
.afjoajofjw + 123131 + 123131
1327+
aaaaaaaaaaaa.wfgoiwjofjw()
1328+
.afjoajofjw()
1329+
)", style));
12891330
}

include/CodeService/Config/LuaStyle.h

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

107107
AlignArrayTable align_array_table = AlignArrayTable::Normal;
108108

109+
AlignChainExpr align_chain_expr = AlignChainExpr::None;
109110
// [Indent]
110111

111112
/*

include/CodeService/Config/LuaStyleEnum.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,9 @@ enum class AlignArrayTable {
7777
Normal,
7878
ContainCurly
7979
};
80+
81+
enum class AlignChainExpr {
82+
None,
83+
Always,
84+
OnlyCallStmt
85+
};

include/CodeService/Format/Analyzer/AlignAnalyzer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22

3-
#include <unordered_map>
43
#include "CodeService/Format/Analyzer/FormatAnalyzer.h"
4+
#include <unordered_map>
55

66

77
class AlignAnalyzer : public FormatAnalyzer {
@@ -33,6 +33,8 @@ class AlignAnalyzer : public FormatAnalyzer {
3333

3434
void AnalyzeIfStatement(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t);
3535

36+
void AnalyzeChainExpr(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t);
37+
3638
void ResolveAlignGroup(FormatState &f, std::size_t groupIndex, AlignGroup &group, const LuaSyntaxTree &t);
3739

3840
void AnalyzeContinuousSimilarCallArgs(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t);

0 commit comments

Comments
 (0)