You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2023/09/27 17:42:03 UTC

[royale-compiler] 03/04: formatter: insert-new-line-else option

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 <jo...@apache.org>
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);
+	}
 }