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 ));
0 commit comments