238 auto enter = [
this](StateType newState) {
this->enterState(newState); };
240 auto leave = [
this](
bool statementDone =
false) {
this->leaveState(statementDone
); };
242 auto turnInto = [
this](StateType newState) {
this->turnIntoState(newState); };
244 qCDebug(formatterLog) <<
"Starting to look at " << line;
246 for (; tokenIndex < lineTokens.size();) {
248 const int kind = currentToken.lexKind;
250 qCDebug(formatterLog) <<
"Token: " << tokenText(currentToken);
252 if (Token::lexKindIsComment(kind)
253 && currentStatus.state().type != StateType::MultilineCommentCont
254 && currentStatus.state().type != StateType::MultilineCommentStart) {
259 switch (currentStatus.state().type) {
260 case StateType::TopmostIntro:
262 case QQmlJSGrammar::T_IDENTIFIER:
263 enter(StateType::ObjectdefinitionOrJs);
265 case QQmlJSGrammar::T_PRAGMA:
266 case QQmlJSGrammar::T_IMPORT:
267 enter(StateType::TopQml);
269 case QQmlJSGrammar::T_LBRACE:
270 enter(StateType::TopJs);
271 enter(StateType::Expression);
274 enter(StateType::TopJs);
279 case StateType::TopQml:
281 case QQmlJSGrammar::T_PRAGMA:
282 enter(StateType::PragmaStart);
284 case QQmlJSGrammar::T_IMPORT:
285 enter(StateType::ImportStart);
287 case QQmlJSGrammar::T_IDENTIFIER:
288 enter(StateType::BindingOrObjectdefinition);
292 enter(StateType::BindingOrObjectdefinition);
297 case StateType::TopJs:
301 case StateType::ObjectdefinitionOrJs:
303 case QQmlJSGrammar::T_DOT:
305 case QQmlJSGrammar::T_LBRACE:
306 turnInto(StateType::BindingOrObjectdefinition);
309 if (!Token::lexKindIsIdentifier(kind) || !line.at(currentToken.begin()).isUpper()) {
310 turnInto(StateType::TopJs);
316 case StateType::PragmaStart:
318 case QQmlJSGrammar::T_IDENTIFIER:
319 turnInto(StateType::PragmaMaybeValue);
326 case StateType::PragmaMaybeValue:
328 case QQmlJSGrammar::T_COLON:
329 turnInto(StateType::PragmaValue);
336 case StateType::PragmaValue:
338 case QQmlJSGrammar::T_IDENTIFIER:
339 case QQmlJSGrammar::T_STRING_LITERAL:
340 turnInto(StateType::PragmaMaybeMoreValues);
347 case StateType::PragmaMaybeMoreValues:
349 case QQmlJSGrammar::T_COMMA:
350 turnInto(StateType::PragmaValue);
358 case StateType::ImportStart:
359 enter(StateType::ImportMaybeDotOrVersionOrAs);
362 case StateType::ImportMaybeDotOrVersionOrAs:
364 case QQmlJSGrammar::T_DOT:
365 turnInto(StateType::ImportDot);
367 case QQmlJSGrammar::T_AS:
368 turnInto(StateType::ImportAs);
370 case QQmlJSGrammar::T_NUMERIC_LITERAL:
371 case QQmlJSGrammar::T_VERSION_NUMBER:
372 turnInto(StateType::ImportMaybeAs);
381 case StateType::ImportMaybeAs:
383 case QQmlJSGrammar::T_AS:
384 turnInto(StateType::ImportAs);
393 case StateType::ImportDot:
395 turnInto(StateType::ImportMaybeDotOrVersionOrAs);
403 case StateType::ImportAs:
410 case StateType::BindingOrObjectdefinition:
412 case QQmlJSGrammar::T_COLON:
413 enter(StateType::BindingAssignment);
415 case QQmlJSGrammar::T_LBRACE:
416 enter(StateType::ObjectdefinitionOpen);
421 case StateType::BindingAssignment:
423 case QQmlJSGrammar::T_AUTOMATIC_SEMICOLON:
424 case QQmlJSGrammar::T_COMPATIBILITY_SEMICOLON:
425 case QQmlJSGrammar::T_SEMICOLON:
428 case QQmlJSGrammar::T_IF:
429 enter(StateType::IfStatement);
431 case QQmlJSGrammar::T_WITH:
432 enter(StateType::StatementWithCondition);
434 case QQmlJSGrammar::T_TRY:
435 enter(StateType::TryStatement);
437 case QQmlJSGrammar::T_SWITCH:
438 enter(StateType::SwitchStatement);
440 case QQmlJSGrammar::T_LBRACE:
441 enter(StateType::JsblockOpen);
443 case QQmlJSGrammar::T_ON:
444 case QQmlJSGrammar::T_AS:
445 case QQmlJSGrammar::T_IMPORT:
446 case QQmlJSGrammar::T_SIGNAL:
447 case QQmlJSGrammar::T_PROPERTY:
448 case QQmlJSGrammar::T_REQUIRED:
449 case QQmlJSGrammar::T_READONLY:
450 case QQmlJSGrammar::T_IDENTIFIER:
451 enter(StateType::ExpressionOrObjectdefinition);
455 case QQmlJSGrammar::T_RBRACKET:
456 case QQmlJSGrammar::T_RPAREN:
461 enter(StateType::Expression);
466 case StateType::ObjectdefinitionOpen:
468 case QQmlJSGrammar::T_RBRACE:
471 case QQmlJSGrammar::T_DEFAULT:
472 case QQmlJSGrammar::T_READONLY:
473 enter(StateType::PropertyModifiers);
475 case QQmlJSGrammar::T_PROPERTY:
476 enter(StateType::PropertyStart);
478 case QQmlJSGrammar::T_REQUIRED:
479 enter(StateType::RequiredProperty);
481 case QQmlJSGrammar::T_COMPONENT:
482 enter(StateType::ComponentStart);
484 case QQmlJSGrammar::T_FUNCTION:
485 enter(StateType::FunctionStart);
487 case QQmlJSGrammar::T_SIGNAL:
488 enter(StateType::SignalStart);
490 case QQmlJSGrammar::T_ENUM:
491 enter(StateType::EnumStart);
493 case QQmlJSGrammar::T_ON:
494 case QQmlJSGrammar::T_AS:
495 case QQmlJSGrammar::T_IMPORT:
496 enter(StateType::BindingOrObjectdefinition);
500 enter(StateType::BindingOrObjectdefinition);
505 case StateType::PropertyModifiers:
507 case QQmlJSGrammar::T_PROPERTY:
508 turnInto(StateType::PropertyStart);
510 case QQmlJSGrammar::T_DEFAULT:
511 case QQmlJSGrammar::T_READONLY:
513 case QQmlJSGrammar::T_REQUIRED:
514 turnInto(StateType::RequiredProperty);
522 case StateType::PropertyStart:
524 case QQmlJSGrammar::T_COLON:
525 enter(StateType::BindingAssignment);
527 case QQmlJSGrammar::T_VAR:
528 enter(StateType::PropertyName);
532 if (kindIsIdentifier && tokenText(currentToken) == u"list") {
533 enter(StateType::PropertyListOpen);
534 }
else if (kindIsIdentifier) {
535 enter(StateType::PropertyName);
543 case StateType::RequiredProperty:
545 case QQmlJSGrammar::T_PROPERTY:
546 turnInto(StateType::PropertyStart);
548 case QQmlJSGrammar::T_DEFAULT:
549 case QQmlJSGrammar::T_READONLY:
550 turnInto(StateType::PropertyModifiers);
552 case QQmlJSGrammar::T_IDENTIFIER:
561 case StateType::ComponentStart:
563 case QQmlJSGrammar::T_IDENTIFIER:
564 turnInto(StateType::ComponentName);
572 case StateType::ComponentName:
574 case QQmlJSGrammar::T_COLON:
575 enter(StateType::BindingAssignment);
583 case StateType::PropertyName:
584 turnInto(StateType::PropertyMaybeInitializer);
587 case StateType::PropertyListOpen: {
588 const QStringView tok = tokenText(currentToken);
590 turnInto(StateType::PropertyName);
593 case StateType::PropertyMaybeInitializer:
595 case QQmlJSGrammar::T_COLON:
596 turnInto(StateType::BindingAssignment);
604 case StateType::EnumStart:
606 case QQmlJSGrammar::T_LBRACE:
607 enter(StateType::ObjectliteralOpen);
612 case StateType::SignalStart:
614 case QQmlJSGrammar::T_COLON:
615 enter(StateType::BindingAssignment);
618 enter(StateType::SignalMaybeArglist);
623 case StateType::SignalMaybeArglist:
625 case QQmlJSGrammar::T_LPAREN:
626 turnInto(StateType::SignalArglistOpen);
634 case StateType::SignalArglistOpen:
636 case QQmlJSGrammar::T_RPAREN:
642 case StateType::FunctionStart:
644 case QQmlJSGrammar::T_LPAREN:
645 enter(StateType::FunctionArglistOpen);
650 case StateType::FunctionArglistOpen:
652 case QQmlJSGrammar::T_COLON:
653 enter(StateType::TypeAnnotation);
655 case QQmlJSGrammar::T_RPAREN:
656 turnInto(StateType::FunctionArglistClosed);
661 case StateType::FunctionArglistClosed:
663 case QQmlJSGrammar::T_COLON:
664 enter(StateType::TypeAnnotation);
666 case QQmlJSGrammar::T_LBRACE:
667 turnInto(StateType::JsblockOpen);
675 case StateType::LambdaStart:
677 case QQmlJSGrammar::T_LBRACE:
678 turnInto(StateType::JsblockOpen);
681 turnInto(StateType::Expression);
685 case StateType::TypeAnnotation:
687 case QQmlJSGrammar::T_IDENTIFIER:
688 case QQmlJSGrammar::T_VOID:
689 case QQmlJSGrammar::T_VAR:
690 case QQmlJSGrammar::T_DOT:
692 case QQmlJSGrammar::T_LT:
693 turnInto(StateType::TypeParameter);
701 case StateType::TypeParameter:
703 case QQmlJSGrammar::T_LT:
704 enter(StateType::TypeParameter);
706 case QQmlJSGrammar::T_GT:
712 case StateType::ExpressionOrObjectdefinition:
714 case QQmlJSGrammar::T_DOT:
717 case QQmlJSGrammar::T_LBRACE:
718 turnInto(StateType::ObjectdefinitionOpen);
722 case QQmlJSGrammar::T_RBRACKET:
723 case QQmlJSGrammar::T_RPAREN:
731 enter(StateType::Expression);
736 case StateType::ExpressionOrLabel:
738 case QQmlJSGrammar::T_COLON:
739 turnInto(StateType::LabelledStatement);
743 case QQmlJSGrammar::T_RBRACKET:
744 case QQmlJSGrammar::T_RPAREN:
749 enter(StateType::Expression);
754 case StateType::TernaryOp:
755 if (kind == QQmlJSGrammar::T_COLON) {
756 enter(StateType::TernaryOpAfterColon);
757 enter(StateType::ExpressionContinuation);
761 case StateType::TernaryOpAfterColon:
762 case StateType::Expression:
766 case QQmlJSGrammar::T_COMMA:
769 case QQmlJSGrammar::T_RBRACKET:
770 case QQmlJSGrammar::T_RPAREN:
773 case QQmlJSGrammar::T_RBRACE:
776 case QQmlJSGrammar::T_AUTOMATIC_SEMICOLON:
777 case QQmlJSGrammar::T_COMPATIBILITY_SEMICOLON:
778 case QQmlJSGrammar::T_SEMICOLON:
782 if (Token::lexKindIsDelimiter(kind))
783 enter(StateType::ExpressionContinuation);
788 case StateType::ExpressionContinuation:
792 case StateType::ExpressionMaybeContinuation:
794 case QQmlJSGrammar::T_QUESTION:
795 case QQmlJSGrammar::T_LBRACKET:
796 case QQmlJSGrammar::T_LPAREN:
797 case QQmlJSGrammar::T_LBRACE:
801 leave(!Token::lexKindIsDelimiter(kind));
806 case StateType::ParenOpen:
810 case QQmlJSGrammar::T_RPAREN:
816 case StateType::BracketOpen:
820 case QQmlJSGrammar::T_COMMA:
821 enter(StateType::BracketElementStart);
823 case QQmlJSGrammar::T_RBRACKET:
829 case StateType::ObjectliteralOpen:
833 case QQmlJSGrammar::T_COLON:
834 enter(StateType::ObjectliteralAssignment);
836 case QQmlJSGrammar::T_RBRACKET:
837 case QQmlJSGrammar::T_RPAREN:
840 case QQmlJSGrammar::T_RBRACE:
847 case StateType::ObjectliteralAssignment:
851 case QQmlJSGrammar::T_COMMA:
854 case QQmlJSGrammar::T_RBRACKET:
855 case QQmlJSGrammar::T_RPAREN:
858 case QQmlJSGrammar::T_RBRACE:
862 if (Token::lexKindIsDelimiter(kind))
863 enter(StateType::ExpressionContinuation);
868 case StateType::BracketElementStart:
870 turnInto(StateType::BracketElementMaybeObjectdefinition);
877 case StateType::BracketElementMaybeObjectdefinition:
879 case QQmlJSGrammar::T_LBRACE:
880 turnInto(StateType::ObjectdefinitionOpen);
888 case StateType::JsblockOpen:
889 case StateType::SubstatementOpen:
893 case QQmlJSGrammar::T_RBRACE:
899 case StateType::LabelledStatement:
905 case StateType::Substatement:
907 if (kind != QQmlJSGrammar::T_LBRACE) {
912 case QQmlJSGrammar::T_LBRACE:
913 turnInto(StateType::SubstatementOpen);
918 case StateType::IfStatement:
920 case QQmlJSGrammar::T_LPAREN:
921 enter(StateType::ConditionOpen);
929 case StateType::MaybeElse:
931 case QQmlJSGrammar::T_ELSE:
932 turnInto(StateType::ElseClause);
933 enter(StateType::Substatement);
941 case StateType::MaybeCatchOrFinally:
943 case QQmlJSGrammar::T_CATCH:
944 turnInto(StateType::CatchStatement);
946 case QQmlJSGrammar::T_FINALLY:
947 turnInto(StateType::FinallyStatement);
955 case StateType::ElseClause:
962 case StateType::ConditionOpen:
966 case QQmlJSGrammar::T_RPAREN:
967 turnInto(StateType::Substatement);
972 case StateType::SwitchStatement:
973 case StateType::CatchStatement:
974 case StateType::StatementWithCondition:
976 case QQmlJSGrammar::T_LPAREN:
977 enter(StateType::StatementWithConditionParenOpen);
984 case StateType::StatementWithConditionParenOpen:
988 case QQmlJSGrammar::T_RPAREN:
989 turnInto(StateType::Substatement);
994 case StateType::TryStatement:
995 case StateType::FinallyStatement:
997 case QQmlJSGrammar::T_LBRACE:
998 enter(StateType::JsblockOpen);
1006 case StateType::DoStatement:
1008 case QQmlJSGrammar::T_WHILE:
1010 case QQmlJSGrammar::T_LPAREN:
1011 enter(StateType::DoStatementWhileParenOpen);
1019 case StateType::DoStatementWhileParenOpen:
1023 case QQmlJSGrammar::T_RPAREN:
1030 case StateType::BreakcontinueStatement:
1039 case StateType::CaseStart:
1041 case QQmlJSGrammar::T_COLON:
1042 turnInto(StateType::CaseCont);
1047 case StateType::CaseCont:
1048 if (kind != QQmlJSGrammar::T_CASE && kind != QQmlJSGrammar::T_DEFAULT && tryStatement())
1051 case QQmlJSGrammar::T_RBRACE:
1054 case QQmlJSGrammar::T_DEFAULT:
1055 case QQmlJSGrammar::T_CASE:
1061 case StateType::MultilineCommentStart:
1062 case StateType::MultilineCommentCont:
1066 }
else if (tokenIndex == lineTokens.size() - 1
1067 && !currentStatus.lexerState.isMultiline()) {
1071 turnInto(StateType::MultilineCommentCont);
1076 qWarning() <<
"Unhandled state" << currentStatus.state().typeStr();
1083 StateType topState = currentStatus.state().type;
1086 if (topState == StateType::ExpressionOrLabel)
1087 enterState(StateType::Expression);
1089 else if (topState == StateType::BreakcontinueStatement)
1092 topState = currentStatus.state().type;
1095 if (topState == StateType::Expression || topState == StateType::ExpressionOrObjectdefinition
1096 || topState == StateType::ObjectliteralAssignment
1097 || topState == StateType::TernaryOpAfterColon) {
1098 enterState(StateType::ExpressionMaybeContinuation);
1101 if (topState != StateType::MultilineCommentStart && topState != StateType::MultilineCommentCont
1102 && currentStatus.lexerState.state.tokenKind == QQmlJSGrammar::T_PARTIAL_COMMENT) {
1103 enterState(StateType::MultilineCommentStart);
1105 currentStatus.finalIndent = currentIndent;
1118 if (topState.type == StateType::MultilineCommentStart
1119 || topState.type == StateType::MultilineCommentCont) {
1124 if (oldStatus.lexerState.state.tokenKind == QQmlJSGrammar::T_PARTIAL_DOUBLE_QUOTE_STRING_LITERAL
1125 || oldStatus.lexerState.state.tokenKind == QQmlJSGrammar::T_PARTIAL_SINGLE_QUOTE_STRING_LITERAL
1126 || oldStatus.lexerState.state.tokenKind == QQmlJSGrammar::T_PARTIAL_TEMPLATE_HEAD
1127 || oldStatus.lexerState.state.tokenKind == QQmlJSGrammar::T_PARTIAL_TEMPLATE_MIDDLE) {
1131 switch (tokenKind) {
1132 case QQmlJSGrammar::T_LBRACE:
1133 if (topState.type == StateType::Substatement
1134 || topState.type == StateType::BindingAssignment
1135 || topState.type == StateType::CaseCont) {
1136 return topState.savedIndentDepth;
1139 case QQmlJSGrammar::T_RBRACE: {
1140 if (topState.type == StateType::JsblockOpen && previousState.type == StateType::CaseCont) {
1141 return previousState.savedIndentDepth;
1143 for (
int i = 0; oldStatus.state(i).type != StateType::TopmostIntro; ++i) {
1144 const StateType type = oldStatus
.state(i
).type;
1145 if (type == StateType::ObjectdefinitionOpen || type == StateType::JsblockOpen
1146 || type == StateType::SubstatementOpen || type == StateType::ObjectliteralOpen) {
1147 return oldStatus
.state(i
).savedIndentDepth;
1152 case QQmlJSGrammar::T_RBRACKET:
1153 for (
int i = 0; oldStatus.state(i).type != StateType::TopmostIntro; ++i) {
1154 const StateType type = oldStatus
.state(i
).type;
1155 if (type == StateType::BracketOpen) {
1156 return oldStatus
.state(i
).savedIndentDepth;
1160 case QQmlJSGrammar::T_LBRACKET:
1161 case QQmlJSGrammar::T_LPAREN:
1162 if (topState.type == StateType::ExpressionMaybeContinuation)
1163 return topState.savedIndentDepth;
1165 case QQmlJSGrammar::T_ELSE:
1166 if (topState.type == StateType::MaybeElse) {
1167 return oldStatus
.state(1
).savedIndentDepth;
1168 }
else if (topState.type == StateType::ExpressionMaybeContinuation) {
1169 bool hasElse =
false;
1170 for (
int i = 1; oldStatus.state(i).type != StateType::TopmostIntro; ++i) {
1171 const StateType type = oldStatus
.state(i
).type;
1172 if (type == StateType::ElseClause)
1174 if (type == StateType::IfStatement) {
1178 return oldStatus
.state(i
).savedIndentDepth;
1184 case QQmlJSGrammar::T_CATCH:
1185 case QQmlJSGrammar::T_FINALLY:
1186 if (topState.type == StateType::MaybeCatchOrFinally)
1187 return oldStatus
.state(1
).savedIndentDepth;
1189 case QQmlJSGrammar::T_COLON:
1190 if (topState.type == StateType::TernaryOp)
1191 return indentDepth - 2;
1193 case QQmlJSGrammar::T_QUESTION:
1194 if (topState.type == StateType::ExpressionMaybeContinuation)
1195 return topState.savedIndentDepth;
1198 case QQmlJSGrammar::T_DEFAULT:
1199 case QQmlJSGrammar::T_CASE:
1200 for (
int i = 0; oldStatus.state(i).type != StateType::TopmostIntro; ++i) {
1201 const StateType type = oldStatus
.state(i
).type;
1202 if (type == StateType::SwitchStatement || type == StateType::CaseCont) {
1203 return oldStatus
.state(i
).savedIndentDepth;
1204 }
else if (type == StateType::TopmostIntro) {
1210 if (Token::lexKindIsDelimiter(tokenKind)
1211 && topState.type == StateType::ExpressionMaybeContinuation)
1212 return topState.savedIndentDepth;
1266 int *savedIndentDepth)
const
1268 const State &parentState = currentStatus.state();
1272 const bool lastToken = (tokenIndex == lineTokens.size() - 1);
1275 case StateType::ObjectdefinitionOpen: {
1277 if (parentState.type == StateType::BindingAssignment)
1278 *savedIndentDepth = currentStatus.state(1).savedIndentDepth;
1281 *savedIndentDepth = tokenPosition;
1287 case StateType::BindingOrObjectdefinition:
1289 *indentDepth = *savedIndentDepth = tokenPosition;
1292 case StateType::BindingAssignment:
1293 case StateType::ObjectliteralAssignment:
1300 case StateType::ExpressionOrObjectdefinition:
1301 *indentDepth = tokenPosition;
1304 case StateType::ExpressionOrLabel:
1305 if (*indentDepth == tokenPosition)
1308 *indentDepth = tokenPosition;
1311 case StateType::Expression:
1312 if (*indentDepth == tokenPosition) {
1315 if (parentState.type != StateType::ExpressionOrObjectdefinition
1316 && parentState.type != StateType::ExpressionOrLabel
1317 && parentState.type != StateType::BindingAssignment) {
1323 else if (parentState.type != StateType::ExpressionOrObjectdefinition
1324 && parentState.type != StateType::ExpressionOrLabel) {
1325 *indentDepth = tokenPosition;
1329 case StateType::ExpressionMaybeContinuation:
1331 for (
int i = 1; currentStatus.state(i).type != StateType::TopmostIntro; ++i) {
1332 const StateType type = currentStatus.state(i).type;
1333 if (FormatTextStatus::isExpressionEndState(type)
1334 && !FormatTextStatus::isBracelessState(type)) {
1335 *indentDepth = currentStatus.state(i - 1).savedIndentDepth;
1341 case StateType::BracketOpen:
1342 if (parentState.type == StateType::Expression
1343 && currentStatus.state(1).type == StateType::BindingAssignment) {
1344 *savedIndentDepth = currentStatus.state(2).savedIndentDepth;
1346 }
else if (parentState.type == StateType::ObjectliteralAssignment) {
1347 *savedIndentDepth = parentState.savedIndentDepth;
1349 }
else if (!lastToken) {
1350 *indentDepth = tokenPosition + 1;
1356 case StateType::LambdaStart:
1357 case StateType::FunctionStart:
1362 case StateType::DoStatementWhileParenOpen:
1363 case StateType::StatementWithConditionParenOpen:
1364 case StateType::SignalArglistOpen:
1365 case StateType::FunctionArglistOpen:
1366 case StateType::ParenOpen:
1368 *indentDepth = tokenPosition + 1;
1373 case StateType::TernaryOp:
1375 *indentDepth = tokenPosition + tk
.length + 1;
1380 case StateType::JsblockOpen:
1382 if (parentState.type == StateType::CaseCont) {
1383 *savedIndentDepth = parentState.savedIndentDepth;
1387 case StateType::SubstatementOpen:
1389 if (parentState.type == StateType::BindingAssignment)
1390 *savedIndentDepth = currentStatus.state(1).savedIndentDepth;
1394 case StateType::Substatement:
1398 case StateType::ObjectliteralOpen:
1399 if (parentState.type == StateType::Expression
1400 || parentState.type == StateType::ObjectliteralAssignment) {
1402 if (currentStatus.state(1).type == StateType::ExpressionOrLabel)
1403 *indentDepth = currentStatus.state(1).savedIndentDepth;
1405 *indentDepth = parentState.savedIndentDepth;
1406 *savedIndentDepth = *indentDepth;
1411 case StateType::StatementWithCondition:
1412 case StateType::TryStatement:
1413 case StateType::CatchStatement:
1414 case StateType::FinallyStatement:
1415 case StateType::IfStatement:
1416 case StateType::DoStatement:
1417 case StateType::SwitchStatement:
1418 if (firstToken || parentState.type == StateType::BindingAssignment)
1419 *savedIndentDepth = tokenPosition;
1421 *indentDepth = *savedIndentDepth;
1423 if (!firstToken && newState == StateType::IfStatement
1424 && parentState.type == StateType::Substatement
1425 && currentStatus.state(1).type == StateType::ElseClause) {
1426 *indentDepth = currentStatus.state(1).savedIndentDepth;
1427 *savedIndentDepth = *indentDepth;
1431 case StateType::MaybeElse:
1432 case StateType::MaybeCatchOrFinally: {
1434 int lastNonEndState = 0;
1435 while (!FormatTextStatus::isExpressionEndState(
1436 currentStatus.state(lastNonEndState + 1).type))
1438 *indentDepth = currentStatus.state(lastNonEndState).savedIndentDepth;
1442 case StateType::ConditionOpen:
1447 *indentDepth = tokenPosition + 1;
1450 case StateType::CaseStart:
1451 *savedIndentDepth = tokenPosition;
1454 case StateType::CaseCont:
1458 case StateType::MultilineCommentStart:
1459 *indentDepth = tokenPosition + 2;
1462 case StateType::MultilineCommentCont:
1463 *indentDepth = tokenPosition;