mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
yield now behaves as expected around 'this' - fixes https://github.com/jashkenas/coffeescript/issues/3882
This commit is contained in:
parent
06b74591e7
commit
84c125a71b
3 changed files with 50 additions and 3 deletions
|
@ -87,7 +87,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
Base.prototype.compileClosure = function(o) {
|
Base.prototype.compileClosure = function(o) {
|
||||||
var args, argumentsNode, func, jumpNode, meth, parts;
|
var args, argumentsNode, func, jumpNode, meth, parts, ref3;
|
||||||
if (jumpNode = this.jumps()) {
|
if (jumpNode = this.jumps()) {
|
||||||
jumpNode.error('cannot use a pure statement in an expression');
|
jumpNode.error('cannot use a pure statement in an expression');
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,7 @@
|
||||||
func = new Value(func, [new Access(new Literal(meth))]);
|
func = new Value(func, [new Access(new Literal(meth))]);
|
||||||
}
|
}
|
||||||
parts = (new Call(func, args)).compileNode(o);
|
parts = (new Call(func, args)).compileNode(o);
|
||||||
if (func.isGenerator) {
|
if (func.isGenerator || ((ref3 = func.base) != null ? ref3.isGenerator : void 0)) {
|
||||||
parts.unshift(this.makeCode("(yield* "));
|
parts.unshift(this.makeCode("(yield* "));
|
||||||
parts.push(this.makeCode(")"));
|
parts.push(this.makeCode(")"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,7 +90,7 @@ exports.Base = class Base
|
||||||
meth = 'call'
|
meth = 'call'
|
||||||
func = new Value func, [new Access new Literal meth]
|
func = new Value func, [new Access new Literal meth]
|
||||||
parts = (new Call func, args).compileNode o
|
parts = (new Call func, args).compileNode o
|
||||||
if func.isGenerator
|
if func.isGenerator or func.base?.isGenerator
|
||||||
parts.unshift @makeCode "(yield* "
|
parts.unshift @makeCode "(yield* "
|
||||||
parts.push @makeCode ")"
|
parts.push @makeCode ")"
|
||||||
parts
|
parts
|
||||||
|
|
|
@ -218,3 +218,50 @@ test "symbolic operators has precedence over the `yield`", ->
|
||||||
mapped = CoffeeScript.eval "(arr) -> (#{expression} for i in arr)"
|
mapped = CoffeeScript.eval "(arr) -> (#{expression} for i in arr)"
|
||||||
|
|
||||||
arrayEq mapped(values), collect yielded values
|
arrayEq mapped(values), collect yielded values
|
||||||
|
|
||||||
|
test "yield handles 'this' correctly", ->
|
||||||
|
x = ->
|
||||||
|
yield switch
|
||||||
|
when true then yield => this
|
||||||
|
yield for item in [1]
|
||||||
|
yield => this
|
||||||
|
yield if true then yield => this
|
||||||
|
yield try throw yield => this
|
||||||
|
throw yield => this
|
||||||
|
|
||||||
|
y = x.call [1, 2, 3]
|
||||||
|
|
||||||
|
z = y.next()
|
||||||
|
arrayEq z.value(), [1, 2, 3]
|
||||||
|
ok z.done is false
|
||||||
|
|
||||||
|
z = y.next 123
|
||||||
|
ok z.value is 123 and z.done is false
|
||||||
|
|
||||||
|
z = y.next()
|
||||||
|
arrayEq z.value(), [1, 2, 3]
|
||||||
|
ok z.done is false
|
||||||
|
|
||||||
|
z = y.next 42
|
||||||
|
arrayEq z.value, [42]
|
||||||
|
ok z.done is false
|
||||||
|
|
||||||
|
z = y.next()
|
||||||
|
arrayEq z.value(), [1, 2, 3]
|
||||||
|
ok z.done is false
|
||||||
|
|
||||||
|
z = y.next 456
|
||||||
|
ok z.value is 456 and z.done is false
|
||||||
|
|
||||||
|
z = y.next()
|
||||||
|
arrayEq z.value(), [1, 2, 3]
|
||||||
|
ok z.done is false
|
||||||
|
|
||||||
|
z = y.next new Error "ignore me"
|
||||||
|
ok z.value is undefined and z.done is false
|
||||||
|
|
||||||
|
z = y.next()
|
||||||
|
arrayEq z.value(), [1, 2, 3]
|
||||||
|
ok z.done is false
|
||||||
|
|
||||||
|
throws -> y.next new Error "boom"
|
||||||
|
|
Loading…
Add table
Reference in a new issue