* intermediate save
* add note saying where OptionParser is used in coffee command
* add some more work
* fix flatten functions
* refactor tests
* add basic test
* remove unused file
* compilation now hangs
* remove unnecessary changes
* add tests!!!
* clarify a test
* bound method runtime check
* restore bound method tests
* bound method tests
* test bound method in prop-named class
* run check against parent class
* dummy commit
* remove comment
* rename to boundMethodCheck
* fixes from code review
* use ref to own class for check
* fixes from code review
* remove unneeded param
* CSX implementation
* fixed comment, used toJS, added error tests, fixed error in identifier regex, fixed interpolation inside attributes value and added test
* added missing test for bare attributes, split attribute and indentifier regex, fixed checking for closing tags closing angle bracket
* Refactor tests that compare expected generated JavaScript with actual generated JavaScript to use common helper; add colors to error message to make differences easier to read
* Better match the style of the rest of the codebase
* Remove unused function
* More style fixes
* Allow unspaced less-than operator when not using CSX
* Replace includesCSX with a counter and simplify the unspaced operator logic
* Fixed indexing and realized that I completely enabled the tight spacing, added a test for it too
* Style fixes
* Start with the test I want to pass: return an implicit (braces-less) object
* Update Rewriter class to follow pattern of nodes.coffee; move debugging snippet to where it’ll work in CS2
* Allow export default implicit object
* `return` assumes a continuation onto the next line *if* the next line is indented
* Fix comment; improve test
Bound methods are implemented as assignments to `this` in the
constructor. In derived classes, where `this` is unavailable until
after `super` has been called, the binding is applied and assigned after
the `super` call. This means that any references to 'bound' methods
reachable from the parent constructor will actually point to the unbound
prototype methods.
This can lead to very subtle bugs where a method that is thought to be
bound is handed off and later called with an incorrect context, and the
only defence is for users to be vigilant about referencing bound methods
in constructors.
* Uncomment module test that was waiting for classes to be supported
* Rely on native indexOf
* Replace `bind` helper with native `bind` (no shortcut necessary)
* Update output
* Update modules class tests
* Remove helper for prototype extends
* Update docs to reflect removed extends operator
* Add shortcut for splice, like we have for slice
* Fix parenthesized conditions in if-else assignment
* Add compiled output
* Use ‘is’ instead of ‘==‘; ‘right’ is a poor name when you mean ‘correct,’ not the right-hand side of the assignments in this test
Added the missing '#'s for correct string interpolation. Seems like this went unnoticed because in these test cases, the `check` function tests if the compilation fails, which it does either way.
* Reimplement `invertLiterate` without any dependency, tracking indentation levels (including inside lists); update literate test files to also check that no tests are skipped
* Drop Literate CoffeeScript’s support for executable code blocks inside list items (and also for second paragraphs or blockquotes in list items)
* Update Literate CoffeeScript docs to reflect current supported syntax
* Throw an error for ambiguous `get` or `set` function calls or ES5 getter/setter keywords, to warn the user to use parentheses if they intend a function call (or to inform them that `get` or `set` cannot be used as a keyword)
* Code golf
* Catch get or set keyword before static method
* DRY up getting the previous token
* Throw an error if get or set are used as keywords before what looks like a function or method with an interpolated/dynamic name
* Allow `get` or `set` parentheses-less function calls when first argument is a string without a colon (so a plain string, not a property accessor)
* Revert "Allow `get` or `set` parentheses-less function calls when first argument is a string without a colon (so a plain string, not a property accessor)"
This reverts commit 2d1addf5a4.
* Optimization
* No longer throw an error on `get` or `set` function calls to objects with dynamic property names (introduces a way to circumvent our check for trying to avoid the `get` or `set` keywords, but not worth the complications for this tiny edge case)
* Output simple array destructuring assignments to ES2015
* Output simple object destructured assignments to ES2015
* Compile shorthand object properties to ES2015 shorthand properties
This dramatically improves the appearance of destructured imports.
* Compile default values in destructured assignment to ES2015
* Rename `wrapInBraces` to `wrapInParentheses`, and `compilePatternMatch` to `compileDestructuring`, for clarity; style improvements (no `==` or `!=`, etc.)
* Don’t confuse the syntax highlighter
* Comment Assign::compilePatternMatch a bit
* Assignment expressions in conditionals are a bad practice
* Optional check for existence that only checks `!== undefined`, not `!= null`, to follow ES convention that default values only apply when a variable is undefined, not falsy
* Add comments; remove unnecessary array splats in function tests
* The fallback destructuring code should apply default values only if `undefined`, not falsy, to follow ES spec
* Support destructuring in function parameters (first pass); catch destructured reserved words
* Destructured variables in function parameter lists shouldn’t be added to the function body with `var` declarations; treat splat array function parameters the legacy way to avoid rethinking #4005
* Remove redundancy in undefined-only check for existence; fix passing option to check
* Fix undefined redundancy
* Simplify getting the variable name
* Reimplement “check for existence if not undefined” without creating a new operator
* `Obj::isAssignable` should not mutate; pass `lhs` property in from `Assign` or `Code` to child arrays and objects so that those child nodes are set as allowable for destructuring
* Revert changes to tests
* Restore revised test for empty destructuring assignment
* Add tabbed literate test; modernize Markdown title heading
* Better parsing of Literate CoffeeScript files, including now correct parsing of tabbed .litcoffee files; and more accurate stack traces (assuming you don’t do your own word wrapping within list items)
* Swap Marked for MarkdownIt for parsing the Markdown of Literate CoffeeScript files; use MarkdownIt’s `map` property to preserve correct line numbers
* Literate CoffeeScript tests: remove trailing whitespace, fix spelling
* Literate CoffeeScript tests: add block quote test
* Literate CoffeeScript (tabbed, at least) seems to need a consistent starting indentation
* Restore test
* Reference links work now in MarkdownIt
* Breaking change in Literate CoffeeScript: code blocks within HTML tags must be unindented
* Breaking change in Literate CoffeeScript: code blocks within lists need a blank line separating them from the list item text
* Node comes with NPM nowadays, so there’s not really a reason to install CoffeeScript the non-NPM way
* The cake documentation tasks should each have build and watch modes following the same form
* Refactor the build tasks to be more foolproof, including the parser unless it’s explicitly excluded
* Abstract out testing built code, to prepare for watching the build task
* Cake task to cut a new release
* cake build:watch, based on https://github.com/GeoffreyBooth/coffeescript-gulp
* Coding style
* Tests shouldn’t write files in a watched folder
* Don’t crash if the REPL test history file is already gone by the time we try to delete it
This is an upstream port of https://github.com/decaffeinate/coffeescript/pull/24
In a case like `new A().b(c)`, the jison structure ends up being different from
the resulting AST. To the jison parser, this is the `new` unary operator applied
to the expression `A().b(c)`. When the unary operator is applied, the
`Call.prototype.newInstance` function traverses into the leftmost function call
and sets the `isNew` flag to true, and the `Op` constructor returns the `Call`
node so that the call is used in place of the unary operator. However, the code
wasn't updating the node location data, so this commit fixes that.
It's sort of hard to get the location data in `newInstance`, so we set a flag on
every affected node in `newInstance` and override `updateLocationDataIfMissing`
(which is called with the location data after the fact) so that it updates just
the starting position.
This is an upstream port of https://github.com/decaffeinate/coffeescript/pull/17
The lexer generates fake tokens for interpolated heregexes, and the ending
tokens were being placed where the start (inclusive) and end (inclusive) index
were one past the end of the heregex. This meant that in a case like
`[a ///#{b}///]`, the end tokens of the heregex and also the implicit function
call end were all being placed at the `]`, so the AST location data would say
that the function call ends at the end of the `]`.
To fix, I can just subtract 1 from the position of those ending heregex tokens
so that their end lines up with the end of the heregex itself. This is similar
to previous fixes that changed `OUTDENT` and `CALL_END` tokens so that the end
of the token lines up with the end of the AST node.
* Compile all super calls to ES2015 super
This breaks using `super` in non-methods, meaning several tests are
failing. Self-compilation still works.
* Use bound functions for IIFEs containing `super`
`super` can only be called directly in a method, or in an arrow
function.
* Fix handling of `class @A extends A`
This behaviour worked 'for free' when the parent reference was being
cached by the executable class body wrapper. There now needs to be
special handling in place to check if the parent name matches the class
name, and if so to cache the parent reference.
* Fix tests broken by compiling ES2015 `super`
* Disallow bare super
This removes syntax support for 'bare' super calls, e.g.:
class B extends A
constructor: -> super
`super` must now always be followed with arguments like a regular
function call. This also removes the capability of implicitly forwarding
arguments. The above can be equivalently be written as:
class B extends A
constructor: -> super arguments...
* Support super with accessors
`super` with following accessor(s) is now compiled to ES2015
equivalents. In particular, expressions such as `super.name`,
`super[name]`, and also `super.name.prop` are all now valid, and can be
used as expected as calls (i.e. `super.name()`) or in expressions (i.e.
`if super.name? ...`).
`super` without accessors is compiled to a constructor super call in a
constructor, and otherwise, as before, to a super call to the method of
the same name, i.e.
speak: -> super()
...is equivalent to
speak: -> super.speak()
A neat side-effect of the changes is that existential calls now work
properly with super, meaning `super?()` will only call if the super
property exists (and is a function). This is not valid for super in
constructors.
* Prevent calling `super` methods with `new`
This fixes a bug in the previous super handling whereby using the `new`
operator with a `super` call would silently drop the `new`. This is now
an explicit compiler error, as it is invalid JS at runtime.
* Clean up some old super handling code
This was mostly code for tracking the source classes and variables for
methods, which were needed to build the old lookups on `__super__`.
* Add TODO to improve bare super parse error
* Add some TODOs to improve some of the class tests