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 9862720e65425200e6a29fe1f401389a2f859c5a Author: Josh Tynjala <[email protected]> AuthorDate: Thu Oct 31 14:52:36 2024 -0700 formatter: fix formatting of literal RegExp that contains escape sequences --- .../apache/royale/formatter/ASTokenFormatter.java | 21 ++++++ .../org/apache/royale/formatter/TestRegExp.java | 80 ++++++++++++++++++++++ 2 files changed, 101 insertions(+) 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 a530d8690..740a73437 100644 --- a/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java +++ b/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java @@ -1292,6 +1292,9 @@ public class ASTokenFormatter extends BaseTokenFormatter { case ASTokenTypes.TOKEN_LITERAL_STRING: { return formatLiteralString(token, fileText); } + case ASTokenTypes.TOKEN_LITERAL_REGEXP: { + return formatLiteralRegExp(token, fileText); + } case ASTokenTypes.TOKEN_SEMICOLON: { if (skipFormatting) { if (token.isImplicit()) { @@ -1403,6 +1406,24 @@ public class ASTokenFormatter extends BaseTokenFormatter { return comment; } + private String formatLiteralRegExp(IASToken token, String fileText) { + int start = token.getAbsoluteStart(); + int end = token.getAbsoluteEnd(); + if (start != -1 && start < end && end < fileText.length()) { + // escape sequences are converted to real characters when the + // original source code is converted to to tokens + // the user won't be happy if their strings get changed + // (and, in some cases, it may become an invalid string), + // so grab the original string from the file + return fileText.substring(start, end); + } + String tokenText = token.getText(); + if (tokenText != null) { + return tokenText; + } + return ""; + } + private String formatLiteralString(IASToken token, String fileText) { int start = token.getAbsoluteStart(); int end = token.getAbsoluteEnd(); diff --git a/formatter/src/test/java/org/apache/royale/formatter/TestRegExp.java b/formatter/src/test/java/org/apache/royale/formatter/TestRegExp.java index f959b6b69..b2512552d 100644 --- a/formatter/src/test/java/org/apache/royale/formatter/TestRegExp.java +++ b/formatter/src/test/java/org/apache/royale/formatter/TestRegExp.java @@ -43,4 +43,84 @@ public class TestRegExp extends BaseFormatterTests { // @formatter:on result); } + + @Test + public void testRegExpTabEscaped() { + FormatterSettings settings = new FormatterSettings(); + settings.insertSpaceBeforeAndAfterBinaryOperators = true; + settings.placeOpenBraceOnNewLine = false; + settings.insertSpaces = false; + ASTokenFormatter formatter = new ASTokenFormatter(settings); + String result = formatter.format("file.as", + // @formatter:off + "/\\t/;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "/\\t/;", + // @formatter:on + result); + } + + @Test + public void testRegExpNewLineEscaped() { + FormatterSettings settings = new FormatterSettings(); + settings.insertSpaceBeforeAndAfterBinaryOperators = true; + settings.placeOpenBraceOnNewLine = false; + settings.insertSpaces = false; + ASTokenFormatter formatter = new ASTokenFormatter(settings); + String result = formatter.format("file.as", + // @formatter:off + "/\\n/;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "/\\n/;", + // @formatter:on + result); + } + + @Test + public void testRegExpCarriageReturnEscaped() { + FormatterSettings settings = new FormatterSettings(); + settings.insertSpaceBeforeAndAfterBinaryOperators = true; + settings.placeOpenBraceOnNewLine = false; + settings.insertSpaces = false; + ASTokenFormatter formatter = new ASTokenFormatter(settings); + String result = formatter.format("file.as", + // @formatter:off + "/\\r/;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "/\\r/;", + // @formatter:on + result); + } + + @Test + public void testRegExpUnicodeEscaped() { + FormatterSettings settings = new FormatterSettings(); + settings.insertSpaceBeforeAndAfterBinaryOperators = true; + settings.placeOpenBraceOnNewLine = false; + settings.insertSpaces = false; + ASTokenFormatter formatter = new ASTokenFormatter(settings); + String result = formatter.format("file.as", + // @formatter:off + "/\\u263a\\u2620\\u2603/;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "/\\u263a\\u2620\\u2603/;", + // @formatter:on + result); + } } \ No newline at end of file
