File tree 3 files changed +21
-4
lines changed
3 files changed +21
-4
lines changed Original file line number Diff line number Diff line change @@ -520,6 +520,7 @@ exports.Literal = Literal = (function(superclass){
520
520
if ( ! ( val = o . cascadee ) ) {
521
521
this . carp ( 'stray cascadee' ) ;
522
522
}
523
+ val . referred = true ;
523
524
}
524
525
return val ;
525
526
} ;
@@ -3134,11 +3135,18 @@ exports.Cascade = Cascade = (function(superclass){
3134
3135
}
3135
3136
prototype . children = [ 'target' , 'block' ] ;
3136
3137
prototype . terminator = '' ;
3138
+ prototype . makeReturn = function ( it ) {
3139
+ this . block . makeReturn ( it ) ;
3140
+ return this ;
3141
+ } ;
3137
3142
prototype . compileNode = function ( o ) {
3138
3143
var ref , t , b ;
3139
3144
this . temps = [ ref = o . scope . temporary ( 'x' ) ] ;
3140
3145
t = ref + ' = ' + this . target . compile ( o , LEVEL_LIST ) ;
3141
- b = this . block . compile ( ( o . cascadee = ref , o ) ) ;
3146
+ o . level && ( o . level = LEVEL_PAREN ) ;
3147
+ o . cascadee = new String ( ref ) ;
3148
+ b = this . block . compile ( o ) ;
3149
+ o . cascadee . referred || this . carp ( 'unreferred cascadee' ) ;
3142
3150
if ( o . level ) {
3143
3151
return "(" + t + ", " + b + ")" ;
3144
3152
} else {
Original file line number Diff line number Diff line change @@ -323,7 +323,9 @@ class exports.Literal extends Atom
323
323
case \debugger then if level
324
324
return "(function(){\n#TAB#{o.indent}debugger;\n#{o.indent}}())"
325
325
case \* then @carp 'stray star'
326
- case \& then @carp 'stray cascadee' unless val = o.cascadee
326
+ case \&
327
+ @carp 'stray cascadee' unless val = o.cascadee
328
+ val.referred = true
327
329
val
328
330
329
331
#### Var
@@ -1911,18 +1913,23 @@ class exports.Label extends Node
1911
1913
else it.compile o
1912
1914
1913
1915
#### Cascade
1914
- #
1916
+ # A construction that allows `&`-references to target expression.
1915
1917
class exports.Cascade extends Node
1916
1918
(@target, @block) ->
1917
1919
1918
1920
children: <[ target block ]>
1919
1921
1920
1922
terminator: ''
1921
1923
1924
+ makeReturn: -> @block.makeReturn it; this
1925
+
1922
1926
compileNode: (o) ->
1923
1927
@temps = [ref = o.scope.temporary \x]
1924
1928
t = ref + ' = ' + @target.compile o, LEVEL_LIST
1925
- b = @block.compile o <<< cascadee: ref
1929
+ o.level &&= LEVEL_PAREN
1930
+ o.cascadee = new String ref
1931
+ b = @block.compile o
1932
+ o.cascadee.referred or @carp 'unreferred cascadee'
1926
1933
if o.level then "(#t, #b)" else "#t;\n#b"
1927
1934
1928
1935
#### JS
Original file line number Diff line number Diff line change 444
444
ok &valueOf!
445
445
446
446
compileThrows 'stray cascadee' 2 '\n&'
447
+
448
+ compileThrows 'unreferred cascadee' 1 'a\n b'
You can’t perform that action at this time.
0 commit comments