@@ -372,48 +372,76 @@ void AlignAnalyzer::AnalyzeParamList(FormatState &f, LuaSyntaxNode &syntaxNode,
372372 PushAlignGroup (AlignStrategy::AlignToFirst, group);
373373}
374374
375-
375+ // 需求真是复杂
376376void AlignAnalyzer::AnalyzeIfStatement (FormatState &f, LuaSyntaxNode &syntaxNode, const LuaSyntaxTree &t) {
377- auto ifExprs = syntaxNode.GetChildSyntaxNodes (LuaSyntaxNodeKind::BinaryExpression, t);
377+ auto if_ = syntaxNode.GetChildToken (TK_IF, t);
378+ auto elseifs = syntaxNode.GetChildTokens (TK_ELSEIF, t);
379+ std::vector<std::size_t > group;
380+
381+ // if 之后的表达式可以有多种对齐方式
382+ group.push_back (if_.GetNextToken (t).GetIndex ());
383+ auto ifCondition = if_.GetNextSibling (t);
378384 std::vector<LuaSyntaxNode> logicOps;
379- for (auto ifExpr: ifExprs) {
380- auto ops = helper::CollectBinaryOperator (ifExpr, t, [](LuaTokenKind kind) {
385+ std::size_t ifAlignPos = 0 ;
386+ if (ifCondition.GetSyntaxKind (t) == LuaSyntaxNodeKind::BinaryExpression) {
387+ auto ifConditionLogicOps = helper::CollectBinaryOperator (ifCondition, t, [](LuaTokenKind kind) {
381388 return kind == TK_AND || kind == TK_OR;
382389 });
383- for (auto op: ops) {
384- logicOps.push_back (op);
390+
391+ for (auto op: ifConditionLogicOps) {
392+ if (op.GetPrevToken (t).GetEndLine (t) != op.GetStartLine (t)) {
393+ if (op.GetTokenKind (t) == TK_AND) {
394+ ifAlignPos = std::max (ifAlignPos, 4u );
395+ } else if (op.GetTokenKind (t) == TK_OR) {
396+ ifAlignPos = std::max (ifAlignPos, 3u );
397+ }
398+ }
385399 }
400+ logicOps = ifConditionLogicOps;
386401 }
387402
388- std::size_t alignPos = 0 ;
389- auto elseifs = syntaxNode.GetChildTokens (TK_ELSEIF, t);
390- if (!elseifs.empty ()) {
391- alignPos = 7 ; // sizeof 'elseif '
392- } else {
393- alignPos = 3 ; // sizeof 'if '
394- for (auto &n: logicOps) {
395- if (n.GetTokenKind (t) == TK_AND) {
396- alignPos = 4 ; // sizeof 'and '
397- break ;
403+ // 如果仅仅if语句
404+ if (elseifs.empty ()) {
405+ if (ifAlignPos != 0 ) {
406+ for (auto &n: logicOps) {
407+ auto nextToken = n.GetNextToken (t);
408+ if (nextToken.IsToken (t)) {
409+ group.push_back (nextToken.GetIndex ());
410+ }
398411 }
412+ PushNormalAlignGroup (ifAlignPos, group);
413+ }
414+ return ;
415+ }
416+
417+ // 若有 elseif
418+
419+ auto spaceAfterIf = if_.GetNextToken (t).GetStartCol (t) - if_.GetStartCol (t);
420+ if (spaceAfterIf == 3 && ifAlignPos == 0 ){
421+ group.clear ();
422+ logicOps.clear ();
423+ }
424+
425+ ifAlignPos = 7 ;
426+
427+ for (auto elseif_: elseifs) {
428+ auto elseifCondition = elseif_.GetNextSibling (t);
429+ auto ops = helper::CollectBinaryOperator (elseifCondition, t, [](LuaTokenKind kind) {
430+ return kind == TK_AND || kind == TK_OR;
431+ });
432+ for (auto op: ops) {
433+ logicOps.push_back (op);
399434 }
400435 }
401436
402- std::vector<std::size_t > group;
403437 for (auto &n: logicOps) {
404438 auto nextToken = n.GetNextToken (t);
405439 if (nextToken.IsToken (t)) {
406440 group.push_back (nextToken.GetIndex ());
407441 }
408442 }
409- auto if_ = syntaxNode.GetChildToken (TK_IF, t);
410- group.push_back (if_.GetNextToken (t).GetIndex ());
411-
412- for (auto elseif_: elseifs) {
413- group.push_back (elseif_.GetNextToken (t).GetIndex ());
414- }
415443
416- PushNormalAlignGroup (alignPos , group);
444+ PushNormalAlignGroup (ifAlignPos , group);
417445}
418446
419447void AlignAnalyzer::PushNormalAlignGroup (std::size_t alignPos, std::vector<std::size_t > &data) {
0 commit comments