Skip to content

Commit 0616805

Browse files
committed
fix #98
1 parent 6c6a6a4 commit 0616805

File tree

5 files changed

+67
-25
lines changed

5 files changed

+67
-25
lines changed

CodeService/src/Format/Analyzer/IndentationAnalyzer.cpp

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "CodeService/Format/Analyzer/IndentationAnalyzer.h"
22
#include "CodeService/Format/FormatState.h"
33
#include "LuaParser/Lexer/LuaTokenTypeDetail.h"
4+
#include "LuaParser/Parse/LuaParser.h"
45

56
// 但是我不能这样做
67
//using enum LuaSyntaxNodeKind;
@@ -15,7 +16,7 @@ void IndentationAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
1516
if (syntaxNode.IsNode(t)) {
1617
switch (syntaxNode.GetSyntaxKind(t)) {
1718
case LuaSyntaxNodeKind::Block: {
18-
Indenter(syntaxNode, t);
19+
AddIndenter(syntaxNode, t);
1920
if (f.GetStyle().never_indent_comment_on_if_branch) {
2021
auto ifStmt = syntaxNode.GetParent(t);
2122
if (ifStmt.GetSyntaxKind(t) == LuaSyntaxNodeKind::IfStatement) {
@@ -41,7 +42,7 @@ void IndentationAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
4142
}
4243
auto commentLine = n.GetStartLine(t);
4344
if (commentLine + 1 == siblingLine) {
44-
Indenter(n, t, IndentData(IndentType::InvertIndentation));
45+
AddIndenter(n, t, IndentData(IndentType::InvertIndentation));
4546
siblingLine = commentLine;
4647
}
4748
}
@@ -51,7 +52,7 @@ void IndentationAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
5152
break;
5253
}
5354
case LuaSyntaxNodeKind::ParamList: {
54-
Indenter(syntaxNode, t);
55+
AddIndenter(syntaxNode, t);
5556
break;
5657
}
5758
case LuaSyntaxNodeKind::CallExpression: {
@@ -63,6 +64,14 @@ void IndentationAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
6364
}
6465
break;
6566
}
67+
case LuaSyntaxNodeKind::ParExpression: {
68+
auto expr = syntaxNode.GetChildSyntaxNode(MultiKind::Expression, t);
69+
if (expr.IsNode(t) && IsExprShouldIndent(expr, t)) {
70+
AddIndenter(expr, t);
71+
} else {
72+
AddIndenter(expr, t, IndentData(IndentType::WhenLineBreak));
73+
}
74+
}
6675
case LuaSyntaxNodeKind::LocalStatement:
6776
case LuaSyntaxNodeKind::AssignStatement:
6877
case LuaSyntaxNodeKind::ReturnStatement: {
@@ -76,15 +85,15 @@ void IndentationAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
7685
case LuaSyntaxNodeKind::RepeatStatement: {
7786
auto expr = syntaxNode.GetChildSyntaxNode(MultiKind::Expression, t);
7887
if (expr.IsNode(t)) {
79-
Indenter(expr, t);
88+
AddIndenter(expr, t);
8089
}
8190
break;
8291
}
8392
case LuaSyntaxNodeKind::IfStatement: {
8493
if (!f.GetStyle().never_indent_before_if_condition) {
8594
auto exprs = syntaxNode.GetChildSyntaxNodes(MultiKind::Expression, t);
8695
for (auto expr: exprs) {
87-
Indenter(expr, t, IndentData(
96+
AddIndenter(expr, t, IndentData(
8897
IndentType::Standard,
8998
f.GetStyle().continuation_indent
9099
));
@@ -97,14 +106,14 @@ void IndentationAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
97106

98107
for (auto expr: suffixedExpression.GetChildren(t)) {
99108
if (expr.GetSyntaxKind(t) == LuaSyntaxNodeKind::IndexExpression) {
100-
Indenter(expr, t, IndentData(
109+
AddIndenter(expr, t, IndentData(
101110
IndentType::Standard,
102111
f.GetStyle().continuation_indent
103112
));
104113
} else if (expr.GetSyntaxKind(t) == LuaSyntaxNodeKind::CallExpression) {
105114
auto prevSibling = expr.GetPrevSibling(t);
106115
if (prevSibling.GetSyntaxKind(t) != LuaSyntaxNodeKind::NameExpression) {
107-
Indenter(expr, t, IndentData(
116+
AddIndenter(expr, t, IndentData(
108117
IndentType::WhenPrevIndent,
109118
f.GetStyle().continuation_indent
110119
));
@@ -116,7 +125,7 @@ void IndentationAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
116125
case LuaSyntaxNodeKind::TableExpression: {
117126
auto tableFieldList = syntaxNode.GetChildSyntaxNode(LuaSyntaxNodeKind::TableFieldList, t);
118127
for (auto field: tableFieldList.GetChildren(t)) {
119-
Indenter(field, t, IndentData(
128+
AddIndenter(field, t, IndentData(
120129
IndentType::WhenLineBreak,
121130
f.GetStyle().indent_style == IndentStyle::Space ?
122131
f.GetStyle().indent_size : f.GetStyle().tab_width
@@ -136,14 +145,14 @@ void IndentationAnalyzer::Analyze(FormatState &f, const LuaSyntaxTree &t) {
136145

137146
for (auto expr: suffixedExpression.GetChildren(t)) {
138147
if (expr.GetSyntaxKind(t) == LuaSyntaxNodeKind::IndexExpression) {
139-
Indenter(expr, t, IndentData(
148+
AddIndenter(expr, t, IndentData(
140149
IndentType::Standard,
141150
f.GetStyle().continuation_indent
142151
));
143152
} else if (expr.GetSyntaxKind(t) == LuaSyntaxNodeKind::CallExpression) {
144153
auto prevSibling = expr.GetPrevSibling(t);
145154
if (prevSibling.GetSyntaxKind(t) != LuaSyntaxNodeKind::NameExpression) {
146-
Indenter(expr, t, IndentData(
155+
AddIndenter(expr, t, IndentData(
147156
IndentType::WhenPrevIndent,
148157
f.GetStyle().continuation_indent
149158
));
@@ -195,7 +204,7 @@ IndentationAnalyzer::Query(FormatState &f, LuaSyntaxNode &n, const LuaSyntaxTree
195204
}
196205
}
197206

198-
void IndentationAnalyzer::Indenter(LuaSyntaxNode &n, const LuaSyntaxTree &t, IndentData indentData) {
207+
void IndentationAnalyzer::AddIndenter(LuaSyntaxNode &n, const LuaSyntaxTree &t, IndentData indentData) {
199208
_indent[n.GetIndex()] = indentData;
200209
}
201210

@@ -239,7 +248,7 @@ void IndentationAnalyzer::AnalyzeExprList(FormatState &f, LuaSyntaxNode &exprLis
239248
}
240249
}
241250

242-
Indenter(exprList, t, IndentData(
251+
AddIndenter(exprList, t, IndentData(
243252
IndentType::Standard,
244253
f.GetStyle().continuation_indent
245254
));
@@ -257,7 +266,9 @@ void IndentationAnalyzer::AnalyzeCallExprList(FormatState &f, LuaSyntaxNode &exp
257266
}
258267

259268
if (shouldIndent) {
260-
Indenter(exprList, t, IndentData(IndentType::Standard));
269+
AddIndenter(exprList, t, IndentData(IndentType::Standard));
270+
} else {
271+
AddIndenter(exprList, t, IndentData(IndentType::WhenLineBreak));
261272
}
262273
}
263274

@@ -276,7 +287,8 @@ bool IndentationAnalyzer::IsExprShouldIndent(LuaSyntaxNode &expr, const LuaSynta
276287
case LuaSyntaxNodeKind::ClosureExpression:
277288
case LuaSyntaxNodeKind::TableExpression:
278289
case LuaSyntaxNodeKind::StringLiteralExpression:
279-
case LuaSyntaxNodeKind::NameExpression: {
290+
case LuaSyntaxNodeKind::NameExpression:
291+
case LuaSyntaxNodeKind::ParExpression: {
280292
break;
281293
}
282294
case LuaSyntaxNodeKind::SuffixedExpression: {
@@ -288,7 +300,6 @@ bool IndentationAnalyzer::IsExprShouldIndent(LuaSyntaxNode &expr, const LuaSynta
288300
}
289301
break;
290302
}
291-
case LuaSyntaxNodeKind::ParExpression:
292303
case LuaSyntaxNodeKind::UnaryExpression: {
293304
auto subExpr = expr.GetChildSyntaxNode(LuaSyntaxMultiKind::Expression, t);
294305
if (subExpr.IsNode(t)) {
@@ -300,7 +311,8 @@ bool IndentationAnalyzer::IsExprShouldIndent(LuaSyntaxNode &expr, const LuaSynta
300311
for (auto childNode: expr.GetChildren(t)) {
301312
if (childNode.IsNode(t) && IsExprShouldIndent(childNode, t)) {
302313
return true;
303-
} else if (childNode.GetStartLine(t) != symbolLine) {
314+
} else if (LuaParser::GetBinaryOperator(childNode.GetTokenKind(t)) != BinOpr::OPR_NOBINOPR
315+
&& childNode.GetPrevToken(t).GetEndLine(t) != childNode.GetStartLine(t)) {
304316
return true;
305317
}
306318
}
@@ -323,7 +335,7 @@ IndentationAnalyzer::AnalyzeTableFieldKeyValuePairExpr(FormatState &f, LuaSyntax
323335
}
324336

325337
if (IsExprShouldIndent(expr, t)) {
326-
Indenter(expr, t, IndentData(
338+
AddIndenter(expr, t, IndentData(
327339
IndentType::Standard,
328340
f.GetStyle().continuation_indent
329341
));

Test/src/FormatResult_unitest.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,4 +794,34 @@ local a2 = aaa.p(function()
794794
end)
795795
:okok()
796796
)", s));
797+
}
798+
799+
TEST(Format, codestyle_98) {
800+
EXPECT_TRUE(TestHelper::TestFormatted(
801+
R"(
802+
local function t(entry, item)
803+
item.dup = ({
804+
aa = 0
805+
})[entry.name] or 0
806+
807+
item.dup2 = ({
808+
aa = 0,
809+
})[entry.name]
810+
811+
return item
812+
end
813+
)",
814+
R"(
815+
local function t(entry, item)
816+
item.dup = ({
817+
aa = 0
818+
})[entry.name] or 0
819+
820+
item.dup2 = ({
821+
aa = 0,
822+
})[entry.name]
823+
824+
return item
825+
end
826+
)"));
797827
}

Test2/src/FormatTest2.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77

88
int main() {
99
std::string buffer = R"(
10-
local t = {
11-
aaa = 123,
12-
bbbbbbbb = 456
13-
}
10+
(
11+
aa
12+
).aa =123
13+
1414
)";
1515

1616
auto file = std::make_shared<LuaFile>(std::move(buffer));
@@ -25,7 +25,6 @@ local t = {
2525
std::cout << t.GetDebugView() << std::endl;
2626

2727
LuaStyle s;
28-
s.align_continuous_rect_table_field = ContinuousAlign::Always;
2928
FormatBuilder b(s);
3029
auto text = b.GetFormatResult(t);
3130
std::cout<< text << std::endl;

include/CodeService/Format/Analyzer/IndentationAnalyzer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class IndentationAnalyzer : public FormatAnalyzer {
2323

2424
void Query(FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t, FormatResolve &resolve) override;
2525

26-
void Indenter(LuaSyntaxNode &n, const LuaSyntaxTree &t, IndentData indentData = IndentData());
26+
void AddIndenter(LuaSyntaxNode &n, const LuaSyntaxTree &t, IndentData indentData = IndentData());
2727

2828
// 在格式化过程中标记Token缩进
2929
void MarkIndent(LuaSyntaxNode &n, const LuaSyntaxTree &t);

include/LuaParser/Parse/LuaParser.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
class LuaParser
1414
{
1515
public:
16+
static BinOpr GetBinaryOperator(LuaTokenKind op);
17+
1618
LuaParser(std::shared_ptr<LuaFile> luaFile, std::vector<LuaToken>&& tokens);
1719

1820
bool Parse();
@@ -28,7 +30,6 @@ class LuaParser
2830
std::shared_ptr<LuaFile> GetLuaFile();
2931

3032
Marker Mark();
31-
3233
private:
3334
void Next();
3435

@@ -126,7 +127,7 @@ class LuaParser
126127

127128
UnOpr GetUnaryOperator(LuaTokenKind op);
128129

129-
BinOpr GetBinaryOperator(LuaTokenKind op);
130+
130131

131132
/*
132133
* 他是检查当前token的type是否与c相同

0 commit comments

Comments
 (0)