formatter: fix formatting of literal RegExp that contains escape sequences
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 a530d86..740a734 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 @@
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 @@
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 f959b6b..b251255 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 @@
// @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