Commit Graph
19 Commits
Author SHA1 Message Date
Joseph Frazier 4e9cdc413c Extract util.isBlockComment() helper (#1602)
* Add trailing space when changing template literal line comment to block

This was originally part of https://github.com/prettier/prettier/pull/1580,
but I decided not to include it there, since it was unrelated.

* Extract util.isBlockComment() helper

* printer: Simplify genericPrintNoParens() JSXEmptyExpression logic

* Extract makeBlockComment() helper

* Move hasBlockComments() from printer to util

Addresses https://github.com/prettier/prettier/pull/1602#issuecomment-301344310

* Revert "Extract makeBlockComment() helper"

This reverts commit 7e940f43b62fb34d71fc3015ed14f9c59cf61d1a.

* Revert "Add trailing space when changing template literal line comment to block"

This reverts commit b3cf5b24c576ed062ca86975a09138e3f4ac9597.
2017-05-14 15:58:06 -07:00
Joseph Frazier f048ad3094 (Babylon) Allow return outside function (#1608)
This makes it easier to format code snippets including a `return`
statement, without having to format the entire function. For example,
given the following code:

```js
function f() {
    return someVeryLongStringA && someVeryLongStringB && someVeryLongStringC && someVeryLongStringD
}
```

a developer could select the line containing `return`, then use
prettier to format the code to:

```js
function f() {
return (
  someVeryLongStringA &&
  someVeryLongStringB &&
  someVeryLongStringC &&
  someVeryLongStringD
);
}
```

which can then be reindented by the editor.

---

Related to https://github.com/prettier/prettier/issues/593
2017-05-14 14:45:33 -07:00
Joseph Frazier f5c52890b5 Fix typo: parse -> parser (#1596) 2017-05-12 08:04:42 -07:00
Joseph Frazier 5ca2117d23 (Babylon) Fall back to non-strict mode (#1587)
* (Babylon) Fall back to non-strict mode

This makes Prettier a little less opinionated about linting. For
example, the following can now be formatted:

```js
function f(a,a){return a}
```

whereas before it would cause an error:

    stdin: SyntaxError: Argument name clash in strict mode (1:13)
    > 1 | function f(a,a){return a}
        |              ^

This also allows octal numbers to be parsed,
and therefore fixes https://github.com/prettier/prettier/issues/228

If the code parses neither as strict nor as non-strict, the error from the
strict parse is thrown (as it was before this change).

---

I noticed this while trying out [eslump] with prettier:

    eslump | pbcopy; pbpaste | prettier

[eslump]: https://github.com/lydell/eslump

* Add missing test

* Use Object.assign() instead of mutating object
2017-05-12 07:32:27 -07:00
Joseph Frazier b8b205691d (Flow) Extract helper functions (#1586)
* (Flow) Indicate that getters/setters use function notation

* (Flow) Extract isFunctionNotation() helper

* (Flow) Extract isGetterOrSetter() helper

* (Flow) Extract sameLocStart() helper
2017-05-11 16:29:31 -07:00
Joseph Frazier b3828eaee2 (Flow) Preserve getter/setter info on ObjectTypeProperty (#1585)
* (Flow) Preserve getter/setter info on ObjectTypeProperty

Before: `type T = { get method(): void }` -> `type T = { method: () => void };`

Demo: https://prettier.github.io/prettier/#%7B%22content%22%3A%22type%20T%20%3D%20%7B%20get%20method()%3A%20void%20%7D%22%2C%22options%22%3A%7B%22printWidth%22%3A80%2C%22tabWidth%22%3A2%2C%22singleQuote%22%3Afalse%2C%22trailingComma%22%3A%22none%22%2C%22bracketSpacing%22%3Atrue%2C%22jsxBracketSameLine%22%3Afalse%2C%22parser%22%3A%22flow%22%2C%22semi%22%3Atrue%2C%22useTabs%22%3Afalse%2C%22doc%22%3Afalse%7D%7D

---

After: `type T = { get method(): void }` -> `type T = { get method(): void };`

Demo: `echo 'type T = { get method(): void }' | prettier --stdin --parser flow`

Demo: `echo 'type T = { get method(): void }' | prettier --stdin --parser flow --debug-check`

---

This passes `AST_COMPARE=1 npm test -- tests/flow/getters_and_setters_* tests/flow/objectTypeProperty/`
and fixes https://github.com/prettier/prettier/issues/1557

* (Flow) Make getter/setter parsing more robust

Addresses https://github.com/prettier/prettier/pull/1585#discussion_r116008715
2017-05-11 08:04:54 -07:00
Joseph Frazier d7ec9dc706 Don't let trailing template literal comments escape (#1580)
* Don't let trailing template literal comments escape

This might not be the best-looking solution, but it's a start, and it
passes `AST_COMPARE=1 npm test`

Fixes https://github.com/prettier/prettier/issues/1559

* Add trailing space when changing line comment to block

* Be more discerning about template literal comment placement

Try to maintain the previous behavior if possible.

* Revert "Add trailing space when changing line comment to block"

This reverts commit 1eb42c24819a296c93a79b92a358d30a2aacc16c.
2017-05-10 21:07:55 -07:00
Joseph Frazier d4217f5508 Unescape unnecessarily escaped characters in strings (#1575)
* 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
2017-05-10 16:02:49 -07:00
Joseph Frazier 8cc38ad524 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 12:15:27 -07:00
Joseph Frazier 8ce393a425 Remove trailing whitespace from src/ and markdown files (#1576) 2017-05-10 08:15:11 -07:00
Joseph Frazier 32d9d68154 Print directive literals verbatim (#1560)
* 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
2017-05-09 17:17:29 -04:00
Joseph Frazier ebe85917a3 Add warning about vanilla Vim integration, recommend Neoformat (#1568)
* Add warning about vanilla Vim integration

Fixes https://github.com/prettier/prettier/issues/743
Fixes https://github.com/prettier/prettier/issues/1191
Fixes https://github.com/prettier/prettier/issues/1466

* Recommend Neoformat over vanilla Vim integration

See https://github.com/prettier/prettier/issues/743
See https://github.com/prettier/prettier/issues/1191
See https://github.com/prettier/prettier/issues/1466

* Remove vanilla Vim integration from README

Since it's relatively broken, we don't want to recommend it.
See https://github.com/prettier/prettier/pull/1568#issuecomment-300270038

This also adds a TOC link for the "Other `autocmd` events" section,
which was previously missing.
2017-05-09 12:50:01 -07:00
Joseph Frazier c56a685e5d tests: Rename RUN_AST_TESTS variable to AST_COMPARE (#1563)
This makes it match the environment variable, which is consistent with
the other variables.
2017-05-09 13:32:01 -04:00
Joseph Frazier 225fa57780 Mention --debug-check in CLI section of README (#1562)
* Prevent using --write with --debug-check

This addresses https://github.com/prettier/prettier/issues/1552#issuecomment-300043294

* Exit with a non-zero code if --debug-check fails

This makes it easier to use programmatically. See
https://github.com/prettier/prettier/issues/1552#issuecomment-300042417

* Mention --debug-check in CLI section of README

This addresses https://github.com/prettier/prettier/issues/1552#issuecomment-300043294
2017-05-09 02:51:04 -07:00
Joseph Frazier 09fd8de526 Also run normal tests when AST_COMPARE=1 (#1561)
This makes it easier to just use `AST_COMPARE=1 npm test`, instead of
having to run `npm test` separately.
2017-05-08 20:23:51 -07:00
Joseph Frazier 18fd014985 Run AST comparison tests on Travis (#1553)
* Run AST comparison tests on Travis

It looks like some of these currently fail, so we should probably also
sort that out.

Inspired by https://github.com/prettier/prettier/issues/1552

* tests: Use specified parser when AST_COMPARE=1

This fixes some of the tests with AST_COMPARE=1

* Move cleanAST() into prettier.__debug

This makes it available for tests to use.

* AST_COMPARE=1 uses cleanAst() instead of removeEmptyStatements()

Ths fixes some of the tests with AST_COMPARE=1

* Export parse() from src/parser.js

This makes it available for tests to use.

* tests: Use specified parser more when AST_COMPARE=1

This is a continuation of commit 86437a66d326919897fe89891a25824870f5bb79

This fixes some of the tests with AST_COMPARE=1

* massageAST: remove leadingComments/trailingComments

This fixes some of the tests with AST_COMPARE=1

* massageAST: remove `extra`

This fixes some of the tests with AST_COMPARE=1

* tests_config/run_spec.js: Rename variables for clarity

* AST_COMPARE=1 tests compare unstringified objects

This makes the test error output shorter.

* fixup! Export parse() from src/parser.js

* Revert "Run AST comparison tests on Travis"

See https://github.com/prettier/prettier/pull/1553#issuecomment-300027747

This reverts commit 49873a956c532f23fd216551a35ae35c1a18407e.

* fixup! fixup! Export parse() from src/parser.js

* parser: Require babel-code-frame only when needed

This addresses:
* https://github.com/prettier/prettier/pull/1553#discussion_r115386253
* https://github.com/prettier/prettier/pull/1553#discussion_r115386250

* parser: Don't export now-unused parseWith* functions

Addresses https://github.com/prettier/prettier/pull/1553#discussion_r115386964

* Move cleanAST/massageAST into own file, don't export

This addresses:
* https://github.com/prettier/prettier/pull/1553#discussion_r115386993
* https://github.com/prettier/prettier/pull/1553#discussion_r115386611

* Don't destructure require() result (Node v4 compat.)

* Fix copy/paste error
2017-05-08 18:16:35 -07:00
Joseph Frazier 2ce6632082 Fix variable name in getParsersToVerify() (#1554)
It previously referred to an undefined variable.
2017-05-08 17:27:39 -07:00
Joseph Frazier dc499ba990 Add information about Vim's other autocmd events (#1333)
This lets you configure Vim to format your code even more frequently.
2017-04-18 15:30:16 -07:00
Joseph Frazier 652e2f90fb Add prettier_d to Related Projects (#1328)
`prettier_d` is like [eslint_d], but it runs `prettier` instead of
`eslint`. This eliminates the Node.js startup delay from all but the
first run of `prettier_d`, making it a snappier experience.

[eslint_d]: https://github.com/mantoni/eslint_d.js

Related discussion:
* https://github.com/prettier/prettier/issues/575#issuecomment-277368389
* https://github.com/prettier/prettier/issues/918#issuecomment-294130268
* https://github.com/prettier/prettier/pull/753#issuecomment-294339207
2017-04-18 13:27:36 -07:00