atom-nuclide
Version:
A unified developer experience for web and mobile development, built as a suite of features on top of Atom to provide hackability and the support of an active community.
84 lines (58 loc) • 2.16 kB
Markdown
# Reprint
Takes in an AST and pretty prints it.
```javascript
(function foo(someLongArgument, anotherLongArgument,
aThirdReallyLongArgumentNameThatCouldBreakThings) { dosomething()})(1, 2, 3);
(function bar(
a,
b,
c
){})();
```
Becomes:
```javascript
(function foo(
someLongArgument,
anotherLongArgument,
aThirdReallyLongArgumentNameThatCouldBreakThings,
) {
dosomething();
})(1, 2, 3);
(function bar(a, b, c) {})();
```
## Ideology
This only reprints the existing AST, it should not result in a change that
alters the AST in any way. Fixing the AST is the job of another tool.
### We do:
* Add trailing commas
* Add parens around the single argument in an arrow function
### We don't:
* Separate long string literals with `+` so the line can break
* May be worth doing this since it almost has to be done within a formatter,
it doesn't make much sense for this to be done as a transform with no context
of how the code will be printed.
* Switch the type of quotes around string literals
* This can change how things must be escaped
* Could potentially fix this by not considering `literal.raw` part of the AST,
but `literal.raw` is required in order to print integral number literals that
exceed `MAX_SAFE_INTEGER`
* Simplify unnecessary parenthesis around series of expressions
## Code Patterns and Terminology
### Simple
Simple means that no context is needed in order to produce the output. Nodes
below the tree rooted at the current node are not considered additional context.
### Complex
Complex means that context is required to produce the output. This means nodes
above, or siblings of the current node are required.
### Printer
A printer takes in a node and any context in order to produce an array of lines.
### Wrapper
A wrapper is similar to a printer except that it also takes in some already
printed lines.
### Resolver
A resolver works on lines and options (not the full context) in order to remove
markers.
### Marker
A marker is a special string that conveys some information to a resolver. It may
tell the resolver to add a space, or that it's okay to break at the current
location.