2017-05-11 02:02:49 +03:00
|
|
|
|
// Unnecessary escapes. (adapted from tests/quotes/strings.js)
|
|
|
|
|
// Note that in directives, unnecessary escapes should be preserved.
|
|
|
|
|
// See https://github.com/prettier/prettier/issues/1555
|
Preserve code unit sequence of directive literals (#1571)
* Print directive literals verbatim
This addresses https://github.com/prettier/prettier/issues/1555,
but doesn't seem to pass the AST_COMPARE=1 tests:
AST_COMPARE=1 npm test -- tests/quotes -t strings
However, running `prettier --debug-check` on the relevant file *does*
work:
prettier tests/quotes/strings.js --debug-check
* Change directive literal quotes if it doesn't contain quotes
This addresses https://github.com/prettier/prettier/pull/1560#discussion_r115396257
From https://github.com/prettier/prettier/issues/1555#issue-227206837:
> It's okay to change the type of quotation marks used, but only if
doing so does not require changing any characters within the directive.
* Don't change directive literal quotes if it contains a backslash
This passes the `--debug-check` tests again:
prettier tests/quotes/strings.js --debug-check
* Try to add regression test for escaped directive literals
This seems not to work, despite the following command having the correct
output:
echo "'\''" | prettier
You can use the following to get an idea of how flow/typescript parse
this:
node -p "JSON.stringify(require('./src/parser').parse('\\'\\\\\'\\'', {parser: 'flow'}), null, 2)"
node -p "JSON.stringify(require('./src/parser').parse('\\'\\\\\'\\'', {parser: 'typescript'}), null, 2)"
* WIP Disable Flow/Typescript for ./tests/directives
We don't yet handle escaped directives for them, but Babylon works.
(similar to https://github.com/prettier/prettier/pull/602/commits/90bf93713c78a6a6b3f55e52d7be172ece9b56df#diff-0de18284f37da79ab8af4e4690919abaR1)
* Revert "WIP Disable Flow/Typescript for ./tests/directives"
This reverts commit 2aba6231271f6985a395c31e3df9323e8f3da115.
* Prevent test strings from being parsed as directives
See https://github.com/prettier/prettier/pull/1560#issue-227225960
* Add more escaped directive tests
* Infer DirectiveLiterals from Flow parser
* Don't test TypeScript on directives
See https://github.com/prettier/prettier/pull/1560#issuecomment-300296221
* fixup! Infer DirectiveLiterals from Flow parser
* Don't fake objects that look like a DirectiveLiteral
Instead, add a flag to nodeStr() that deals with the Flow node
accordingly. See https://github.com/prettier/prettier/pull/1560#discussion_r115605758
* Print preferred quotes around escaped DirectiveLiteral when it doesn't contain quotes
See https://github.com/prettier/prettier/pull/1560#discussion_r115606122
* Simplify `canChangeDirectiveQuotes` logic
* Add directive test with unnecessarily escaped non-quote character
* Fix boolean logic error
I thought that this would result in the following if-block executing, as
needed to pass the test case in the previous commit. However, it appears
that it's not actually needed to pass the test case, since `makeString`
doesn't unescape unnecessarily escaped non-quote characters.
Nevertheless, I think we should leave that if-block (`if (canChangeDirectiveQuotes)`)
there, in case `makeString` is updated.
See https://github.com/prettier/prettier/pull/1571#discussion_r115658398
* Make isFlowDirectiveLiteral a separate argument to nodeStr()
See https://github.com/prettier/prettier/pull/1571#discussion_r115810988
* Simplify isFlowDirectiveLiteral logic by passing n.expression to nodeStr()
See https://github.com/prettier/prettier/pull/1571#discussion_r115811216
2017-05-10 22:15:27 +03:00
|
|
|
|
'\'';
|
|
|
|
|
'\"';
|
|
|
|
|
"\'";
|
|
|
|
|
"\"";
|
|
|
|
|
'\\';
|
|
|
|
|
'\a';
|
2017-05-11 02:02:49 +03:00
|
|
|
|
"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 still stay escaped)'
|
|
|
|
|
|
|
|
|
|
// Meaningful escapes
|
|
|
|
|
// Commented out to avoid `SyntaxError: Octal literals are not allowed in strict mode.`
|
|
|
|
|
// "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 \
|
|
|
|
|
'
|
2018-12-08 13:28:29 +03:00
|
|
|
|
'escaped carriage return \
|
2017-05-11 02:02:49 +03:00
|
|
|
|
'
|
|
|
|
|
'escaped \u2028 \
'
|
|
|
|
|
'escaped \u2029 \
'
|