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

Reply via email to