@@ -1778,6 +1778,98 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){
17781778 var tmembers , tscope , tlvl , tself_def ;
17791779 member = member . clone ( ) ;
17801780
1781+ // @todo ("move to separated function")
1782+ if ( member instanceof Cola . AST_Cascade ) {
1783+ _ColaRuntime$$hash [ Cola . _ColaRuntime$$arguments_def . i ] = true ;
1784+
1785+ var props = {
1786+ type : "dynamic" ,
1787+ body : [ ] ,
1788+ argnames : [ new Cola . AST_ArgDef ( {
1789+ argtype : "positional" ,
1790+ type : "dynamic" ,
1791+ defval : new Cola . AST_Noop ( ) ,
1792+ name : new Cola . AST_SymbolFunarg ( { name : "_ColaRuntime$$expr" , start : member . expression . start , end : member . expression . end } )
1793+ } ) , new Cola . AST_ArgDef ( {
1794+ argtype : "positional" ,
1795+ type : "dynamic" ,
1796+ defval : new Cola . AST_Noop ( ) ,
1797+ name : new Cola . AST_SymbolFunarg ( { name : "arguments" , start : new Cola . AST_Token ( ) , end : new Cola . AST_Token ( ) } )
1798+ } ) ]
1799+ } ;
1800+
1801+ var Expr , Parent = false ;
1802+ member . subexpressions . forEach ( function ( expr ) {
1803+ Expr = expr , Parent = false ;
1804+ while ( true )
1805+ if ( expr instanceof Cola . AST_Call || expr instanceof Cola . AST_PropAccess ) {
1806+ Parent = expr ;
1807+ expr = expr . expression ;
1808+ } else
1809+ if ( expr instanceof Cola . AST_Binary ) {
1810+ Parent = expr ;
1811+ expr = expr . left ;
1812+ } else
1813+ if ( expr instanceof Cola . AST_Array || expr instanceof Cola . AST_ArrayRange || expr instanceof Cola . AST_SymbolRef ) break ;
1814+
1815+ if ( ! Parent ) {
1816+ if ( expr instanceof Cola . AST_Array || expr instanceof Cola . AST_ArrayRange ) Expr = new Cola . AST_Sub ( {
1817+ start : Expr . start ,
1818+ end : Expr . end ,
1819+ expression : new Cola . AST_SymbolRef ( { name : "_ColaRuntime$$expr" } ) ,
1820+ property : expr instanceof Cola . AST_ArrayRange ? expr : ( expr . elements . length == 0 ? new Cola . AST_Noop ( ) : expr . elements [ 0 ] )
1821+ } ) ; else
1822+ if ( expr instanceof Cola . AST_SymbolRef ) Expr = new Cola . AST_Dot ( {
1823+ start : Expr . start ,
1824+ end : Expr . end ,
1825+ expression : new Cola . AST_SymbolRef ( { name : "_ColaRuntime$$expr" } ) ,
1826+ property : Expr . name
1827+ } ) ;
1828+ } else {
1829+ if ( expr instanceof Cola . AST_Array || expr instanceof Cola . AST_ArrayRange )
1830+ expr = new Cola . AST_Sub ( {
1831+ start : expr . start ,
1832+ end : expr . end ,
1833+ expression : new Cola . AST_SymbolRef ( { name : "_ColaRuntime$$expr" } ) ,
1834+ property : expr instanceof Cola . AST_ArrayRange ? expr : ( expr . elements . length == 0 ? new Cola . AST_Noop ( ) : expr . elements [ 0 ] )
1835+ } ) ;
1836+ else
1837+ expr = new Cola . AST_Dot ( {
1838+ start : expr . start ,
1839+ end : expr . end ,
1840+ expression : new Cola . AST_SymbolRef ( { name : "_ColaRuntime$$expr" } ) ,
1841+ property : expr . name
1842+ } ) ;
1843+
1844+ if ( Parent instanceof Cola . AST_Call || Parent instanceof Cola . AST_PropAccess ) Parent . expression = expr ;
1845+ else
1846+ if ( Parent instanceof Cola . AST_Binary ) Parent . left = expr ;
1847+ }
1848+
1849+ props . body . push ( new Cola . AST_SimpleStatement ( {
1850+ start : Expr . start ,
1851+ end : Expr . end ,
1852+ body : Expr
1853+ } ) ) ;
1854+ } ) ;
1855+
1856+ props . body . push ( new Cola . AST_Return ( {
1857+ value : new Cola . AST_SymbolRef ( { name : "_ColaRuntime$$expr" } )
1858+ } ) ) ;
1859+
1860+ props = {
1861+ expression : new Cola . AST_Function ( props ) ,
1862+ property : "call"
1863+ } ;
1864+
1865+ member = new Cola . AST_Call ( {
1866+ start : member . start ,
1867+ end : member . end ,
1868+ args : [ new Cola . AST_SymbolRef ( { name : "this" } ) , member . expression , new Cola . AST_SymbolRef ( { name : "arguments" } ) ] ,
1869+ expression : new Cola . AST_Dot ( props )
1870+ } ) ;
1871+ }
1872+
17811873 if ( member instanceof Cola . AST_Lambda ) {
17821874 member . argnames . forEach ( function ( argDef ) {
17831875 if ( argDef . name instanceof Cola . AST_Symbol && hmembers . indexOf ( argDef . name . name ) != - 1 )
0 commit comments