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