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
88AlignAnalyzer::AlignAnalyzer () {
9-
109}
1110
1211void 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
193194bool 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
198198void 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+
538546void 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
553559void AlignAnalyzer::AnalyzeInlineComment (FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
0 commit comments