Commit Graph

156 Commits (3375cfe6050721d2f08956ecb056e3d33155975f)

Author SHA1 Message Date
Christopher Chedeau a6ec181566 Fix crash for single rest on class declaration (#315)
I thought I didn't need to check the length but forgot that the rest argument is not in the list for class declaration. Now it doesn't crash anymore and there's a test...
2017-01-19 10:01:31 -05:00
James Long a7405257ac Print binary and logical expressions in a nicer format (#262)
* Print binary and logical expressions in a nicer format (fixes #89)

* Improve algorithm (wip)

* Change grouping

* Final (hopefully?) pass at binary/logical expressions

* Update snapshots

* Add tests
2017-01-18 17:01:17 -05:00
Alex Rattray 52a44610be [JSX] Split elements on newlines and preserve whitespace (w/@yamafaktory) (#234) 2017-01-18 16:25:20 -05:00
Christopher Chedeau f79e838095 Fix trailing whitespace (#300)
In the printer, remove trailing whitespace except for template literals

Fixes #222
2017-01-18 15:38:33 -05:00
Michał Pierzchała 5199144878 Fix bracketSpacing typo in tests (#299) 2017-01-18 12:22:12 -08:00
Brian Ng 87b0ed3042 Fix parens around anonymous functions (#297) 2017-01-18 11:12:57 -08:00
Brian Ng c02bd6a8d5 Handle additional export default parens cases (#298) 2017-01-18 11:11:52 -08:00
Christopher Chedeau a8eb09553a Do not output trailing commas with rest arguments (#283)
It turns out that this is not valid by the spec!
2017-01-18 12:42:20 -05:00
Christopher Chedeau a123e31e82 Workaround flow parser bug with spread in arrays (#285)
The current output of

```js
[...a, ...b]
```

is

```js
[...a, , ...b]
```

because flow parses it as

```
ArrayExpression(SpreadExpression, null, SpreadExpression)
```

This is a bug in the flow parser. Until it gets fixed, we can workaround it by deleting the `null` after a `SpreadExpression`.
2017-01-18 12:14:14 -05:00
Brian Ng 083876e66d Fix missing semi when default exporting CallExpression (#287) 2017-01-18 09:03:31 -08:00
Brian Ng b94b86331f Ensure parens on NewExpression with function callee (#282) 2017-01-17 19:45:56 -08:00
James Long 8229355508 Fix path when printing member chains so parens work properly (fixes #243) (#281) 2017-01-17 22:39:47 -05:00
Christopher Chedeau 789a3029f4 Remove +1 from newline detection (#261)
* Remove +1 from newline detection

All the changes are related to spurious `;`. Sometimes the logic is more correct, sometimes less. Since `;` are going to be removed after the first save, I don't think it matters that much.

* Handle inconsistent `end` node locations when looking for newlines
2017-01-17 22:33:55 -05:00
Benjamin Tan bc9b1fde19 Add newline after shebang if necessary. (#215) 2017-01-17 17:16:40 -05:00
Christopher Chedeau 92795a0fda Fix space missing before `,` on import with bracket spacing off (#279)
Same fix as #278. We use the same (wrong) pattern in both places
2017-01-17 17:12:56 -05:00
Christopher Chedeau b580a18f30 Fix space missing before `,` on export with bracket spacing off (#278)
I copy and pasted the code for arrays which doesn't have this problem. Would be nice to come up with an abstraction for a list of stuff separated by commas. It happens a lot of time and right now it's duplicated everywhere.

Fixes #255
2017-01-17 17:12:42 -05:00
Christopher Chedeau b7455951e7 Workaround flow bug parsing astral unicode characters (#277)
According to @mroch, "Flow is using CESU-8, not UTF-8. http://www.unicode.org/reports/tr26/ ". While this is being fixed in flow, we can easily work around it inside of prettier. The downside of this approach is that we can't convert those strings to single or double quotes anymore.
2017-01-17 16:47:20 -05:00
Christopher Chedeau 0192d58bc5 Preserve the way numbers were written (#257)
The goal of the pretty printer is to make sure that the indentation is correct, not to dictate how numbers should be written :)
2017-01-16 23:01:51 -05:00
Brian Ng f0d2ad4508 Fix parens for functions inside TaggedTemplateExpression (#259) 2017-01-16 19:47:13 -08:00
Christopher Chedeau f603ca4688 Make sure empty for loops generate valid code (#224)
```js
for (;;);
function f() {}
```

The `;` was dropped meaning that the line right after was executed within the for loop which is not correct.

I tried to return `;` but it looks like

```js
for (;;)
  ;
```

which looks super weird so I ended up printing `{}` which looks like

```js
for (;;) {}
```
2017-01-16 12:54:39 -05:00
Christopher Chedeau 65a2a150b5 Fix last element of an array being null (#232)
This appears in so many of the test262.
2017-01-16 12:53:39 -05:00
Brian Ng d9ea466cd3 Fix FunctionExpression parens issues (#250) 2017-01-16 12:52:55 -05:00
Brian Ng 86c65d1f81 Fix missing parenthesis for typeof and arrow functions (#249) 2017-01-16 09:08:46 -08:00
Brian Ng 1c8414e894 Fix empty export with from clause (#248) 2017-01-16 08:58:23 -08:00
Christopher Chedeau 74bc9e7a4d Add newline for empty blocks {} (#205)
I find it weird to put `{}` together. So I figured I would change it to have an empty line and ask for feedback :)

![image](https://cloud.githubusercontent.com/assets/197597/21739279/062adc80-d44c-11e6-8bb7-5e0768f3ddde.png)

Beware: most of the test cases are not representative of real code, you almost never define blocks with no content in practice.
2017-01-16 11:31:32 -05:00
Christopher Chedeau c9af5a6c3b Escape strings using jsesc (#229)
The current implementation with `JSON.stringify()` is clever but unfortunately generates incorrect JavaScript. Using `jsesc` seems like a better and safer option. https://github.com/mathiasbynens/jsesc It doesn't have any dependencies and is pretty small.

I opted for escaping all the non ascii characters, so we don't display emojis anymore. I don't think that the world is ready yet for having random unicode characters inside of source files, there still are so many parts of the toolchain that breaks with them. If we want to revert back on this decision, there's a `minimal` option on jsesc which only escapes values that need to in order to generate valid JavaScript file (assuming the encoding of the file is set to utf8).

Also, while working on React Native, we've seen that there is an optimization inside of jsc for js files that are all ascii: it doesn't do a copy for the conversion to ucs16.

Fixes #163
2017-01-16 11:03:59 -05:00
Brian Ng b1138bdfd9 Fix parens issue with nested UrnaryExpressions (#237)
* Fix parens issue with nested UrnaryExpressions

* special case + and -
2017-01-16 07:51:16 -08:00
Brian Ng 470f80c17a Fix issue with ArrowFunctionExpression parens (#236) 2017-01-15 22:42:42 -08:00
Brian Ng 340a39b414 Fix cases of missing parens with NewExpression (#230) 2017-01-15 23:56:40 -05:00
Christopher Chedeau 0e1afd6312 Fix empty exports (#225)
```js
export {};
```

was printed as

```js
export
```

which is invalid.

This was discovered by #223
2017-01-15 23:53:41 -05:00
Christopher Chedeau c5d7619ad6 Remove faulty location check on template literals that throws in Nuclide (#218)
There's a handful of files inside of Nuclide that throw exceptions because an assertion is raised.

```
{ AssertionError: ']' === '`'
    at fixTemplateLiteral (/Users/vjeux/random/prettier/src/util.js:105:10)
    at Object.util.fixFaultyLocations (/Users/vjeux/random/prettier/src/util.js:45:5)
    at getSortedChildNodes (/Users/vjeux/random/prettier/src/comments.js:25:8)
    at getSortedChildNodes (/Users/vjeux/random/prettier/src/comments.js:61:5)
    at decorateComment (/Users/vjeux/random/prettier/src/comments.js:71:20)
    at decorateComment (/Users/vjeux/random/prettier/src/comments.js:85:7)
    at decorateComment (/Users/vjeux/random/prettier/src/comments.js:85:7)
    at decorateComment (/Users/vjeux/random/prettier/src/comments.js:85:7)
    at decorateComment (/Users/vjeux/random/prettier/src/comments.js:85:7)
    at /Users/vjeux/random/prettier/src/comments.js:129:5
```

When trying https://github.com/facebook/nuclide/blob/master/pkg/nuclide-task-runner/lib/main.js#L174

It throws in the fixTemplateLiteral method.

That method was added to fix https://github.com/benjamn/recast/issues/216 more than a year ago

```js
var x = {
  y: () => Relay.QL`
    query {
      ${foo},
      field,
    }
  `
};
```

I've checked (and added a test) and it now parses and prints correctly without that method. So it should be safe to remove.
2017-01-15 23:46:05 -05:00
Christopher Chedeau a4695b16f6 Last argument expansion works for arrow functions that return JSX (#211)
* Last argument expansion works for arrow functions that return JSX

Fixes #195

* Fixes #130
2017-01-15 00:04:50 -05:00
Christopher Chedeau b9d2d1aac5 Fix comma when an arrow function with no arguments breaks (#210)
Fixes #118
2017-01-14 23:55:38 -05:00
Christopher Chedeau 15cc3bb778 Fix key quotes omission for flow parser (#203)
```js
echo 'var { "key": val } = 1;' | ./bin/prettier.js --stdin --flow-parser
var { key: val } = 1;
```
2017-01-14 23:40:26 -05:00
Christopher Chedeau fe72aecce9 Fix parenthesis for UpdateExpression (#198)
```js
(this.x++).toString()
```

no longer drops the parenthesis
2017-01-14 23:37:57 -05:00
Benjamin Tan f70c9ec6d1 Don't break to new line if logical/loop statements are without brackets. (#194)
Closes #14.
2017-01-14 23:37:13 -05:00
Christopher Chedeau 281417ac1d Fix await parenthesis (#185)
This is the first time I'm adding something inside of fast-path so I'm not sure if it's correct, but it seems more correct than before!

Fixes #164
2017-01-14 23:12:17 -05:00
Christopher Chedeau 6f5df0e2b6 Change test to workaround babylon bug (#184)
Babylon has a bug where it doesn't escape DirectiveLiteral properly. Except for `'use strict';`, this never happens in real world code, so let's put strings in a array in order to workaround this bug and have the same output on both parsers.

https://github.com/babel/babylon/issues/289
2017-01-13 23:17:02 -05:00
Christopher Chedeau d8c51483fc Fix DeclareInterface (#182)
DeclareInterface (flow) and InterfaceDeclaration (babylon) are the same type so should behave the same way. I am using the same `declare` trick where I only add it if you are inside of a `declare module` block.
2017-01-13 23:15:30 -05:00
Christopher Chedeau b9a3e0650a Fix windows line-endings (#177)
The search for an empty line incorrectly does +1 which happens to be skipping a `\n`, but in case of windows line endings it skips the `\r` but sees a `\n` afterwards and incorrectly assumes that it is a empty line.

This doesn't change the behavior of doing +1 when there's not a line ending. Making it correct actually triggers a bunch of changes, where half of them are better and half of them regressions. So I'm going to send another pull request to fix that case.
2017-01-13 23:07:09 -05:00
Alex Rattray 47102bc3ef Add regression tests for long JSX Expression contents 2017-01-13 14:22:49 -05:00
Alex Rattray 4fe16bda4d Multiline JSX opening tag breaks children out too (for #73) 2017-01-13 14:22:49 -05:00
Alex Rattray 2e1e6eece2 JSX maintains spaces that matter (fixes #30 and thus part of #73) 2017-01-13 14:22:49 -05:00
Alex Rattray b09a02084f Break JSXOpeningElement between attributes (fixes #15) 2017-01-13 14:22:49 -05:00
Alex Rattray d91a28ef81 Wrap Stateless JSX Arrow Functions and Assignment in Parens (fixes part of #73) 2017-01-13 14:22:49 -05:00
Travis Jefferson 0b70a0f2a3 Numeric literal callees should keep parens (#141)
* Numeric literal callees should keep parens

* Remove isNumber check
2017-01-13 14:01:21 -05:00
Christopher Chedeau df99ae56b0 Add test for shebang and move to index.js (#170)
When looking into adding a test, I realized that the logic was inside of bin/prettier.js and therefore only applying to the cli. Moving it to index.js and adding a test so that it's more robust :)
2017-01-13 13:39:07 -05:00
Rogelio Guzman 4ebccef79d Add tests for trailingComma option 2017-01-13 13:25:13 -05:00
Rogelio Guzman 63c87b6cd0 Add tests for tabWiths option 2017-01-13 13:25:13 -05:00
Rogelio Guzman 7f9655e186 Add tests for quotes option 2017-01-13 13:25:13 -05:00
Rogelio Guzman e54b9806a3 Add tests for bracketSpacing option 2017-01-13 13:25:13 -05:00
Christopher Chedeau 3dcf46c77c Do not put spaces on empty for loop (#169)
```js
for (;;) {
```

instead of

```js
for (; ; ) {
```
2017-01-13 13:00:32 -05:00
Christopher Chedeau 8e0f97e410 Break multiline imports (#167)
Follows the same pattern as https://github.com/jlongster/prettier/pull/156/files

```js
echo "import { aaaaaaaa, bbbbbb, cccccc, dddddddd, eeeeeee, fffffffff, ggggggggg } from 'vjeux';" | ./bin/prettier.js --stdin
import {
  aaaaaaaa,
  bbbbbb,
  cccccc,
  dddddddd,
  eeeeeee,
  fffffffff,
  ggggggggg
} from "vjeux";
```
2017-01-13 12:59:33 -05:00
James Long fb9c1e8098 Fix misprinting of computed properties in method chains. (#157)
* Fix misprinting of computed properties in method chains.

Closes #23, #94.

* Fix snapshot conflict
2017-01-12 15:06:44 -05:00
James Long aab300844f Use group instead of conditionalGroup 2017-01-12 14:53:12 -05:00
Benjamin Tan 1549936e68 Break long `exports` into multiple lines.
Ref #19.
2017-01-12 14:38:22 -05:00
Christopher Chedeau afca3d7e7a Minimize string escapes
If there you are opting in for double quote but there's a string with a double quote in it, it's better to swap to a single quote to avoid having too many `\`. Note that if there are both single and double quotes in the string, we should use the default string instead.

Fixes #139
2017-01-12 07:44:16 -08:00
Christopher Chedeau a6cdede9f6 Always use double quotes for JSX and properly escape
JSX quotes are unfortunately using html escaping. Also, we should disregard the single-quote option for JSX quotes as we always want double quotes.
2017-01-11 11:40:24 -08:00
James Long 466d8509af Update snapshots 2017-01-11 11:54:28 -05:00
Benjamin Tan 24c3af8821 Remove trailing whitespace in broken arrow function expressions.
Closes #103.
2017-01-11 23:28:13 +08:00
James Long c2458e7dc9 Merge pull request #106 from demoneaux/fix-directives-newlines
Fix misprinting of directives.
2017-01-11 10:20:09 -05:00
James Long 00fad62c91 Regenerate snapshots 2017-01-11 10:16:38 -05:00
Benjamin Tan 030a70fd38 Fix misprinting of directives.
Closes #29.
2017-01-11 22:47:22 +08:00
Benjamin Tan d56365dd54 Add semicolons to `export` declarations.
Closes #22.
2017-01-11 20:43:27 +08:00
James Long 10a8cd9122 Merge pull request #45 from danharper/fix38
Print Flow types with no name (fixes #38)
2017-01-10 23:51:42 -05:00
James Long 34dc37a816 Merge pull request #67 from jmorrell/flow-type-declarations
Make union types pretty again
2017-01-10 23:38:27 -05:00
Dan Harper 7c21dd037f Fix import & export bracket spacing (fixes #24) 2017-01-11 00:32:57 +00:00
James Long 3f949907a0 Merge pull request #72 from michaelficarra/GH-71
fixes #71: don't indent block statements which are children of case clauses
2017-01-10 18:56:50 -05:00
James Long d2d6def9be Revert "fixes #49: omit new parens when it has no arguments"
This reverts commit b5392f9468.
2017-01-10 18:53:03 -05:00
Michael Ficarra 0461b3e6cd fixes #71: don't indent block stmts which are children of case clauses 2017-01-10 15:26:12 -08:00
James Long e3b41dd6ca Merge pull request #57 from michaelficarra/GH-56
fixes #56: indent cases inside switch statements
2017-01-10 17:49:46 -05:00
Dan Harper 867b829965 Print Flow types with no name (fixes #38) 2017-01-10 22:49:25 +00:00
James Long 321bd6a9fa Allow block-less arrow function expression to break (fixes #61) 2017-01-10 16:46:33 -05:00
Jeremy Morrell 9213d5ad7f First attempt at making union types prettier 2017-01-10 18:31:29 -03:00
Michael Ficarra fc521c4d03 fixes #56: indent cases inside switch statements 2017-01-10 12:03:36 -08:00
Michael Ficarra b5392f9468 fixes #49: omit new parens when it has no arguments 2017-01-10 11:14:39 -08:00
James Long a4643f1bae Add special case for comment at top of file; regenerate snapshots 2017-01-09 21:49:26 -05:00
James Long 892d070313 Only allow ArrowFunctionExpression types to break themselves in CallExpression's if they using a block 2017-01-09 14:01:14 -05:00
James Long 994432c193 Improve printing of comments 2017-01-09 13:47:02 -05:00
James Long aed3c1af71 Handle curly brackets in SwitchCase types 2017-01-09 12:07:39 -05:00
James Long bcd44b4368 Keep blank lines from original source 2017-01-09 09:46:09 -05:00
James Long c10681d148 Pull out special chain printing into utility function 2017-01-08 14:44:44 -05:00
James Long d5ab6ab921 Detect chained call expressions and format them specifically 2017-01-08 13:56:57 -05:00
James Long 5c39dc02e6 Improve intersection and union type annotation 2017-01-05 14:43:05 -05:00
James Long 7b0ec6d935 Break ternary ops across newlines if needed 2017-01-05 12:32:56 -05:00
James Long fcd5436b38 Improve if/else printing and other clauses 2017-01-05 12:10:14 -05:00
James Long 835befebf5 Always output comment newlines, fix edge case with function param output 2017-01-04 22:26:46 -05:00
James Long b550f1d088 Use , to separate type fields instead of ; 2017-01-04 17:26:44 -05:00
James Long 8326963f2d Add option to include spaces inside object/array literals, default to false 2017-01-04 17:23:07 -05:00
James Long 98fef67b4e Fix a bug with expanding function args by passing group opts properly 2017-01-04 17:08:28 -05:00
James Long 898009ba66 Consistently print function parameters the correct way 2017-01-04 16:52:49 -05:00
James Long 588c8ce7cd Add `conditionalGroup` to allow manually specifying multiple representations of a document; use it to support expanding last parameter of functions 2017-01-04 15:24:10 -05:00
James Long fa16988401 If function declaration is too long, break all args on separate lines; also fix small bug in output cleansing 2017-01-01 20:33:53 -05:00
James Long 37601b0a86 Update snapshots 2017-01-01 20:20:45 -05:00
James Long c9e24eb477 Add spaces around certain statements, add --write option, and more 2016-12-30 23:01:07 -05:00
James Long 7ea2348b03 Various fixes with destructuring default, JSX, and more; all tests pass! 2016-12-30 17:00:11 -05:00
James Long 32d4200f60 Wrap class expressions in parens if needed 2016-12-30 14:25:52 -05:00
James Long 4dfaf9da98 Fix a few parens detection and more predicates 2016-12-30 14:10:52 -05:00
James Long ed57110ef5 Add type parameters on anon functions 2016-12-30 13:41:45 -05:00
James Long e972a7f0b6 Fix object and predicate annotations 2016-12-30 13:32:43 -05:00