* Add test with unnecessarily escaped non-quote character In https://github.com/prettier/prettier/pull/1571/commits/0b6d19db18cd64f5d191f8c01dea3ea5525503b3, I noticed that `makeString` doesn't unescape unnecessarily escaped non-quote characters. This change simply adds a test for that. * Fix test with unnecessarily escaped non-quote character Unfortunately, this breaks a couple of other tests... * Revert "Fix test with unnecessarily escaped non-quote character" See https://github.com/prettier/prettier/pull/1575#issuecomment-300490172 This reverts commit d05652518fe7d4e2fb82ce48ffc922b153de5593. * Unescape unnecessarily escaped characters in strings * Add test for unnecessarily escaped character at not-beginning of string * Fix test for unnecessarily escaped character at not-beginning of string * Add test for multiple unnecessary escapes in strings * Pass test for multiple unnecessary escapes in strings * Add test for octal escapes in strings See https://github.com/prettier/prettier/pull/1575#discussion_r115804065 * Pass test for octal escapes in strings See https://github.com/prettier/prettier/pull/1575#discussion_r115804065 * Add test for unnecessarily escaped character preced by escaped backslash See https://github.com/prettier/prettier/pull/1575#discussion_r115804065 * Pass test for unnecessarily escaped character preced by escaped backslash This just allows an even number of backslashes to precede the unnecessary one. See https://github.com/prettier/prettier/pull/1575#discussion_r115804065 * Add test for unescaped character after escaped backslash in strings * Add test for unescaped character preceded by two escaped backslashes in string See https://github.com/prettier/prettier/pull/1575#discussion_r115808571 * Pass test for unescaped character preceded by two escaped backslashes in string This breaks another test though... See https://github.com/prettier/prettier/pull/1575#discussion_r115808571 * Update snapshot It turns out the test wasn't broken, I had just flubbed the escaping in the snapshot. The easiest way to see that this actually works is ```bash $ cat | prettier --stdin "hol\\a (the a is not escaped)" // press Control-D after the newline "hol\\a (the a is not escaped)"; // press Control-D after the newline ``` * Prevent test strings from being parsed as directives See https://github.com/prettier/prettier/pull/1575#discussion_r115820336 (cherry picked from commit 126e56ab2c79801cbf7fee22189212d8c93581df) * Add test for consecutive unnecessarily escaped characters in strings See https://github.com/prettier/prettier/pull/1575#discussion_r115822286 * Pass test for consecutive unnecessarily escaped characters in strings See https://github.com/prettier/prettier/pull/1575#discussion_r115822286 This looping is hacky. We might be able to emulate lookbehind instead. * Optimize (maybe?) string unescaping loop Not sure how expensive string comparison is here... See https://github.com/prettier/prettier/commit/2323c8c025e5302995b2846ed45fd0bd67e66f1b#commitcomment-22092267 * Safeguard against string unescaping loop hanging See https://github.com/prettier/prettier/pull/1575#discussion_r115827531 * Add more comprehensive tests for unnecessary string escapes See https://github.com/prettier/prettier/pull/1575#discussion_r115798155 * Remove superfluous variables from makeString() See https://github.com/prettier/prettier/pull/1575#discussion_r115834468 * Unescape unnecessary strings escapes without looping * Unescape unnecessary string escapes while handling quotes Kudos to @lydell for figuring this out! See https://github.com/prettier/prettier/pull/1575/files#r115860741 * Test that unnecessary escapes remain in directive literals See: * https://github.com/prettier/prettier/pull/1575#discussion_r115820336 * https://github.com/prettier/prettier/pull/1575#issuecomment-300633277
101 lines
2.2 KiB
JavaScript
101 lines
2.2 KiB
JavaScript
// Prevent strings from being parsed as directives
|
||
// See https://github.com/prettier/prettier/pull/1560#issue-227225960
|
||
0;
|
||
|
||
// Every string will be changed to double quotes, unless we end up with fewer
|
||
// escaped quotes by using single quotes. (Vice versa if the "singleQuote"
|
||
// option is true).
|
||
//
|
||
// Note that even if a string already has the correct enclosing quotes, it is
|
||
// still processed in order to remove unnecessarily escaped quotes within it,
|
||
// for consistency.
|
||
|
||
// Simple strings.
|
||
"abc"
|
||
'abc'
|
||
|
||
// Escape.
|
||
'\0'
|
||
|
||
// Emoji.
|
||
'🐶'
|
||
|
||
// Empty string.
|
||
""
|
||
''
|
||
|
||
// Single double quote.
|
||
"\""
|
||
'"'
|
||
|
||
// Single single quote.
|
||
"'"
|
||
'\''
|
||
|
||
// Unnecessary escapes.
|
||
"\'"
|
||
'\"'
|
||
"\a"
|
||
'\a'
|
||
"hol\a"
|
||
'hol\a'
|
||
"hol\\a (the a is not escaped)"
|
||
'hol\\a (the a is not escaped)'
|
||
"multiple \a unnecessary \a escapes"
|
||
'multiple \a unnecessary \a escapes'
|
||
"unnecessarily escaped character preceded by escaped backslash \\\a"
|
||
'unnecessarily escaped character preceded by escaped backslash \\\a'
|
||
"unescaped character preceded by two escaped backslashes \\\\a"
|
||
'unescaped character preceded by two escaped backslashes \\\\a'
|
||
"\a\a" // consecutive unnecessarily escaped characters
|
||
'\a\a' // consecutive unnecessarily escaped characters
|
||
'escaped \u2030 \‰ (should not stay escaped)'
|
||
|
||
// Meaningful escapes
|
||
"octal escapes \0 \1 \2 \3 \4 \5 \6 \7"
|
||
'octal escapes \0 \1 \2 \3 \4 \5 \6 \7'
|
||
"meaningfully escaped alphabetical characters \n \r \v \t \b \f \u2713 \x61"
|
||
'meaningfully escaped alphabetical characters \n \r \v \t \b \f \u2713 \x61'
|
||
'escaped newline \
|
||
'
|
||
'escaped carriage return \
|
||
'
|
||
'escaped \u2028 \
'
|
||
'escaped \u2029 \
'
|
||
|
||
// One of each.
|
||
"\"'"
|
||
'"\''
|
||
|
||
// One of each with unnecessary escapes.
|
||
"\"\'"
|
||
'\"\''
|
||
|
||
// More double quotes than single quotes.
|
||
"\"'\""
|
||
'"\'"'
|
||
|
||
// More single quotes than double quotes.
|
||
"\"''"
|
||
'"\'\''
|
||
|
||
// Two of each.
|
||
"\"\"''"
|
||
'""\'\''
|
||
|
||
// Single backslash.
|
||
'\\'
|
||
"\\"
|
||
|
||
// Backslases.
|
||
"\"\\\"\\\\\" '\'\\'\\\'\\\\'"
|
||
'\'\\\'\\\\\' "\"\\"\\\"\\\\"'
|
||
|
||
// Somewhat more real-word example.
|
||
"He's sayin': \"How's it goin'?\" Don't ask me why."
|
||
'He\'s sayin\': "How\'s it goin\'?" Don\'t ask me why.'
|
||
|
||
// Somewhat more real-word example 2.
|
||
"var backslash = \"\\\", doubleQuote = '\"';"
|
||
'var backslash = "\\", doubleQuote = \'"\';'
|