@@ -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
329354void
330355AlignAnalyzer::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 ();
0 commit comments