diff --git a/TODO.md b/TODO.md new file mode 100644 index 00000000..2c1aa3f6 --- /dev/null +++ b/TODO.md @@ -0,0 +1,65 @@ +# TODO + +* Tests +* Test for `"use strict"` directive in function not being moved up to outside `with ()` +* TODO comments +* Deal with `with` in `eval()` - or is this done already? + +* Freeze `this` + +Mostly fixed now (except where `this` implicitly used by `super`) but needs tests. + +e.g. this produces wrong result: + +```js +function f() { + with ({y: 1, this$0: {x: 2}}) { + return () => y + this.x; + } +} +module.exports = f.call({x: 1}); +``` + +produces: + +```js +module.exports = (this$0 => with$0 => { + with (with$0) return () => y + this$0.x; +})({x: 1})({y: 1, this$0: {x: 2}}); +``` + +* Fix `arguments`. e.g.: + +Now fixed I think, but need tests. + +```js +function f() { + with ({}) { + return () => arguments[0]; + } +} +module.exports = f(1); +``` + +produces: + +```js +module.exports = (_arguments => (() => with$0 => { + with (with$0) return () => arguments[0]; +}).apply(0, _arguments))(function () { + return arguments; +}(1))({}); +``` + +Problem is `() => with$0` needs to be a full function `function () { return with$0 => { ... } }`. + +* Support interaction with const violations + +e.g. How to deal with this? Whether `x = 2` is a const violation depends on whether `obj` has a property called `x` or not. + +```js +const x = 1; +with (obj) { + module.exports = () => { x = 2; }; +} +```