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 2744006b96738a2dcb0edc84ef8cf5e38ddea980 Author: Josh Tynjala <[email protected]> AuthorDate: Wed Sep 27 10:32:34 2023 -0700 formatter: insert-new-line-else option --- .../apache/royale/formatter/ASTokenFormatter.java | 24 ++++-- .../apache/royale/formatter/FormatterSettings.java | 1 + .../apache/royale/formatter/FormatterUtils.java | 1 + .../royale/formatter/config/Configuration.java | 18 +++++ .../apache/royale/formatter/TestElseStatement.java | 88 ++++++++++++++++++++++ 5 files changed, 127 insertions(+), 5 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 9676a5b6f..aeed7297e 100644 --- a/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java +++ b/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java @@ -66,6 +66,7 @@ public class ASTokenFormatter extends BaseTokenFormatter { private boolean inInterfaceDeclaration; private boolean inConfigGateForDefinition; private boolean blockOpenPending; + private boolean elseNoNewLinePending; private boolean indentedStatement; private boolean caseOrDefaultBlockOpenPending; private boolean skipFormatting; @@ -201,6 +202,7 @@ public class ASTokenFormatter extends BaseTokenFormatter { inInterfaceDeclaration = false; inConfigGateForDefinition = false; blockOpenPending = false; + elseNoNewLinePending = false; indentedStatement = false; caseOrDefaultBlockOpenPending = false; skipFormatting = false; @@ -246,7 +248,7 @@ public class ASTokenFormatter extends BaseTokenFormatter { appendNewLines(builder, numRequiredNewLines); break; } - if (!blockOpenPending) { + if (!blockOpenPending && !elseNoNewLinePending) { int newLinesInExtra = countNewLinesInExtra(token); if (prevToken != null && prevToken.getType() == ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT) { newLinesInExtra++; @@ -391,6 +393,14 @@ public class ASTokenFormatter extends BaseTokenFormatter { requiredSpace = true; break; } + case ASTokenTypes.TOKEN_KEYWORD_ELSE: { + if (elseNoNewLinePending) { + numRequiredNewLines = 0; + elseNoNewLinePending = false; + requiredSpace = true; + } + break; + } case ASTokenTypes.TOKEN_OPERATOR_EQUAL: case ASTokenTypes.TOKEN_OPERATOR_NOT_EQUAL: case ASTokenTypes.TOKEN_OPERATOR_STRICT_EQUAL: @@ -622,13 +632,17 @@ public class ASTokenFormatter extends BaseTokenFormatter { if (stackItem.blockDepth <= 0) { blockStack.remove(blockStack.size() - 1); } - if (!(stackItem instanceof ObjectLiteralBlockStackItem) - && (nextToken == null || (nextToken.getType() != ASTokenTypes.TOKEN_SEMICOLON + if (!(stackItem instanceof ObjectLiteralBlockStackItem)) { + if (nextTokenNotComment != null && nextTokenNotComment.getType() == ASTokenTypes.TOKEN_KEYWORD_ELSE && !settings.insertNewLineElse) { + elseNoNewLinePending = true; + } + else if (nextToken == null || (nextToken.getType() != ASTokenTypes.TOKEN_SEMICOLON && nextToken.getType() != ASTokenTypes.TOKEN_PAREN_CLOSE && nextToken.getType() != ASTokenTypes.TOKEN_COMMA && nextToken.getType() != ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT - && nextToken.getType() != ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT))) { - numRequiredNewLines = Math.max(numRequiredNewLines, 1); + && nextToken.getType() != ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT)) { + numRequiredNewLines = Math.max(numRequiredNewLines, 1); + } } } break; diff --git a/formatter/src/main/java/org/apache/royale/formatter/FormatterSettings.java b/formatter/src/main/java/org/apache/royale/formatter/FormatterSettings.java index c083f01c3..908f824e3 100644 --- a/formatter/src/main/java/org/apache/royale/formatter/FormatterSettings.java +++ b/formatter/src/main/java/org/apache/royale/formatter/FormatterSettings.java @@ -25,6 +25,7 @@ public class FormatterSettings { public int tabSize = 4; public boolean insertSpaces = false; public boolean insertFinalNewLine = false; + public boolean insertNewLineElse = true; public boolean placeOpenBraceOnNewLine = true; public boolean insertSpaceAfterSemicolonInForStatements = true; public boolean insertSpaceAfterKeywordsInControlFlowStatements = true; diff --git a/formatter/src/main/java/org/apache/royale/formatter/FormatterUtils.java b/formatter/src/main/java/org/apache/royale/formatter/FormatterUtils.java index 39e6b89bc..4221977d9 100644 --- a/formatter/src/main/java/org/apache/royale/formatter/FormatterUtils.java +++ b/formatter/src/main/java/org/apache/royale/formatter/FormatterUtils.java @@ -29,6 +29,7 @@ public class FormatterUtils { settings.insertSpaces = configuration.getInsertSpaces(); settings.insertFinalNewLine = configuration.getInsertFinalNewLine(); settings.placeOpenBraceOnNewLine = configuration.getPlaceOpenBraceOnNewLine(); + settings.insertNewLineElse = configuration.getPlaceElseOnNewLine(); settings.insertSpaceAfterSemicolonInForStatements = configuration.getInsertSpaceAfterSemicolonInForStatements(); settings.insertSpaceAfterKeywordsInControlFlowStatements = configuration.getInsertSpaceAfterKeywordsInControlFlowStatements(); settings.insertSpaceAfterFunctionKeywordForAnonymousFunctions = configuration.getInsertSpaceAfterFunctionKeywordForAnonymousFunctions(); diff --git a/formatter/src/main/java/org/apache/royale/formatter/config/Configuration.java b/formatter/src/main/java/org/apache/royale/formatter/config/Configuration.java index 2e1883904..5adc4b1a2 100644 --- a/formatter/src/main/java/org/apache/royale/formatter/config/Configuration.java +++ b/formatter/src/main/java/org/apache/royale/formatter/config/Configuration.java @@ -320,6 +320,24 @@ public class Configuration { this.placeOpenBraceOnNewLine = b; } + // + // 'insert-new-line-else' option + // + + private boolean placeElseOnNewLine = true; + + public boolean getPlaceElseOnNewLine() + { + return placeElseOnNewLine; + } + + @Config + @Mapping("insert-new-line-else") + public void setPlaceElseOnNewLine(ConfigurationValue cv, boolean b) + { + this.placeElseOnNewLine = b; + } + // // 'insert-space-for-loop-semicolon' option // diff --git a/formatter/src/test/java/org/apache/royale/formatter/TestElseStatement.java b/formatter/src/test/java/org/apache/royale/formatter/TestElseStatement.java index 0e6f8445c..038e1eb3a 100644 --- a/formatter/src/test/java/org/apache/royale/formatter/TestElseStatement.java +++ b/formatter/src/test/java/org/apache/royale/formatter/TestElseStatement.java @@ -853,4 +853,92 @@ public class TestElseStatement extends BaseFormatterTests { // @formatter:on result); } + + @Test + public void testDisableInsertNewLineElseWithStatement1() { + FormatterSettings settings = new FormatterSettings(); + settings.insertSpaceAfterKeywordsInControlFlowStatements = true; + settings.placeOpenBraceOnNewLine = false; + settings.insertSpaces = false; + settings.insertNewLineElse = false; + ASTokenFormatter formatter = new ASTokenFormatter(settings); + String result = formatter.format("file.as", + // @formatter:off + "if (condition)\n" + + "{\n" + + "\tstatement;\n" + + "}\n" + + "else\n" + + "{\n" + + "\tstatement;\n" + + "}", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "if (condition) {\n" + + "\tstatement;\n" + + "} else {\n" + + "\tstatement;\n" + + "}", + // @formatter:on + result); + } + + @Test + public void testDisableInsertNewLineElseWithStatement2() { + FormatterSettings settings = new FormatterSettings(); + settings.insertSpaceAfterKeywordsInControlFlowStatements = true; + settings.placeOpenBraceOnNewLine = false; + settings.insertSpaces = false; + settings.insertNewLineElse = false; + ASTokenFormatter formatter = new ASTokenFormatter(settings); + String result = formatter.format("file.as", + // @formatter:off + "if (condition) {\n" + + "\tstatement;\n" + + "} else {\n" + + "\tstatement;\n" + + "}", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "if (condition) {\n" + + "\tstatement;\n" + + "} else {\n" + + "\tstatement;\n" + + "}", + // @formatter:on + result); + } + + @Test + public void testDisableInsertNewLineElseWithStatement3() { + FormatterSettings settings = new FormatterSettings(); + settings.insertSpaceAfterKeywordsInControlFlowStatements = true; + settings.placeOpenBraceOnNewLine = false; + settings.insertSpaces = false; + settings.insertNewLineElse = false; + ASTokenFormatter formatter = new ASTokenFormatter(settings); + String result = formatter.format("file.as", + // @formatter:off + "if (condition)\n" + + "\tstatement;\n" + + "else\n" + + "\tstatement;\n", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "if (condition)\n" + + "\tstatement;\n" + + "else\n" + + "\tstatement;\n", + // @formatter:on + result); + } }
