4105 Commits

Author SHA1 Message Date
Simon Lydell
c3f5b8db86 Replace .npmignore with "files": [...] in package.json 1.11.0 2016-09-24 14:26:46 +02:00
Simon Lydell
2923e88207 Merge pull request #4315 from lydell/1.11.0 2016-09-24 14:18:33 +02:00
Simon Lydell
66b5203689 CoffeeScript 1.11.0 2016-09-24 14:16:00 +02:00
Simon Lydell
e908fd4a91 Styling fixes for the documentation 2016-09-24 14:15:54 +02:00
Simon Lydell
ab97e2224e Add changelog for version 1.11.0 2016-09-24 14:15:54 +02:00
Simon Lydell
f6bc4b4c32 Update CLI flags documentation 2016-09-24 14:01:41 +02:00
Geoffrey Booth
a8b77fb4e7 Add modules documentation (#4309) 2016-09-18 20:54:44 +02:00
Simon Lydell
7667cb2370 Merge pull request #4308 from GeoffreyBooth/import-export
Be much more careful about parsing `*` in import and export statements
2016-09-15 17:20:07 +02:00
Geoffrey Booth
51f24e0641 Be much more careful about parsing * in import and export statements; handle export expressions that use * on the same line as export 2016-09-14 23:30:58 -07:00
Simon Lydell
9ae377b481 Fix source maps for errors thrown from .coffee.md files
Before:

```
$ cat tmp.coffee.md
test

    a
$ ./bin/coffee tmp.coffee.md
ReferenceError: a is not defined
  at Object.<anonymous> (/src/coffee-script/tmp.coffee.md:2:3)
  ...
```

Note how the line and column numbers (2 and 3, respectively) are not
correct.

After:

```
$ ./bin/coffee tmp.coffee.md
ReferenceError: a is not defined
  at Object.<anonymous> (/home/lydell/forks/coffee-script/tmp.coffee.md:3:5)
  ...
```

Line 3, column 5 is the actual position of the `a` in tmp.coffee.md.

Supersedes and fixes #4204.
2016-09-14 21:45:06 +02:00
Simon Lydell
0e0e8f87e1 Fix CLI crash when null is thrown
Before:

```
$ ./bin/coffee -e 'throw null'
/src/coffee-script/lib/coffee-script/command.js:251
      message = err.stack || ("" + err);
                   ^

TypeError: Cannot read property 'stack' of null
  at compileScript ...
```

After:

```
$ ./bin/coffee -e 'throw null'
null
```

Supersedes and closes #4135.
2016-09-14 21:33:36 +02:00
Simon Lydell
ec9c4d8594 Merge pull request #4291 from alangpierce/fix-outdent-location-data
Fix incorrect location data in OUTDENT nodes
2016-09-14 21:21:25 +02:00
Geoffrey Booth
66ac8af678 Support import and export of ES2015 modules (#4300)
This pull request adds support for ES2015 modules, by recognizing `import` and `export` statements. The following syntaxes are supported, based on the MDN [import](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) and [export](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export) pages:

```js
import "module-name"
import defaultMember from "module-name"
import * as name from "module-name"
import { } from "module-name"
import { member } from "module-name"
import { member as alias } from "module-name"
import { member1, member2 as alias2, … } from "module-name"
import defaultMember, * as name from "module-name"
import defaultMember, { … } from "module-name"

export default expression
export class name
export { }
export { name }
export { name as exportedName }
export { name as default }
export { name1, name2 as exportedName2, name3 as default, … }

export * from "module-name"
export { … } from "module-name"
```

As a subsitute for ECMAScript’s `export var name = …` and `export function name {}`, CoffeeScript also supports:
```js
export name = …
```

CoffeeScript also supports optional commas within `{ … }`.

This PR converts the supported `import` and `export` statements into ES2015 `import` and `export` statements; it **does not resolve the modules**. So any CoffeeScript with `import` or `export` statements will be output as ES2015, and will need to be transpiled by another tool such as Babel before it can be used in a browser. We will need to add a warning to the documentation explaining this.

This should be fully backwards-compatible, as `import` and `export` were previously reserved keywords. No flags are used.

There are extensive tests included, though because no current JavaScript runtime supports `import` or `export`, the tests compare strings of what the compiled CoffeeScript output is against what the expected ES2015 should be. I also conducted two more elaborate tests:

* I forked the [ember-piqu](https://github.com/pauc/piqu-ember) project, which was an Ember CLI app that used ember-cli-coffeescript and [ember-cli-coffees6](https://github.com/alexspeller/ember-cli-coffees6) (which adds “support” for `import`/`export` by wrapping such statements in backticks before passing the result to the CoffeeScript compiler). I removed `ember-cli-coffees6` and replaced the CoffeeScript compiler used in the build chain with this code, and the app built without errors. [Demo here.](https://github.com/GeoffreyBooth/coffeescript-modules-test-piqu)
* I also forked the [CoffeeScript version of Meteor’s Todos example app](https://github.com/meteor/todos/tree/coffeescript), and replaced all of its `require` statements with the `import` and `export` statements from the original ES2015 version of the app on its `master` branch. I then updated the `coffeescript` Meteor package in the app to use this new code, and again the app builds without errors. [Demo here.](https://github.com/GeoffreyBooth/coffeescript-modules-test-meteor-todos)

The discussion history for this work started [here](https://github.com/jashkenas/coffeescript/pull/4160) and continued [here](https://github.com/GeoffreyBooth/coffeescript/pull/2). @lydell provided guidance, and @JimPanic and @rattrayalex contributed essential code.
2016-09-14 20:46:05 +02:00
Alan Pierce
feb42e5128 Add a test that tokens have locations that are in order 2016-08-01 20:28:56 -07:00
Alan Pierce
bd0024a9c2 Fix incorrect location data in OUTDENT nodes
In f609036bee, a line was changed from
`if length > 0 then (length - 1) else 0` to `Math.max 0, length - 1`. However,
in some cases, the `length` variable can be `undefined`. The previous code would
correctly compute `lastCharacter` as 0, but the new code would compute it as
`NaN`. This would cause trouble later on: the end location would just be the end
of the current chunk, which would be incorrect.

Here's a specific case where the parser was behaving incorrectly:
```
a {
  b: ->
    return c d,
      if e
        f
}
g
```

The OUTDENT tokens after the `f` had an undefined length, so the `NaN` made it
so the end location was at the end of the file. That meant that various nodes in
the AST, like the `return` node, would incorrectly have an end location at the
end of the file.

To fix, I just reverted the change to that particular line.
2016-07-29 20:42:08 -07:00
Simon Lydell
133fadd36a Merge pull request #4289 from GeoffreyBooth/fix-typos
Fix misspellings
2016-07-25 09:42:19 +02:00
Geoffrey Booth
a5980247dc Fix misspellings 2016-07-24 20:37:37 -07:00
Simon Lydell
ec333a061b Merge pull request #4274 from lydell/for-variables
Improve naming of generated 'i-variables'
2016-06-19 12:00:33 +02:00
Simon Lydell
0247b135f8 Improve naming of generated 'i-variables'
In for example `for` loops, a variable called `i` is generated (for the
loop index). If that name is unavailable, `j` is used instead, then `k`,
`l`, etc. all the way to `z`. Then, `aa`, `ab`, `ac` etc. are used.

This meant that, eventually, `do` would be used, but that's not a valid
variable name since `do` is a JavaScript keyword.

This logic was also inefficiently implemented. For example, going from
`aa` to `ab` or from `az` to `ba` required lots of loop iterations.

This commit changes the variable naming convention. Now, `i`, `j`, `k`,
etc. to `z` are used like before. Then comes `i1`, `j1`, `k1`, etc. Then
`i2`, `j2`, `k2` and so on. This is simpler, efficient and easier to
understand. `i1` is more obvious to be a loop index than `aa`.

Fixes #4267.
2016-06-10 08:58:18 +02:00
Simon Lydell
d7e752bc5d Fix failing source map tests
This should have been done in commit 841b3cd2, but I forgot to. Since
that commit, `SourceMap::generate` returns an object instead of
`JSON.stringify()` of that object, but the tests still compared strings.

Fixes #4269.

Note: `SourceMap::generate` is only used internally, so its change in
return type is not a breaking change. The "public API" is unchanged.
2016-06-02 09:04:58 +02:00
Ben Buckman
7c2f348a63 Fix 'Error: EBADF: bad file descriptor, write' on .exit in REPL
Fixes issue #4252.
2016-04-14 09:24:21 -07:00
Michael Ficarra
88192c197a Merge pull request #4226 from eventualbuddha/patch-1
Fix typo.
2016-03-09 09:39:56 -08:00
Brian Donovan
d7385ece46 Fix typo. 2016-03-09 09:30:20 -08:00
Michael Ficarra
e318469cb0 Merge pull request #4219 from lydell/infinity-nan
Treat Infinity and NaN as reserved words
2016-03-07 09:04:51 -08:00
Michael Ficarra
6291b53492 Merge pull request #4223 from lydell/inline-maps
Improve inline source maps generation
2016-03-06 07:33:10 -08:00
Simon Lydell
841b3cd2ad Improve inline source maps generation
- Inline source maps are now shorter by not using pretty-printed JSON.
- `.register()`ed files are now given more information in their inline source
  maps: The name and contents of the source file.
- Some code cleanup.

If you decode the inline source map generated (when using `.register()`) for a
file test.coffee with the contents `console.log "it works!"`, here is the
output:

Before:

    {
      "version": 3,
      "file": "",
      "sourceRoot": "",
      "sources": [
        ""
      ],
      "names": [],
      "mappings": "AAAA;EAAA,OAAO,CAAC,GAAR,CAAY,eAAZ;AAAA"
    }

After:

    {"version":3,"file":"","sourceRoot":"","sources":["test.coffee"],"names":[],"mappings":"AAAA;EAAA,OAAO,CAAC,GAAR,CAAY,WAAZ;AAAA","sourcesContent":["console.log \"it works!\"\n"]}

Related: #4214.
2016-03-06 14:41:26 +01:00
Simon Lydell
9a0babf5b1 Treat Infinity and NaN as reserved words
Fixes #4218.
2016-03-06 11:41:48 +01:00
Simon Lydell
cbc72a29bf Merge pull request #4220 from lydell/propertyliteral
Split out properties from identifiers
2016-03-06 10:57:31 +01:00
Simon Lydell
e42fc47747 Split out properties from identifiers
- Split out a PROPERTY token from the IDENTIFIER token.
- Split out Property from the Identifier in the grammar.
- Split out PropertyLiteral from IdentifierLiteral.
2016-03-06 10:53:01 +01:00
Michael Ficarra
5b7ac32905 Merge pull request #4221 from lydell/assignment-errors
Unify, simplify and fixup assignment errors
2016-03-06 01:41:51 -08:00
Simon Lydell
4d8cd03298 Unify, simplify and fixup assignment errors
- Show the same type of error message for compound assignment as for `=`
  assignment when the LHS is invalid.
- Show the same type of error message when trying to assign to a CoffeeScript
  keyword as when trying to assign to a JavaScript keyword.
- Now longer treat `&& =` as `&&=`. The same goes for `and=`, `||=` and `or=`.
- Unify the error message to: `<optional type> '<value>' can't be assigned`.
2016-03-06 10:33:30 +01:00
Michael Ficarra
585932cf5b compile InfinityLiterals to 2e308 2016-03-05 08:35:26 -08:00
Michael Ficarra
8afb7cc95b Merge pull request #4198 from lydell/node-types
Refactor `Literal` into several subtypes
2016-03-05 08:20:19 -08:00
Simon Lydell
021d2e4376 Refactor Literal into several subtypes
Previously, the parser created `Literal` nodes for many things. This resulted in
information loss. Instead of being able to check the node type, we had to use
regexes to tell the different types of `Literal`s apart. That was a bit like
parsing literals twice: Once in the lexer, and once (or more) in the compiler.
It also caused problems, such as `` `this` `` and `this` being indistinguishable
(fixes #2009).

Instead returning `new Literal` in the grammar, subtypes of it are now returned
instead, such as `NumberLiteral`, `StringLiteral` and `IdentifierLiteral`. `new
Literal` by itself is only used to represent code chunks that fit no category.
(While mentioning `NumberLiteral`, there's also `InfinityLiteral` now, which is
a subtype of `NumberLiteral`.)

`StringWithInterpolations` has been added as a subtype of `Parens`, and
`RegexWithInterpolations` as a subtype of `Call`. This makes it easier for other
programs to make use of CoffeeScript's "AST" (nodes). For example, it is now
possible to distinguish between `"a #{b} c"` and `"a " + b + " c"`. Fixes #4192.

`SuperCall` has been added as a subtype of `Call`.

Note, though, that some information is still lost, especially in the lexer. For
example, there is no way to distinguish a heredoc from a regular string, or a
heregex without interpolations from a regular regex. Binary and octal number
literals are indistinguishable from hexadecimal literals.

After the new subtypes were added, they were taken advantage of, removing most
regexes in nodes.coffee. `SIMPLENUM` (which matches non-hex integers) had to be
kept, though, because such numbers need special handling in JavaScript (for
example in `1..toString()`).

An especially nice hack to get rid of was using `new String()` for the token
value for reserved identifiers (to be able to set a property on them which could
survive through the parser). Now it's a good old regular string.

In range literals, slices, splices and for loop steps when number literals
are involved, CoffeeScript can do some optimizations, such as precomputing the
value of, say, `5 - 3` (outputting `2` instead of `5 - 3` literally). As a side
bonus, this now also works with hexadecimal number literals, such as `0x02`.

Finally, this also improves the output of `coffee --nodes`:

    # Before:
    $ bin/coffee -ne 'while true
      "#{a}"
      break'
    Block
      While
        Value
          Bool
        Block
          Value
            Parens
              Block
                Op +
                  Value """"
                  Value
                    Parens
                      Block
                        Value "a" "break"

    # After:
    $ bin/coffee -ne 'while true
      "#{a}"
      break'
    Block
      While
        Value BooleanLiteral: true
        Block
          Value
            StringWithInterpolations
              Block
                Op +
                  Value StringLiteral: ""
                  Value
                    Parens
                      Block
                        Value IdentifierLiteral: a
          StatementLiteral: break
2016-03-05 17:08:11 +01:00
Michael Ficarra
87216ea5b6 Merge pull request #4212 from nvignola/issue4042
Change a bad link in documentation issue#4042
2016-03-01 06:57:54 -08:00
nvignola
f80a8a5120 Change a bad link in documentation 2016-02-29 23:00:27 +00:00
Michael Ficarra
9590ad7622 Merge pull request #4199 from pra85/patch-1
Fix minor typo
2016-02-02 21:51:03 -08:00
Prayag Verma
402133a50e Fix minor typo
Remove extra `the`
2016-02-03 10:52:15 +05:30
Simon Lydell
34b4311544 Fix broken CoffeeScript.register() and commit build
Commit 347a6255 is a bit problematic:

- It doesn't include the built .js files.
- It breaks `CoffeeScript.register()`. This can be seen by running the tests;
  four of them fails. The error is that `CoffeeScript.register()` calls
  `CoffeeScript._compileFile()` with the `sourceMap` option enabled, which
  returns an object while the code expected a string.

This commit fixes the broken `CoffeeScript.register()`, by setting the
`sourceMap` option to `false` (but still keeping the `inlineMap` option enabled,
which was the intention of commit 347a6255). It also commits the built .js
files. The tests now pass.
2016-01-31 19:48:40 +01:00
Michael Ficarra
65c35e05a1 Merge pull request #4193 from DylanPiercey/master
Allow for external and inline sourcemap generation separately
2016-01-30 20:13:47 -08:00
Dylan Piercey
f7277c9de5 Allow for external and inline sourcemap generation separately 2016-01-30 21:09:19 -07:00
Jeremy Ashkenas
08129d0f1f Merge pull request #4111 from DylanPiercey/master
Add inline sourcemap support
2016-01-30 23:00:06 -03:00
Dylan Piercey
347a625525 Add inline sourcemap support 2016-01-23 12:58:22 -07:00
Michael Ficarra
2df011f378 Merge pull request #4180 from zhanzhenzhen/master
Fix #4178: an issue of processing Unicode characters in stdin
2016-01-12 08:54:45 -08:00
Zhenzhen Zhan
97882b8e49 Build for #4178 2016-01-13 00:49:45 +08:00
Zhenzhen Zhan
67b0f95d4d Fix #4178: an issue of processing Unicode characters in stdin 2016-01-12 19:16:19 +08:00
Simon Lydell
ce84924101 Fix invalid JS in one of the docs examples
Fixes #4175.
2016-01-07 08:22:59 +01:00
Simon Lydell
ae72dbb379 Fix scoping error in coffee-script.coffee
Closes #4167.
2016-01-07 07:53:53 +01:00
Michael Ficarra
b8403bfa97 Merge pull request #4146 from mvj3/minor-document-typos
Fixed minor document typos
2015-11-17 16:04:59 -08:00
David Chen
f179b20e6e Fixed minor document typos 2015-11-18 08:00:58 +08:00