This is an automated email from the ASF dual-hosted git repository. joshtynjala pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit aff467b6120daff8ea1e8ec8d654a35c44d46d4b Author: Josh Tynjala <[email protected]> AuthorDate: Thu Jan 9 10:28:07 2025 -0800 formatter: fix switch indent not decreasing if case/default starts with block, but has non-block content after --- .../apache/royale/formatter/ASTokenFormatter.java | 54 ++++++++++++++-------- .../royale/formatter/TestSwitchStatement.java | 38 +++++++++++++++ 2 files changed, 73 insertions(+), 19 deletions(-) diff --git a/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java b/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java index 4aa6fcb9c..93faae15f 100644 --- a/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java +++ b/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java @@ -342,7 +342,6 @@ public class ASTokenFormatter extends BaseTokenFormatter { break; } case ASTokenTypes.TOKEN_BLOCK_CLOSE: { - boolean skipSwitchDecrease = false; boolean checkNext = true; while (!blockStack.isEmpty() && checkNext) { BlockStackItem stackItem = blockStack.get(blockStack.size() - 1); @@ -363,27 +362,31 @@ public class ASTokenFormatter extends BaseTokenFormatter { && prevToken.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN && !(stackItem instanceof ObjectLiteralBlockStackItem); boolean allowPackageIndent = settings.indentPackageContents - || stackItem == null || stackItem.token.getType() != ASTokenTypes.TOKEN_KEYWORD_PACKAGE; boolean allowSwitchIndent = settings.indentSwitchContents - || stackItem == null || stackItem.token.getType() != ASTokenTypes.TOKEN_KEYWORD_SWITCH; + boolean allowCaseOrDefaultIndent = !(stackItem instanceof CaseOrDefaultBlockStackItem) + || ((CaseOrDefaultBlockStackItem) stackItem).containsOnlyBlock; if ((!settings.collapseEmptyBlocks || !oneLineBlock) && allowPackageIndent - && allowSwitchIndent) { + && allowSwitchIndent + && allowCaseOrDefaultIndent) { indent = decreaseIndent(indent); } - if (stackItem.token.getType() == ASTokenTypes.TOKEN_KEYWORD_CASE - || stackItem.token.getType() == ASTokenTypes.TOKEN_KEYWORD_DEFAULT) { - blockStack.remove(blockStack.size() - 1); - if (settings.indentSwitchContents) { - indent = decreaseIndent(indent); + if (stackItem instanceof CaseOrDefaultBlockStackItem) + { + CaseOrDefaultBlockStackItem caseOrDefaultStackItem = (CaseOrDefaultBlockStackItem) stackItem; + if (!caseOrDefaultStackItem.containsOnlyBlock) { + blockStack.remove(blockStack.size() - 1); + if (settings.indentSwitchContents) { + indent = decreaseIndent(indent); + } } - skipSwitchDecrease = true; } } } - if (!skipSwitchDecrease && !blockStack.isEmpty()) { + // check again because case/default might have been removed + if (!blockStack.isEmpty()) { BlockStackItem stackItem = blockStack.get(blockStack.size() - 1); if (stackItem.token.getType() == ASTokenTypes.TOKEN_KEYWORD_SWITCH) { SwitchBlockStackItem switchStackItem = (SwitchBlockStackItem) stackItem; @@ -537,7 +540,7 @@ public class ASTokenFormatter extends BaseTokenFormatter { switchStackItem.clauseCount++; inCaseOrDefaultClause = true; numRequiredNewLines = Math.max(numRequiredNewLines, 1); - blockStack.add(new BlockStackItem(token)); + blockStack.add(new CaseOrDefaultBlockStackItem(token)); } } break; @@ -947,19 +950,24 @@ public class ASTokenFormatter extends BaseTokenFormatter { caseOrDefaultBlockOpenPending = true; boolean nextIsBlock = nextTokenNotComment != null && nextTokenNotComment.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN; + boolean caseOrDefaultContainsOnlyBlock = false; if (nextIsBlock) { IASToken afterBlockClose = findTokenAfterBlock(nextTokenNotComment, tokens); - if (afterBlockClose != null) { - if (afterBlockClose.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE - || afterBlockClose.getType() == ASTokenTypes.TOKEN_KEYWORD_CASE - || afterBlockClose.getType() == ASTokenTypes.TOKEN_KEYWORD_DEFAULT) { + BlockStackItem stackItem = !blockStack.isEmpty() ? blockStack.get(blockStack.size() - 1) : null; + if (stackItem instanceof CaseOrDefaultBlockStackItem) { + CaseOrDefaultBlockStackItem caseOrDefaultStackItem = (CaseOrDefaultBlockStackItem) stackItem; + caseOrDefaultContainsOnlyBlock = afterBlockClose != null + && (afterBlockClose.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE + || afterBlockClose.getType() == ASTokenTypes.TOKEN_KEYWORD_CASE + || afterBlockClose.getType() == ASTokenTypes.TOKEN_KEYWORD_DEFAULT); + caseOrDefaultStackItem.containsOnlyBlock = caseOrDefaultContainsOnlyBlock; + if (caseOrDefaultContainsOnlyBlock) { blockOpenPending = true; - requiredSpace = true; - blockStack.remove(blockStack.size() - 1); } + requiredSpace = true; } } - if (!nextIsBlock || !blockOpenPending) { + if (!caseOrDefaultContainsOnlyBlock || !blockOpenPending) { indent = increaseIndent(indent); if (nextToken != null && (nextToken .getType() == ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT @@ -1739,4 +1747,12 @@ public class ASTokenFormatter extends BaseTokenFormatter { public int clauseCount = 0; } + + private static class CaseOrDefaultBlockStackItem extends BlockStackItem { + public CaseOrDefaultBlockStackItem(IASToken token) { + super(token); + } + + public boolean containsOnlyBlock = false; + } } diff --git a/formatter/src/test/java/org/apache/royale/formatter/TestSwitchStatement.java b/formatter/src/test/java/org/apache/royale/formatter/TestSwitchStatement.java index 4085bdd59..b3985e118 100644 --- a/formatter/src/test/java/org/apache/royale/formatter/TestSwitchStatement.java +++ b/formatter/src/test/java/org/apache/royale/formatter/TestSwitchStatement.java @@ -1258,4 +1258,42 @@ public class TestSwitchStatement extends BaseFormatterTests { // @formatter:on result); } + + @Test + public void testWithCaseClauseAndBlockEndingWithNestedBlock() { + FormatterSettings settings = new FormatterSettings(); + settings.insertSpaceAfterKeywordsInControlFlowStatements = true; + settings.placeOpenBraceOnNewLine = true; + settings.insertSpaces = false; + ASTokenFormatter formatter = new ASTokenFormatter(settings); + String result = formatter.format("file.as", + // @formatter:off + "switch (condition)\n" + + "{\n" + + "\tcase clause:\n" + + "\t{\n" + + "\t\tif (condition)\n" + + "\t\t{\n" + + "\t\t\tstatement;\n" + + "\t\t}\n" + + "\t}\n" + + "}", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "switch (condition)\n" + + "{\n" + + "\tcase clause:\n" + + "\t{\n" + + "\t\tif (condition)\n" + + "\t\t{\n" + + "\t\t\tstatement;\n" + + "\t\t}\n" + + "\t}\n" + + "}", + // @formatter:on + result); + } }
