Skip to content

Commit 6c6a6a4

Browse files
committed
实现对齐 '}' 实现总是对齐table field 和assign的选项
1 parent f88f5e8 commit 6c6a6a4

File tree

8 files changed

+167
-47
lines changed

8 files changed

+167
-47
lines changed

CodeService/src/Config/LuaStyle.cpp

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ void LuaStyle::ParseFromMap(std::map<std::string, std::string, std::less<>> &con
118118
BOOL_OPTION(space_before_closure_open_parenthesis)
119119

120120
if (configMap.count("space_before_function_call_single_arg")) {
121-
auto & value = configMap.at("space_before_function_call_single_arg");
121+
auto &value = configMap.at("space_before_function_call_single_arg");
122122
if (value == "true" || value == "always") {
123123
space_before_function_call_single_arg = FunctionSingleArgSpace::Always;
124124
} else if (value == "only_string") {
@@ -157,13 +157,43 @@ void LuaStyle::ParseFromMap(std::map<std::string, std::string, std::less<>> &con
157157

158158
BOOL_OPTION(align_function_params)
159159

160-
BOOL_OPTION(align_continuous_assign_statement)
160+
if (configMap.count("align_continuous_assign_statement")) {
161+
if (configMap.at("align_continuous_assign_statement") == "true"
162+
|| configMap.at("align_continuous_assign_statement") == "when_extra_space") {
163+
align_continuous_assign_statement = ContinuousAlign::WhenExtraSpace;
164+
} else if (configMap.at("align_continuous_assign_statement") == "always") {
165+
align_continuous_assign_statement = ContinuousAlign::Always;
166+
} else if (configMap.at("align_continuous_assign_statement") == "false"
167+
|| configMap.at("align_continuous_assign_statement") == "none") {
168+
align_continuous_assign_statement = ContinuousAlign::None;
169+
}
170+
}
161171

162-
BOOL_OPTION(align_continuous_rect_table_field)
172+
if (configMap.count("align_continuous_rect_table_field")) {
173+
if (configMap.at("align_continuous_rect_table_field") == "true"
174+
|| configMap.at("align_continuous_rect_table_field") == "when_extra_space") {
175+
align_continuous_rect_table_field = ContinuousAlign::WhenExtraSpace;
176+
} else if (configMap.at("align_continuous_rect_table_field") == "always") {
177+
align_continuous_rect_table_field = ContinuousAlign::Always;
178+
} else if (configMap.at("align_continuous_rect_table_field") == "false"
179+
|| configMap.at("align_continuous_rect_table_field") == "none") {
180+
align_continuous_rect_table_field = ContinuousAlign::None;
181+
}
182+
}
163183

164184
BOOL_OPTION(align_if_branch)
165185

166-
BOOL_OPTION(align_array_table)
186+
if (configMap.count("align_array_table")) {
187+
if (configMap.at("align_array_table") == "true"
188+
|| configMap.at("align_array_table") == "normal") {
189+
align_array_table = AlignArrayTable::Normal;
190+
} else if (configMap.at("align_array_table") == "contain_curly") {
191+
align_array_table = AlignArrayTable::ContainCurly;
192+
} else if (configMap.at("align_array_table") == "false"
193+
|| configMap.at("align_array_table") == "none") {
194+
align_array_table = AlignArrayTable::None;
195+
}
196+
}
167197

168198
BOOL_OPTION(align_continuous_inline_comment)
169199

@@ -195,22 +225,19 @@ void LuaStyle::ParseFromMap(std::map<std::string, std::string, std::less<>> &con
195225

196226
if (option.GetKey() == "keep") {
197227
lineOption.second = LineSpace(LineSpaceType::Keep);
198-
}
199-
else if(option.GetKey() == "min") {
228+
} else if (option.GetKey() == "min") {
200229
auto p1 = option.GetParam(0);
201-
if(!p1.empty() && IsNumber(p1)) {
230+
if (!p1.empty() && IsNumber(p1)) {
202231
lineOption.second = LineSpace(LineSpaceType::Min, std::stoi(p1));
203232
}
204-
}
205-
else if(option.GetKey() == "fixed") {
233+
} else if (option.GetKey() == "fixed") {
206234
auto p1 = option.GetParam(0);
207-
if(!p1.empty() && IsNumber(p1)) {
235+
if (!p1.empty() && IsNumber(p1)) {
208236
lineOption.second = LineSpace(LineSpaceType::Fixed, std::stoi(p1));
209237
}
210-
}
211-
else if(option.GetKey() == "max") {
238+
} else if (option.GetKey() == "max") {
212239
auto p1 = option.GetParam(0);
213-
if(!p1.empty() && IsNumber(p1)) {
240+
if (!p1.empty() && IsNumber(p1)) {
214241
lineOption.second = LineSpace(LineSpaceType::Max, std::stoi(p1));
215242
}
216243
}

CodeService/src/Format/Analyzer/AlignAnalyzer.cpp

Lines changed: 57 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ void AlignAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
1515
if (syntaxNode.IsNode(t)) {
1616
switch (syntaxNode.GetSyntaxKind(t)) {
1717
case LuaSyntaxNodeKind::Block: {
18-
if (f.GetStyle().align_continuous_assign_statement) {
18+
if (f.GetStyle().align_continuous_assign_statement != ContinuousAlign::None) {
1919
AnalyzeContinuousLocalOrAssign(f, syntaxNode, t);
2020
}
2121
if (f.GetStyle().align_continuous_similar_call_args) {
@@ -25,10 +25,10 @@ void AlignAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
2525
break;
2626
}
2727
case LuaSyntaxNodeKind::TableFieldList: {
28-
if (f.GetStyle().align_continuous_rect_table_field) {
28+
if (f.GetStyle().align_continuous_rect_table_field != ContinuousAlign::None) {
2929
AnalyzeContinuousRectField(f, syntaxNode, t);
3030
}
31-
if (f.GetStyle().align_array_table) {
31+
if (f.GetStyle().align_array_table != AlignArrayTable::None) {
3232
AnalyzeContinuousArrayTableField(f, syntaxNode, t);
3333
}
3434
break;
@@ -100,7 +100,8 @@ void AlignAnalyzer::Query(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSy
100100
auto &alignGroup = _alignGroup[alignGroupIndex];
101101
switch (alignGroup.Strategy) {
102102
case AlignStrategy::Normal:
103-
case AlignStrategy::AlignToEq: {
103+
case AlignStrategy::AlignToEqWhenExtraSpace:
104+
case AlignStrategy::AlignToEqAlways: {
104105
resolve.SetRelativeIndentAlign(alignGroup.AlignPos);
105106
break;
106107
}
@@ -133,6 +134,11 @@ AlignAnalyzer::AnalyzeContinuousLocalOrAssign(FormatState &f, LuaSyntaxNode &syn
133134
auto children = syntaxNode.GetChildren(t);
134135
std::size_t lastLine = 0;
135136
std::vector<std::size_t> group;
137+
auto strategy = AlignStrategy::AlignToEqWhenExtraSpace;
138+
if (f.GetStyle().align_continuous_assign_statement == ContinuousAlign::Always) {
139+
strategy = AlignStrategy::AlignToEqAlways;
140+
}
141+
136142
for (auto stmt: children) {
137143
auto kind = stmt.GetSyntaxKind(t);
138144
if (group.empty()) {
@@ -148,7 +154,7 @@ AlignAnalyzer::AnalyzeContinuousLocalOrAssign(FormatState &f, LuaSyntaxNode &syn
148154
auto line = stmt.GetStartLine(t);
149155
if (line - lastLine > 2) {
150156
if (group.size() > 1) {
151-
PushAlignGroup(AlignStrategy::AlignToEq, group);
157+
PushAlignGroup(strategy, group);
152158
}
153159
group.clear();
154160
} else {
@@ -164,23 +170,23 @@ AlignAnalyzer::AnalyzeContinuousLocalOrAssign(FormatState &f, LuaSyntaxNode &syn
164170
group.push_back(stmt.GetIndex());
165171
} else {
166172
if (group.size() > 1) {
167-
PushAlignGroup(AlignStrategy::AlignToEq, group);
173+
PushAlignGroup(strategy, group);
168174
}
169175
group.clear();
170176
group.push_back(stmt.GetIndex());
171177
}
172178

173179
lastLine = stmt.GetEndLine(t);
174180
} else if (group.size() > 1) {
175-
PushAlignGroup(AlignStrategy::AlignToEq, group);
181+
PushAlignGroup(strategy, group);
176182
group.clear();
177183
} else {
178184
group.clear();
179185
}
180186
}
181187

182188
if (group.size() > 1) {
183-
PushAlignGroup(AlignStrategy::AlignToEq, group);
189+
PushAlignGroup(strategy, group);
184190
}
185191
}
186192

@@ -193,6 +199,11 @@ void AlignAnalyzer::AnalyzeContinuousRectField(FormatState &f, LuaSyntaxNode &sy
193199
auto children = syntaxNode.GetChildren(t);
194200
std::size_t lastLine = 0;
195201
std::vector<std::size_t> group;
202+
auto strategy = AlignStrategy::AlignToEqWhenExtraSpace;
203+
if (f.GetStyle().align_continuous_rect_table_field == ContinuousAlign::Always) {
204+
strategy = AlignStrategy::AlignToEqAlways;
205+
}
206+
196207
for (auto field: children) {
197208
auto line = field.GetStartLine(t);
198209
if (line < lastLine) {
@@ -211,7 +222,7 @@ void AlignAnalyzer::AnalyzeContinuousRectField(FormatState &f, LuaSyntaxNode &sy
211222
if (tokenKind == TK_SHORT_COMMENT) {
212223
if (line - lastLine > 2) {
213224
if (group.size() > 1) {
214-
PushAlignGroup(AlignStrategy::AlignToEq, group);
225+
PushAlignGroup(strategy, group);
215226
}
216227
group.clear();
217228
} else {
@@ -230,23 +241,23 @@ void AlignAnalyzer::AnalyzeContinuousRectField(FormatState &f, LuaSyntaxNode &sy
230241
group.push_back(field.GetIndex());
231242
} else {
232243
if (group.size() > 1) {
233-
PushAlignGroup(AlignStrategy::AlignToEq, group);
244+
PushAlignGroup(strategy, group);
234245
}
235246
group.clear();
236247
group.push_back(field.GetIndex());
237248
}
238249

239250
lastLine = field.GetEndLine(t);
240251
} else if (group.size() > 1) {
241-
PushAlignGroup(AlignStrategy::AlignToEq, group);
252+
PushAlignGroup(strategy, group);
242253
group.clear();
243254
} else {
244255
group.clear();
245256
}
246257
}
247258

248259
if (group.size() > 1) {
249-
PushAlignGroup(AlignStrategy::AlignToEq, group);
260+
PushAlignGroup(strategy, group);
250261
}
251262
}
252263

@@ -318,18 +329,32 @@ AlignAnalyzer::AnalyzeArrayTableAlign(FormatState &f, std::vector<LuaSyntaxNode>
318329
}
319330
PushNormalAlignGroup(alignPos, group);
320331
alignPos += elementLength;
321-
if (f.GetStyle().space_after_comma) {
322-
alignPos++;
332+
if (i + 1 == maxAlign) {
333+
if (f.GetStyle().space_around_table_field_list) {
334+
alignPos++;
335+
}
336+
} else {
337+
if (f.GetStyle().space_after_comma) {
338+
alignPos++;
339+
}
323340
}
341+
324342
elementLength = 0;
325343
group.clear();
326344
}
345+
346+
if (f.GetStyle().align_array_table == AlignArrayTable::ContainCurly) {
347+
for (auto table: arrayTable) {
348+
group.push_back(table.GetChildToken('}', t).GetIndex());
349+
}
350+
PushNormalAlignGroup(alignPos, group);
351+
}
327352
}
328353

329354
void
330355
AlignAnalyzer::ResolveAlignGroup(FormatState &f, std::size_t groupIndex, AlignGroup &group, const LuaSyntaxTree &t) {
331356
switch (group.Strategy) {
332-
case AlignStrategy::AlignToEq: {
357+
case AlignStrategy::AlignToEqWhenExtraSpace: {
333358
bool allowAlign = false;
334359
for (auto i: group.SyntaxGroup) {
335360
auto node = LuaSyntaxNode(i);
@@ -360,6 +385,23 @@ AlignAnalyzer::ResolveAlignGroup(FormatState &f, std::size_t groupIndex, AlignGr
360385
}
361386
break;
362387
}
388+
case AlignStrategy::AlignToEqAlways: {
389+
std::size_t maxDis = 0;
390+
for (auto i: group.SyntaxGroup) {
391+
auto node = LuaSyntaxNode(i);
392+
auto eq = node.GetChildToken('=', t);
393+
if (eq.IsToken(t)) {
394+
auto prev = eq.GetPrevToken(t);
395+
auto newPos = prev.GetTextRange(t).GetEndOffset() + 2 - node.GetTextRange(t).StartOffset;
396+
if (newPos > maxDis) {
397+
maxDis = newPos;
398+
}
399+
_resolveGroupIndex[eq.GetIndex()] = groupIndex;
400+
}
401+
}
402+
group.AlignPos = maxDis;
403+
break;
404+
}
363405
case AlignStrategy::AlignToFirst: {
364406
if (!f.IsNewLine()) {
365407
auto width = f.GetCurrentWidth();

CodeService/src/Format/Analyzer/LineBreakAnalyzer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ void LineBreakAnalyzer::AnalyzeExpr(FormatState &f, LuaSyntaxNode &expr, const L
350350
if (forceBreak) {
351351
BreakAfter(expr.GetChildToken('{', t), t);
352352
for (auto field: fields) {
353-
BreakAfter(field, t);
353+
BreakAfter(field, t, LineSpace(LineSpaceType::Keep));
354354
}
355355
} else {
356356
for (auto field: fields) {

Test/src/FormatStyle_unitest.cpp

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ end
840840
TEST(FormatByStyleOption, align_continuous_assign_statement) {
841841
LuaStyle style;
842842

843-
style.align_continuous_assign_statement = false;
843+
style.align_continuous_assign_statement = ContinuousAlign::None;
844844
EXPECT_TRUE(TestHelper::TestFormatted(
845845
R"(
846846
local t = 123
@@ -850,7 +850,7 @@ local dddd = 456
850850
local t = 123
851851
local dddd = 456
852852
)", style));
853-
style.align_continuous_assign_statement = true;
853+
style.align_continuous_assign_statement = ContinuousAlign::WhenExtraSpace;
854854
EXPECT_TRUE(TestHelper::TestFormatted(
855855
R"(
856856
local t = 123
@@ -859,13 +859,23 @@ local dddd = 456
859859
R"(
860860
local t = 123
861861
local dddd = 456
862+
)", style));
863+
style.align_continuous_assign_statement = ContinuousAlign::Always;
864+
EXPECT_TRUE(TestHelper::TestFormatted(
865+
R"(
866+
local t = 123
867+
local dddd = 456
868+
)",
869+
R"(
870+
local t = 123
871+
local dddd = 456
862872
)", style));
863873
}
864874

865875
TEST(FormatByStyleOption, align_continuous_rect_table_field) {
866876
LuaStyle style;
867877

868-
style.align_continuous_rect_table_field = false;
878+
style.align_continuous_rect_table_field = ContinuousAlign::None;
869879
EXPECT_TRUE(TestHelper::TestFormatted(
870880
R"(
871881
local t = {
@@ -879,7 +889,7 @@ local t = {
879889
bbbbbbbb = 456
880890
}
881891
)", style));
882-
style.align_continuous_rect_table_field = true;
892+
style.align_continuous_rect_table_field = ContinuousAlign::WhenExtraSpace;
883893
EXPECT_TRUE(TestHelper::TestFormatted(
884894
R"(
885895
local t = {
@@ -892,6 +902,20 @@ local t = {
892902
aaa = 123,
893903
bbbbbbbb = 456
894904
}
905+
)", style));
906+
style.align_continuous_rect_table_field = ContinuousAlign::Always;
907+
EXPECT_TRUE(TestHelper::TestFormatted(
908+
R"(
909+
local t = {
910+
aaa = 123,
911+
bbbbbbbb = 456
912+
}
913+
)",
914+
R"(
915+
local t = {
916+
aaa = 123,
917+
bbbbbbbb = 456
918+
}
895919
)", style));
896920
}
897921

@@ -956,7 +980,7 @@ end
956980
TEST(FormatByStyleOption, align_array_table) {
957981
LuaStyle style;
958982

959-
style.align_array_table = false;
983+
style.align_array_table = AlignArrayTable::None;
960984
EXPECT_TRUE(TestHelper::TestFormatted(
961985
R"(
962986
local t = {
@@ -974,7 +998,7 @@ local t = {
974998
{ 1, 2, 3 },
975999
}
9761000
)", style));
977-
style.align_array_table = true;
1001+
style.align_array_table = AlignArrayTable::Normal;
9781002
EXPECT_TRUE(TestHelper::TestFormatted(
9791003
R"(
9801004
local t = {
@@ -991,6 +1015,24 @@ local t = {
9911015
{ a, b, c, d },
9921016
{ 1, 2, 3 },
9931017
}
1018+
)", style));
1019+
style.align_array_table = AlignArrayTable::ContainCurly;
1020+
EXPECT_TRUE(TestHelper::TestFormatted(
1021+
R"(
1022+
local t = {
1023+
{ "fwfwf", njqoifjiowiof, 121313 },
1024+
{ "fwfw", fjwofw, wngjwoigw },
1025+
{ a, b, c, d },
1026+
{ 1, 2, 3 },
1027+
}
1028+
)",
1029+
R"(
1030+
local t = {
1031+
{ "fwfwf", njqoifjiowiof, 121313 },
1032+
{ "fwfw", fjwofw, wngjwoigw },
1033+
{ a, b, c, d },
1034+
{ 1, 2, 3 },
1035+
}
9941036
)", style));
9951037
}
9961038

0 commit comments

Comments
 (0)