@@ -554,6 +554,96 @@ void AlignAnalyzer::PushNormalAlignGroup(std::size_t alignPos, std::vector<std::
554554}
555555
556556void AlignAnalyzer::AnalyzeContinuousSimilarCallArgs (FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
557+ auto exprStmts = syntaxNode.GetChildSyntaxNodes (LuaSyntaxNodeKind::ExpressionStatement, t);
558+ std::size_t lastLine = 0 ;
559+ std::size_t prefixLen = 0 ;
560+ std::vector<LuaSyntaxNode> group;
561+
562+ for (auto stmt: exprStmts) {
563+ auto suffix = stmt.GetChildSyntaxNode (LuaSyntaxNodeKind::SuffixedExpression, t);
564+ auto callexpr = suffix.GetLastChildSyntaxNode (LuaSyntaxNodeKind::CallExpression, t);
565+ auto isSimpleStmt = stmt.IsSingleLineNode (t);
566+
567+ if (group.empty () && isSimpleStmt) {
568+ group.push_back (callexpr);
569+ prefixLen = callexpr.GetStartCol (t) - stmt.GetStartCol (t);
570+ lastLine = callexpr.GetEndLine (t);
571+ continue ;
572+ }
573+
574+ if (isSimpleStmt) {
575+ auto line = callexpr.GetStartLine (t);
576+ auto stmtPrefixLen = callexpr.GetStartCol (t) - stmt.GetStartCol (t);
577+ if (line - lastLine <= f.GetStyle ().align_continuous_line_space && stmtPrefixLen == prefixLen) {
578+ group.push_back (callexpr);
579+ } else {
580+ if (group.size () > 1 ) {
581+ AnalyzeSimilarCallAlign (f, group, prefixLen, t);
582+ }
583+ group.clear ();
584+ group.push_back (callexpr);
585+ }
586+ prefixLen = stmtPrefixLen;
587+ lastLine = callexpr.GetEndLine (t);
588+ } else if (group.size () > 1 ) {
589+ AnalyzeSimilarCallAlign (f, group, prefixLen, t);
590+ group.clear ();
591+ } else {
592+ group.clear ();
593+ }
594+ }
595+
596+ if (group.size () > 1 ) {
597+ AnalyzeSimilarCallAlign (f, group, prefixLen, t);
598+ }
599+ }
600+
601+ void AlignAnalyzer::AnalyzeSimilarCallAlign (FormatState &f, std::vector<LuaSyntaxNode> &callExprs, std::size_t prefixLen, const LuaSyntaxTree &t) {
602+ std::vector<std::vector<LuaSyntaxNode>> argsVec;
603+ std::size_t maxAlign = 0 ;
604+ for (auto &callExpr: callExprs) {
605+ auto argExprList = callExpr.GetChildSyntaxNode (LuaSyntaxNodeKind::ExpressionList, t);
606+ auto args = argExprList.GetChildSyntaxNodes (LuaSyntaxMultiKind::Expression, t);
607+ if (args.size () > maxAlign) {
608+ maxAlign = args.size ();
609+ }
610+ argsVec.push_back (std::move (args));
611+ }
612+
613+ std::vector<std::size_t > group;
614+ std::size_t alignPos = prefixLen + 1 ;
615+ if (f.GetStyle ().space_inside_function_call_parentheses ) {
616+ alignPos++;
617+ }
618+
619+ std::size_t elementLength = 0 ;
620+ for (std::size_t i = 0 ; i < maxAlign; i++) {
621+ for (auto &args: argsVec) {
622+ if (i < args.size ()) {
623+ auto text = args[i].GetText (t);
624+ if (elementLength < text.size ()) {
625+ elementLength = text.size ();
626+ }
627+ group.push_back (args[i].GetFirstToken (t).GetIndex ());
628+ }
629+ }
630+ PushNormalAlignGroup (alignPos, group);
631+ alignPos += elementLength;
632+ if (i + 1 == maxAlign) {
633+ if (f.GetStyle ().space_inside_function_call_parentheses ) {
634+ alignPos++;
635+ }
636+ } else {
637+ if (f.GetStyle ().space_after_comma ) {
638+ alignPos += 2 ;
639+ } else {
640+ alignPos++;
641+ }
642+ }
643+
644+ elementLength = 0 ;
645+ group.clear ();
646+ }
557647}
558648
559649void AlignAnalyzer::AnalyzeInlineComment (FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
0 commit comments