mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
CoffeeScript 1.3.0
This commit is contained in:
parent
1b3af684cb
commit
ed8d94f69c
74 changed files with 1587 additions and 698 deletions
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2011 Jeremy Ashkenas
|
Copyright (c) 2009-2012 Jeremy Ashkenas
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
Permission is hereby granted, free of charge, to any person
|
||||||
obtaining a copy of this software and associated documentation
|
obtaining a copy of this software and associated documentation
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
###
|
###
|
||||||
CoffeeScript Compiler v1.2.0
|
CoffeeScript Compiler v1.3.0
|
||||||
Released under the MIT License
|
Released under the MIT License
|
||||||
###
|
###
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,5 @@ else
|
||||||
|
|
||||||
date = if friday then sue else jill
|
date = if friday then sue else jill
|
||||||
|
|
||||||
options or= defaults
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
solipsism = true if mind? and not world?
|
solipsism = true if mind? and not world?
|
||||||
|
|
||||||
speed ?= 75
|
speed = 0
|
||||||
|
speed ?= 15
|
||||||
|
|
||||||
footprints = yeti ? "bear"
|
footprints = yeti ? "bear"
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<!DOCTYPE html> <html> <head> <title>browser.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <div id="jump_to"> Jump To … <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="browser.html"> browser.coffee </a> <a class="source" href="cake.html"> cake.coffee </a> <a class="source" href="coffee-script.html"> coffee-script.coffee </a> <a class="source" href="command.html"> command.coffee </a> <a class="source" href="grammar.html"> grammar.coffee </a> <a class="source" href="helpers.html"> helpers.coffee </a> <a class="source" href="index.html"> index.coffee </a> <a class="source" href="lexer.html"> lexer.coffee </a> <a class="source" href="nodes.html"> nodes.coffee </a> <a class="source" href="optparse.html"> optparse.coffee </a> <a class="source" href="repl.html"> repl.coffee </a> <a class="source" href="rewriter.html"> rewriter.coffee </a> <a class="source" href="scope.html"> scope.coffee </a> </div> </div> </div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> browser.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">¶</a> </div> <p>Override exported methods for non-Node.js engines.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript = </span><span class="nx">require</span> <span class="s1">'./coffee-script'</span>
|
<!DOCTYPE html> <html> <head> <title>browser.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <div id="jump_to"> Jump To … <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="browser.html"> browser.coffee </a> <a class="source" href="cake.html"> cake.coffee </a> <a class="source" href="coffee-script.html"> coffee-script.coffee </a> <a class="source" href="command.html"> command.coffee </a> <a class="source" href="grammar.html"> grammar.coffee </a> <a class="source" href="helpers.html"> helpers.coffee </a> <a class="source" href="index.html"> index.coffee </a> <a class="source" href="lexer.html"> lexer.coffee </a> <a class="source" href="nodes.html"> nodes.coffee </a> <a class="source" href="optparse.html"> optparse.coffee </a> <a class="source" href="repl.html"> repl.coffee </a> <a class="source" href="rewriter.html"> rewriter.coffee </a> <a class="source" href="scope.html"> scope.coffee </a> </div> </div> </div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> browser.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">¶</a> </div> <p>Override exported methods for non-Node.js engines.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript = </span><span class="nx">require</span> <span class="s1">'./coffee-script'</span>
|
||||||
<span class="nv">CoffeeScript.require = </span><span class="nx">require</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <p>Use standard JavaScript <code>eval</code> to eval code.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript.eval = </span><span class="nf">(code, options) -></span>
|
<span class="nv">CoffeeScript.require = </span><span class="nx">require</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <p>Use standard JavaScript <code>eval</code> to eval code.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript.eval = </span><span class="nf">(code, options = {}) -></span>
|
||||||
|
<span class="nx">options</span><span class="p">.</span><span class="nx">bare</span> <span class="o">?=</span> <span class="kc">on</span>
|
||||||
<span class="nb">eval</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">options</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Running code does not provide access to this scope.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript.run = </span><span class="nf">(code, options = {}) -></span>
|
<span class="nb">eval</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">options</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Running code does not provide access to this scope.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript.run = </span><span class="nf">(code, options = {}) -></span>
|
||||||
<span class="nv">options.bare = </span><span class="kc">on</span>
|
<span class="nv">options.bare = </span><span class="kc">on</span>
|
||||||
<span class="nb">Function</span><span class="p">(</span><span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">options</span><span class="p">)()</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>If we're not in a browser environment, we're finished with the public API.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">return</span> <span class="nx">unless</span> <span class="nb">window</span><span class="o">?</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>Load a remote script from the current domain via XHR.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript.load = </span><span class="nf">(url, callback) -></span>
|
<span class="nb">Function</span><span class="p">(</span><span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">options</span><span class="p">)()</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>If we're not in a browser environment, we're finished with the public API.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">return</span> <span class="nx">unless</span> <span class="nb">window</span><span class="o">?</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>Load a remote script from the current domain via XHR.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript.load = </span><span class="nf">(url, callback) -></span>
|
||||||
|
|
|
@ -25,7 +25,7 @@ If no tasks are passed, print the help screen. Keep a reference to the
|
||||||
original directory name, when running Cake tasks from subdirectories.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.run = </span><span class="o">-></span>
|
original directory name, when running Cake tasks from subdirectories.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.run = </span><span class="o">-></span>
|
||||||
<span class="nv">global.__originalDirname = </span><span class="nx">fs</span><span class="p">.</span><span class="nx">realpathSync</span> <span class="s1">'.'</span>
|
<span class="nv">global.__originalDirname = </span><span class="nx">fs</span><span class="p">.</span><span class="nx">realpathSync</span> <span class="s1">'.'</span>
|
||||||
<span class="nx">process</span><span class="p">.</span><span class="nx">chdir</span> <span class="nx">cakefileDirectory</span> <span class="nx">__originalDirname</span>
|
<span class="nx">process</span><span class="p">.</span><span class="nx">chdir</span> <span class="nx">cakefileDirectory</span> <span class="nx">__originalDirname</span>
|
||||||
<span class="nv">args = </span><span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">.</span><span class="nx">slice</span> <span class="mi">2</span>
|
<span class="nv">args = </span><span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">..]</span>
|
||||||
<span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">run</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span><span class="p">(</span><span class="s1">'Cakefile'</span><span class="p">).</span><span class="nx">toString</span><span class="p">(),</span> <span class="nv">filename: </span><span class="s1">'Cakefile'</span>
|
<span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">run</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span><span class="p">(</span><span class="s1">'Cakefile'</span><span class="p">).</span><span class="nx">toString</span><span class="p">(),</span> <span class="nv">filename: </span><span class="s1">'Cakefile'</span>
|
||||||
<span class="nv">oparse = </span><span class="k">new</span> <span class="nx">optparse</span><span class="p">.</span><span class="nx">OptionParser</span> <span class="nx">switches</span>
|
<span class="nv">oparse = </span><span class="k">new</span> <span class="nx">optparse</span><span class="p">.</span><span class="nx">OptionParser</span> <span class="nx">switches</span>
|
||||||
<span class="k">return</span> <span class="nx">printTasks</span><span class="p">()</span> <span class="nx">unless</span> <span class="nx">args</span><span class="p">.</span><span class="nx">length</span>
|
<span class="k">return</span> <span class="nx">printTasks</span><span class="p">()</span> <span class="nx">unless</span> <span class="nx">args</span><span class="p">.</span><span class="nx">length</span>
|
||||||
|
@ -34,7 +34,8 @@ original directory name, when running Cake tasks from subdirectories.</p>
|
||||||
<span class="k">catch</span> <span class="nx">e</span>
|
<span class="k">catch</span> <span class="nx">e</span>
|
||||||
<span class="k">return</span> <span class="nx">fatalError</span> <span class="s2">"#{e}"</span>
|
<span class="k">return</span> <span class="nx">fatalError</span> <span class="s2">"#{e}"</span>
|
||||||
<span class="nx">invoke</span> <span class="nx">arg</span> <span class="k">for</span> <span class="nx">arg</span> <span class="k">in</span> <span class="nx">options</span><span class="p">.</span><span class="nx">arguments</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Display the list of Cake tasks in a format similar to <code>rake -T</code></p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">printTasks = </span><span class="o">-></span>
|
<span class="nx">invoke</span> <span class="nx">arg</span> <span class="k">for</span> <span class="nx">arg</span> <span class="k">in</span> <span class="nx">options</span><span class="p">.</span><span class="nx">arguments</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Display the list of Cake tasks in a format similar to <code>rake -T</code></p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">printTasks = </span><span class="o">-></span>
|
||||||
<span class="nv">cakefilePath = </span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span> <span class="nx">path</span><span class="p">.</span><span class="nx">relative</span><span class="p">(</span><span class="nx">__originalDirname</span><span class="p">,</span> <span class="nx">process</span><span class="p">.</span><span class="nx">cwd</span><span class="p">()),</span> <span class="s1">'Cakefile'</span>
|
<span class="nv">relative = </span><span class="nx">path</span><span class="p">.</span><span class="nx">relative</span> <span class="o">or</span> <span class="nx">path</span><span class="p">.</span><span class="nx">resolve</span>
|
||||||
|
<span class="nv">cakefilePath = </span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span> <span class="nx">relative</span><span class="p">(</span><span class="nx">__originalDirname</span><span class="p">,</span> <span class="nx">process</span><span class="p">.</span><span class="nx">cwd</span><span class="p">()),</span> <span class="s1">'Cakefile'</span>
|
||||||
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s2">"#{cakefilePath} defines the following tasks:\n"</span>
|
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s2">"#{cakefilePath} defines the following tasks:\n"</span>
|
||||||
<span class="k">for</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">task</span> <span class="k">of</span> <span class="nx">tasks</span>
|
<span class="k">for</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">task</span> <span class="k">of</span> <span class="nx">tasks</span>
|
||||||
<span class="nv">spaces = </span><span class="mi">20</span> <span class="o">-</span> <span class="nx">name</span><span class="p">.</span><span class="nx">length</span>
|
<span class="nv">spaces = </span><span class="mi">20</span> <span class="o">-</span> <span class="nx">name</span><span class="p">.</span><span class="nx">length</span>
|
||||||
|
|
|
@ -13,14 +13,17 @@ execute all scripts present in <code>text/coffeescript</code> tags.</p>
|
||||||
<span class="nv">content = </span><span class="nx">compile</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span><span class="p">(</span><span class="nx">filename</span><span class="p">,</span> <span class="s1">'utf8'</span><span class="p">),</span> <span class="p">{</span><span class="nx">filename</span><span class="p">}</span>
|
<span class="nv">content = </span><span class="nx">compile</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span><span class="p">(</span><span class="nx">filename</span><span class="p">,</span> <span class="s1">'utf8'</span><span class="p">),</span> <span class="p">{</span><span class="nx">filename</span><span class="p">}</span>
|
||||||
<span class="nx">module</span><span class="p">.</span><span class="nx">_compile</span> <span class="nx">content</span><span class="p">,</span> <span class="nx">filename</span>
|
<span class="nx">module</span><span class="p">.</span><span class="nx">_compile</span> <span class="nx">content</span><span class="p">,</span> <span class="nx">filename</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">require</span><span class="p">.</span><span class="nx">registerExtension</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">require</span><span class="p">.</span><span class="nx">registerExtension</span>
|
||||||
<span class="nx">require</span><span class="p">.</span><span class="nx">registerExtension</span> <span class="s1">'.coffee'</span><span class="p">,</span> <span class="nf">(content) -></span> <span class="nx">compile</span> <span class="nx">content</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>The current CoffeeScript version number.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.VERSION = </span><span class="s1">'1.2.0'</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>Words that cannot be used as identifiers in CoffeeScript code</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.RESERVED = </span><span class="nx">RESERVED</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>Expose helpers for testing.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.helpers = </span><span class="nx">require</span> <span class="s1">'./helpers'</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison
|
<span class="nx">require</span><span class="p">.</span><span class="nx">registerExtension</span> <span class="s1">'.coffee'</span><span class="p">,</span> <span class="nf">(content) -></span> <span class="nx">compile</span> <span class="nx">content</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>The current CoffeeScript version number.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.VERSION = </span><span class="s1">'1.3.0'</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>Words that cannot be used as identifiers in CoffeeScript code</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.RESERVED = </span><span class="nx">RESERVED</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>Expose helpers for testing.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.helpers = </span><span class="nx">require</span> <span class="s1">'./helpers'</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison
|
||||||
compiler.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.compile = compile = </span><span class="nf">(code, options = {}) -></span>
|
compiler.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.compile = compile = </span><span class="nf">(code, options = {}) -></span>
|
||||||
<span class="p">{</span><span class="nx">merge</span><span class="p">}</span> <span class="o">=</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">helpers</span>
|
<span class="p">{</span><span class="nx">merge</span><span class="p">}</span> <span class="o">=</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">helpers</span>
|
||||||
<span class="k">try</span>
|
<span class="k">try</span>
|
||||||
<span class="p">(</span><span class="nx">parser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">lexer</span><span class="p">.</span><span class="nx">tokenize</span> <span class="nx">code</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">merge</span> <span class="p">{},</span> <span class="nx">options</span>
|
<span class="nv">js = </span><span class="p">(</span><span class="nx">parser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">lexer</span><span class="p">.</span><span class="nx">tokenize</span> <span class="nx">code</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">options</span>
|
||||||
|
<span class="k">return</span> <span class="nx">js</span> <span class="nx">unless</span> <span class="nx">options</span><span class="p">.</span><span class="nx">header</span>
|
||||||
<span class="k">catch</span> <span class="nx">err</span>
|
<span class="k">catch</span> <span class="nx">err</span>
|
||||||
<span class="nv">err.message = </span><span class="s2">"In #{options.filename}, #{err.message}"</span> <span class="k">if</span> <span class="nx">options</span><span class="p">.</span><span class="nx">filename</span>
|
<span class="nv">err.message = </span><span class="s2">"In #{options.filename}, #{err.message}"</span> <span class="k">if</span> <span class="nx">options</span><span class="p">.</span><span class="nx">filename</span>
|
||||||
<span class="k">throw</span> <span class="nx">err</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <p>Tokenize a string of CoffeeScript code, and return the array of tokens.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.tokens = </span><span class="nf">(code, options) -></span>
|
<span class="k">throw</span> <span class="nx">err</span>
|
||||||
|
<span class="nv">header = </span><span class="s2">"Generated by CoffeeScript #{@VERSION}"</span>
|
||||||
|
<span class="s2">"// #{header}\n#{js}"</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <p>Tokenize a string of CoffeeScript code, and return the array of tokens.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.tokens = </span><span class="nf">(code, options) -></span>
|
||||||
<span class="nx">lexer</span><span class="p">.</span><span class="nx">tokenize</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">options</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>Parse a string of CoffeeScript code or an array of lexed tokens, and
|
<span class="nx">lexer</span><span class="p">.</span><span class="nx">tokenize</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">options</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>Parse a string of CoffeeScript code or an array of lexed tokens, and
|
||||||
return the AST. You can then compile it by calling <code>.compile()</code> on the root,
|
return the AST. You can then compile it by calling <code>.compile()</code> on the root,
|
||||||
or traverse it by using <code>.traverseChildren()</code> with a callback.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.nodes = </span><span class="nf">(source, options) -></span>
|
or traverse it by using <code>.traverseChildren()</code> with a callback.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.nodes = </span><span class="nf">(source, options) -></span>
|
||||||
|
@ -28,9 +31,9 @@ or traverse it by using <code>.traverseChildren()</code> with a callback.</p>
|
||||||
<span class="nx">parser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">lexer</span><span class="p">.</span><span class="nx">tokenize</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">options</span>
|
<span class="nx">parser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">lexer</span><span class="p">.</span><span class="nx">tokenize</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">options</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nx">parser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">source</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Compile and execute a string of CoffeeScript (on the server), correctly
|
<span class="nx">parser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">source</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Compile and execute a string of CoffeeScript (on the server), correctly
|
||||||
setting <code>__filename</code>, <code>__dirname</code>, and relative <code>require()</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.run = </span><span class="nf">(code, options) -></span>
|
setting <code>__filename</code>, <code>__dirname</code>, and relative <code>require()</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.run = </span><span class="nf">(code, options = {}) -></span>
|
||||||
<span class="nv">mainModule = </span><span class="nx">require</span><span class="p">.</span><span class="nx">main</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Set the filename.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">mainModule.filename = </span><span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span>
|
<span class="nv">mainModule = </span><span class="nx">require</span><span class="p">.</span><span class="nx">main</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Set the filename.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">mainModule.filename = </span><span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span>
|
||||||
<span class="k">if</span> <span class="nx">options</span><span class="p">.</span><span class="nx">filename</span> <span class="k">then</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">realpathSync</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">filename</span><span class="p">)</span> <span class="k">else</span> <span class="s1">'.'</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>Clear the module cache.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">mainModule</span><span class="p">.</span><span class="nx">moduleCache</span> <span class="o">and=</span> <span class="p">{}</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>Assign paths for node_modules loading</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">mainModule.paths = </span><span class="nx">require</span><span class="p">(</span><span class="s1">'module'</span><span class="p">).</span><span class="nx">_nodeModulePaths</span> <span class="nx">path</span><span class="p">.</span><span class="nx">dirname</span> <span class="nx">options</span><span class="p">.</span><span class="nx">filename</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>Compile.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="nx">path</span><span class="p">.</span><span class="nx">extname</span><span class="p">(</span><span class="nx">mainModule</span><span class="p">.</span><span class="nx">filename</span><span class="p">)</span> <span class="o">isnt</span> <span class="s1">'.coffee'</span> <span class="o">or</span> <span class="nx">require</span><span class="p">.</span><span class="nx">extensions</span>
|
<span class="k">if</span> <span class="nx">options</span><span class="p">.</span><span class="nx">filename</span> <span class="k">then</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">realpathSync</span><span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">filename</span><span class="p">)</span> <span class="k">else</span> <span class="s1">'.'</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>Clear the module cache.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">mainModule</span><span class="p">.</span><span class="nx">moduleCache</span> <span class="o">and=</span> <span class="p">{}</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>Assign paths for node_modules loading</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">mainModule.paths = </span><span class="nx">require</span><span class="p">(</span><span class="s1">'module'</span><span class="p">).</span><span class="nx">_nodeModulePaths</span> <span class="nx">path</span><span class="p">.</span><span class="nx">dirname</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">realpathSync</span> <span class="nx">options</span><span class="p">.</span><span class="nx">filename</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>Compile.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="nx">path</span><span class="p">.</span><span class="nx">extname</span><span class="p">(</span><span class="nx">mainModule</span><span class="p">.</span><span class="nx">filename</span><span class="p">)</span> <span class="o">isnt</span> <span class="s1">'.coffee'</span> <span class="o">or</span> <span class="nx">require</span><span class="p">.</span><span class="nx">extensions</span>
|
||||||
<span class="nx">mainModule</span><span class="p">.</span><span class="nx">_compile</span> <span class="nx">compile</span><span class="p">(</span><span class="nx">code</span><span class="p">,</span> <span class="nx">options</span><span class="p">),</span> <span class="nx">mainModule</span><span class="p">.</span><span class="nx">filename</span>
|
<span class="nx">mainModule</span><span class="p">.</span><span class="nx">_compile</span> <span class="nx">compile</span><span class="p">(</span><span class="nx">code</span><span class="p">,</span> <span class="nx">options</span><span class="p">),</span> <span class="nx">mainModule</span><span class="p">.</span><span class="nx">filename</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nx">mainModule</span><span class="p">.</span><span class="nx">_compile</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">mainModule</span><span class="p">.</span><span class="nx">filename</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).
|
<span class="nx">mainModule</span><span class="p">.</span><span class="nx">_compile</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">mainModule</span><span class="p">.</span><span class="nx">filename</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).
|
||||||
|
|
|
@ -11,11 +11,13 @@ interactive REPL.</p> </td> <td class="code">
|
||||||
<span class="p">{</span><span class="nx">EventEmitter</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'events'</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Allow CoffeeScript to emit Node.js events.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">helpers</span><span class="p">.</span><span class="nx">extend</span> <span class="nx">CoffeeScript</span><span class="p">,</span> <span class="k">new</span> <span class="nx">EventEmitter</span>
|
<span class="p">{</span><span class="nx">EventEmitter</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'events'</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Allow CoffeeScript to emit Node.js events.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">helpers</span><span class="p">.</span><span class="nx">extend</span> <span class="nx">CoffeeScript</span><span class="p">,</span> <span class="k">new</span> <span class="nx">EventEmitter</span>
|
||||||
|
|
||||||
<span class="nv">printLine = </span><span class="nf">(line) -></span> <span class="nx">process</span><span class="p">.</span><span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="nx">line</span> <span class="o">+</span> <span class="s1">'\n'</span>
|
<span class="nv">printLine = </span><span class="nf">(line) -></span> <span class="nx">process</span><span class="p">.</span><span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="nx">line</span> <span class="o">+</span> <span class="s1">'\n'</span>
|
||||||
<span class="nv">printWarn = </span><span class="nf">(line) -></span> <span class="nx">process</span><span class="p">.</span><span class="nx">stderr</span><span class="p">.</span><span class="nx">write</span> <span class="nx">line</span> <span class="o">+</span> <span class="s1">'\n'</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>The help banner that is printed when <code>coffee</code> is called without arguments.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">BANNER = </span><span class="s1">'''</span>
|
<span class="nv">printWarn = </span><span class="nf">(line) -></span> <span class="nx">process</span><span class="p">.</span><span class="nx">stderr</span><span class="p">.</span><span class="nx">write</span> <span class="nx">line</span> <span class="o">+</span> <span class="s1">'\n'</span>
|
||||||
<span class="s1"> Usage: coffee [options] path/to/script.coffee</span>
|
|
||||||
|
<span class="nv">hidden = </span><span class="nf">(file) -></span> <span class="o">/^</span><span class="err">\</span><span class="p">.</span><span class="o">|~</span><span class="nx">$</span><span class="err">/.test file</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>The help banner that is printed when <code>coffee</code> is called without arguments.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">BANNER = </span><span class="s1">'''</span>
|
||||||
|
<span class="s1"> Usage: coffee [options] path/to/script.coffee -- [args]</span>
|
||||||
|
|
||||||
<span class="s1"> If called without options, `coffee` will run your script.</span>
|
<span class="s1"> If called without options, `coffee` will run your script.</span>
|
||||||
<span class="s1"> '''</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>The list of all the valid option flags that <code>coffee</code> knows how to handle.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">SWITCHES = </span><span class="p">[</span>
|
<span class="s1">'''</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>The list of all the valid option flags that <code>coffee</code> knows how to handle.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">SWITCHES = </span><span class="p">[</span>
|
||||||
<span class="p">[</span><span class="s1">'-b'</span><span class="p">,</span> <span class="s1">'--bare'</span><span class="p">,</span> <span class="s1">'compile without a top-level function wrapper'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'-b'</span><span class="p">,</span> <span class="s1">'--bare'</span><span class="p">,</span> <span class="s1">'compile without a top-level function wrapper'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'-c'</span><span class="p">,</span> <span class="s1">'--compile'</span><span class="p">,</span> <span class="s1">'compile to JavaScript and save as .js files'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'-c'</span><span class="p">,</span> <span class="s1">'--compile'</span><span class="p">,</span> <span class="s1">'compile to JavaScript and save as .js files'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'-e'</span><span class="p">,</span> <span class="s1">'--eval'</span><span class="p">,</span> <span class="s1">'pass a string from the command line as input'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'-e'</span><span class="p">,</span> <span class="s1">'--eval'</span><span class="p">,</span> <span class="s1">'pass a string from the command line as input'</span><span class="p">]</span>
|
||||||
|
@ -47,13 +49,12 @@ Many flags cause us to divert before compiling anything. Flags passed after
|
||||||
<span class="nx">loadRequires</span><span class="p">()</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">require</span>
|
<span class="nx">loadRequires</span><span class="p">()</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">require</span>
|
||||||
<span class="k">return</span> <span class="nx">require</span> <span class="s1">'./repl'</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">interactive</span>
|
<span class="k">return</span> <span class="nx">require</span> <span class="s1">'./repl'</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">interactive</span>
|
||||||
<span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">watch</span> <span class="o">and</span> <span class="o">!</span><span class="nx">fs</span><span class="p">.</span><span class="nx">watch</span>
|
<span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">watch</span> <span class="o">and</span> <span class="o">!</span><span class="nx">fs</span><span class="p">.</span><span class="nx">watch</span>
|
||||||
<span class="nx">printWarn</span> <span class="s2">"The --watch feature depends on Node v0.6.0+. You are running #{process.version}."</span>
|
<span class="k">return</span> <span class="nx">printWarn</span> <span class="s2">"The --watch feature depends on Node v0.6.0+. You are running #{process.version}."</span>
|
||||||
<span class="k">return</span> <span class="nx">compileStdio</span><span class="p">()</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">stdio</span>
|
<span class="k">return</span> <span class="nx">compileStdio</span><span class="p">()</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">stdio</span>
|
||||||
<span class="k">return</span> <span class="nx">compileScript</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">sources</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nb">eval</span>
|
<span class="k">return</span> <span class="nx">compileScript</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">sources</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nb">eval</span>
|
||||||
<span class="k">return</span> <span class="nx">require</span> <span class="s1">'./repl'</span> <span class="nx">unless</span> <span class="nx">sources</span><span class="p">.</span><span class="nx">length</span>
|
<span class="k">return</span> <span class="nx">require</span> <span class="s1">'./repl'</span> <span class="nx">unless</span> <span class="nx">sources</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">run</span>
|
<span class="nv">literals = </span><span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">run</span> <span class="k">then</span> <span class="nx">sources</span><span class="p">.</span><span class="nx">splice</span> <span class="mi">1</span> <span class="k">else</span> <span class="p">[]</span>
|
||||||
<span class="nv">opts.literals = </span><span class="nx">sources</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="nx">concat</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">literals</span>
|
<span class="nv">process.argv = </span><span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">..</span><span class="mi">1</span><span class="p">].</span><span class="nx">concat</span> <span class="nx">literals</span>
|
||||||
<span class="nv">process.argv = </span><span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">).</span><span class="nx">concat</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">literals</span>
|
|
||||||
<span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'coffee'</span>
|
<span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'coffee'</span>
|
||||||
<span class="nv">process.execPath = </span><span class="nx">require</span><span class="p">.</span><span class="nx">main</span><span class="p">.</span><span class="nx">filename</span>
|
<span class="nv">process.execPath = </span><span class="nx">require</span><span class="p">.</span><span class="nx">main</span><span class="p">.</span><span class="nx">filename</span>
|
||||||
<span class="k">for</span> <span class="nx">source</span> <span class="k">in</span> <span class="nx">sources</span>
|
<span class="k">for</span> <span class="nx">source</span> <span class="k">in</span> <span class="nx">sources</span>
|
||||||
|
@ -75,11 +76,11 @@ and all subdirectories.</p> </td> <td class="code">
|
||||||
<span class="nx">fs</span><span class="p">.</span><span class="nx">readdir</span> <span class="nx">source</span><span class="p">,</span> <span class="nf">(err, files) -></span>
|
<span class="nx">fs</span><span class="p">.</span><span class="nx">readdir</span> <span class="nx">source</span><span class="p">,</span> <span class="nf">(err, files) -></span>
|
||||||
<span class="k">throw</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span> <span class="o">and</span> <span class="nx">err</span><span class="p">.</span><span class="nx">code</span> <span class="o">isnt</span> <span class="s1">'ENOENT'</span>
|
<span class="k">throw</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span> <span class="o">and</span> <span class="nx">err</span><span class="p">.</span><span class="nx">code</span> <span class="o">isnt</span> <span class="s1">'ENOENT'</span>
|
||||||
<span class="k">return</span> <span class="k">if</span> <span class="nx">err</span><span class="o">?</span><span class="p">.</span><span class="nx">code</span> <span class="o">is</span> <span class="s1">'ENOENT'</span>
|
<span class="k">return</span> <span class="k">if</span> <span class="nx">err</span><span class="o">?</span><span class="p">.</span><span class="nx">code</span> <span class="o">is</span> <span class="s1">'ENOENT'</span>
|
||||||
<span class="nv">files = </span><span class="nx">files</span><span class="p">.</span><span class="nx">map</span> <span class="nf">(file) -></span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">file</span>
|
|
||||||
<span class="nv">index = </span><span class="nx">sources</span><span class="p">.</span><span class="nx">indexOf</span> <span class="nx">source</span>
|
<span class="nv">index = </span><span class="nx">sources</span><span class="p">.</span><span class="nx">indexOf</span> <span class="nx">source</span>
|
||||||
<span class="nx">sources</span><span class="p">[</span><span class="nx">index</span><span class="p">..</span><span class="nx">index</span><span class="p">]</span> <span class="o">=</span> <span class="nx">files</span>
|
<span class="nx">sources</span><span class="p">[</span><span class="nx">index</span><span class="p">..</span><span class="nx">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">file</span> <span class="k">for</span> <span class="nx">file</span> <span class="k">in</span> <span class="nx">files</span><span class="p">)</span>
|
||||||
<span class="nx">sourceCode</span><span class="p">[</span><span class="nx">index</span><span class="p">..</span><span class="nx">index</span><span class="p">]</span> <span class="o">=</span> <span class="nx">files</span><span class="p">.</span><span class="nx">map</span> <span class="o">-></span> <span class="kc">null</span>
|
<span class="nx">sourceCode</span><span class="p">[</span><span class="nx">index</span><span class="p">..</span><span class="nx">index</span><span class="p">]</span> <span class="o">=</span> <span class="nx">files</span><span class="p">.</span><span class="nx">map</span> <span class="o">-></span> <span class="kc">null</span>
|
||||||
<span class="nx">compilePath</span> <span class="nx">file</span><span class="p">,</span> <span class="kc">no</span><span class="p">,</span> <span class="nx">base</span> <span class="k">for</span> <span class="nx">file</span> <span class="k">in</span> <span class="nx">files</span>
|
<span class="k">for</span> <span class="nx">file</span> <span class="k">in</span> <span class="nx">files</span> <span class="k">when</span> <span class="o">not</span> <span class="nx">hidden</span> <span class="nx">file</span>
|
||||||
|
<span class="nx">compilePath</span> <span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">file</span><span class="p">),</span> <span class="kc">no</span><span class="p">,</span> <span class="nx">base</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">topLevel</span> <span class="o">or</span> <span class="nx">path</span><span class="p">.</span><span class="nx">extname</span><span class="p">(</span><span class="nx">source</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'.coffee'</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">topLevel</span> <span class="o">or</span> <span class="nx">path</span><span class="p">.</span><span class="nx">extname</span><span class="p">(</span><span class="nx">source</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'.coffee'</span>
|
||||||
<span class="nx">watch</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">base</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">watch</span>
|
<span class="nx">watch</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">base</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">watch</span>
|
||||||
<span class="nx">fs</span><span class="p">.</span><span class="nx">readFile</span> <span class="nx">source</span><span class="p">,</span> <span class="nf">(err, code) -></span>
|
<span class="nx">fs</span><span class="p">.</span><span class="nx">readFile</span> <span class="nx">source</span><span class="p">,</span> <span class="nf">(err, code) -></span>
|
||||||
|
@ -111,7 +112,7 @@ requested options. If evaluating the script directly sets <code>__filename</code
|
||||||
<span class="k">catch</span> <span class="nx">err</span>
|
<span class="k">catch</span> <span class="nx">err</span>
|
||||||
<span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">emit</span> <span class="s1">'failure'</span><span class="p">,</span> <span class="nx">err</span><span class="p">,</span> <span class="nx">task</span>
|
<span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">emit</span> <span class="s1">'failure'</span><span class="p">,</span> <span class="nx">err</span><span class="p">,</span> <span class="nx">task</span>
|
||||||
<span class="k">return</span> <span class="k">if</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">listeners</span><span class="p">(</span><span class="s1">'failure'</span><span class="p">).</span><span class="nx">length</span>
|
<span class="k">return</span> <span class="k">if</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">listeners</span><span class="p">(</span><span class="s1">'failure'</span><span class="p">).</span><span class="nx">length</span>
|
||||||
<span class="k">return</span> <span class="nx">printLine</span> <span class="nx">err</span><span class="p">.</span><span class="nx">message</span> <span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">watch</span>
|
<span class="k">return</span> <span class="nx">printLine</span> <span class="nx">err</span><span class="p">.</span><span class="nx">message</span> <span class="o">+</span> <span class="s1">'\x07'</span> <span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">watch</span>
|
||||||
<span class="nx">printWarn</span> <span class="nx">err</span> <span class="k">instanceof</span> <span class="nb">Error</span> <span class="o">and</span> <span class="nx">err</span><span class="p">.</span><span class="nx">stack</span> <span class="o">or</span> <span class="s2">"ERROR: #{err}"</span>
|
<span class="nx">printWarn</span> <span class="nx">err</span> <span class="k">instanceof</span> <span class="nb">Error</span> <span class="o">and</span> <span class="nx">err</span><span class="p">.</span><span class="nx">stack</span> <span class="o">or</span> <span class="s2">"ERROR: #{err}"</span>
|
||||||
<span class="nx">process</span><span class="p">.</span><span class="nx">exit</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Attach the appropriate listeners to compile scripts incoming over <strong>stdin</strong>,
|
<span class="nx">process</span><span class="p">.</span><span class="nx">exit</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Attach the appropriate listeners to compile scripts incoming over <strong>stdin</strong>,
|
||||||
and write them back to <strong>stdout</strong>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">compileStdio = </span><span class="o">-></span>
|
and write them back to <strong>stdout</strong>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">compileStdio = </span><span class="o">-></span>
|
||||||
|
@ -141,8 +142,12 @@ such as <code>--lint</code> or <code>--print</code>.</p> </td>
|
||||||
<span class="nv">watchErr = </span><span class="nf">(e) -></span>
|
<span class="nv">watchErr = </span><span class="nf">(e) -></span>
|
||||||
<span class="k">if</span> <span class="nx">e</span><span class="p">.</span><span class="nx">code</span> <span class="o">is</span> <span class="s1">'ENOENT'</span>
|
<span class="k">if</span> <span class="nx">e</span><span class="p">.</span><span class="nx">code</span> <span class="o">is</span> <span class="s1">'ENOENT'</span>
|
||||||
<span class="k">return</span> <span class="k">if</span> <span class="nx">sources</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">source</span><span class="p">)</span> <span class="o">is</span> <span class="o">-</span><span class="mi">1</span>
|
<span class="k">return</span> <span class="k">if</span> <span class="nx">sources</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">source</span><span class="p">)</span> <span class="o">is</span> <span class="o">-</span><span class="mi">1</span>
|
||||||
<span class="nx">removeSource</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">base</span><span class="p">,</span> <span class="kc">yes</span>
|
<span class="k">try</span>
|
||||||
<span class="nx">compileJoin</span><span class="p">()</span>
|
<span class="nx">rewatch</span><span class="p">()</span>
|
||||||
|
<span class="nx">compile</span><span class="p">()</span>
|
||||||
|
<span class="k">catch</span> <span class="nx">e</span>
|
||||||
|
<span class="nx">removeSource</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">base</span><span class="p">,</span> <span class="kc">yes</span>
|
||||||
|
<span class="nx">compileJoin</span><span class="p">()</span>
|
||||||
<span class="k">else</span> <span class="k">throw</span> <span class="nx">e</span>
|
<span class="k">else</span> <span class="k">throw</span> <span class="nx">e</span>
|
||||||
|
|
||||||
<span class="nv">compile = </span><span class="o">-></span>
|
<span class="nv">compile = </span><span class="o">-></span>
|
||||||
|
@ -150,32 +155,22 @@ such as <code>--lint</code> or <code>--print</code>.</p> </td>
|
||||||
<span class="nv">compileTimeout = </span><span class="nx">wait</span> <span class="mi">25</span><span class="p">,</span> <span class="o">-></span>
|
<span class="nv">compileTimeout = </span><span class="nx">wait</span> <span class="mi">25</span><span class="p">,</span> <span class="o">-></span>
|
||||||
<span class="nx">fs</span><span class="p">.</span><span class="nx">stat</span> <span class="nx">source</span><span class="p">,</span> <span class="nf">(err, stats) -></span>
|
<span class="nx">fs</span><span class="p">.</span><span class="nx">stat</span> <span class="nx">source</span><span class="p">,</span> <span class="nf">(err, stats) -></span>
|
||||||
<span class="k">return</span> <span class="nx">watchErr</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span>
|
<span class="k">return</span> <span class="nx">watchErr</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span>
|
||||||
<span class="k">return</span> <span class="k">if</span> <span class="nx">prevStats</span> <span class="o">and</span> <span class="p">(</span><span class="nx">stats</span><span class="p">.</span><span class="nx">size</span> <span class="o">is</span> <span class="nx">prevStats</span><span class="p">.</span><span class="nx">size</span> <span class="o">and</span>
|
<span class="k">return</span> <span class="nx">rewatch</span><span class="p">()</span> <span class="k">if</span> <span class="nx">prevStats</span> <span class="o">and</span> <span class="nx">stats</span><span class="p">.</span><span class="nx">size</span> <span class="o">is</span> <span class="nx">prevStats</span><span class="p">.</span><span class="nx">size</span> <span class="o">and</span>
|
||||||
<span class="nx">stats</span><span class="p">.</span><span class="nx">mtime</span><span class="p">.</span><span class="nx">getTime</span><span class="p">()</span> <span class="o">is</span> <span class="nx">prevStats</span><span class="p">.</span><span class="nx">mtime</span><span class="p">.</span><span class="nx">getTime</span><span class="p">())</span>
|
<span class="nx">stats</span><span class="p">.</span><span class="nx">mtime</span><span class="p">.</span><span class="nx">getTime</span><span class="p">()</span> <span class="o">is</span> <span class="nx">prevStats</span><span class="p">.</span><span class="nx">mtime</span><span class="p">.</span><span class="nx">getTime</span><span class="p">()</span>
|
||||||
<span class="nv">prevStats = </span><span class="nx">stats</span>
|
<span class="nv">prevStats = </span><span class="nx">stats</span>
|
||||||
<span class="nx">fs</span><span class="p">.</span><span class="nx">readFile</span> <span class="nx">source</span><span class="p">,</span> <span class="nf">(err, code) -></span>
|
<span class="nx">fs</span><span class="p">.</span><span class="nx">readFile</span> <span class="nx">source</span><span class="p">,</span> <span class="nf">(err, code) -></span>
|
||||||
<span class="k">return</span> <span class="nx">watchErr</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span>
|
<span class="k">return</span> <span class="nx">watchErr</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span>
|
||||||
<span class="nx">compileScript</span><span class="p">(</span><span class="nx">source</span><span class="p">,</span> <span class="nx">code</span><span class="p">.</span><span class="nx">toString</span><span class="p">(),</span> <span class="nx">base</span><span class="p">)</span>
|
<span class="nx">compileScript</span><span class="p">(</span><span class="nx">source</span><span class="p">,</span> <span class="nx">code</span><span class="p">.</span><span class="nx">toString</span><span class="p">(),</span> <span class="nx">base</span><span class="p">)</span>
|
||||||
|
<span class="nx">rewatch</span><span class="p">()</span>
|
||||||
<span class="nv">watchErr = </span><span class="nf">(e) -></span>
|
|
||||||
<span class="k">throw</span> <span class="nx">e</span> <span class="nx">unless</span> <span class="nx">e</span><span class="p">.</span><span class="nx">code</span> <span class="o">is</span> <span class="s1">'ENOENT'</span>
|
|
||||||
<span class="nx">removeSource</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">base</span><span class="p">,</span> <span class="kc">yes</span>
|
|
||||||
<span class="nx">compileJoin</span><span class="p">()</span>
|
|
||||||
|
|
||||||
<span class="k">try</span>
|
<span class="k">try</span>
|
||||||
<span class="nv">watcher = </span><span class="nx">fs</span><span class="p">.</span><span class="nx">watch</span> <span class="nx">source</span><span class="p">,</span> <span class="nv">callback = </span><span class="nf">(event) -></span>
|
<span class="nv">watcher = </span><span class="nx">fs</span><span class="p">.</span><span class="nx">watch</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">compile</span>
|
||||||
<span class="k">if</span> <span class="nx">event</span> <span class="o">is</span> <span class="s1">'change'</span>
|
<span class="k">catch</span> <span class="nx">e</span>
|
||||||
<span class="nx">compile</span><span class="p">()</span>
|
<span class="nx">watchErr</span> <span class="nx">e</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">event</span> <span class="o">is</span> <span class="s1">'rename'</span>
|
|
||||||
<span class="nx">watcher</span><span class="p">.</span><span class="nx">close</span><span class="p">()</span>
|
<span class="nv">rewatch = </span><span class="o">-></span>
|
||||||
<span class="nx">wait</span> <span class="mi">250</span><span class="p">,</span> <span class="o">-></span>
|
<span class="nx">watcher</span><span class="o">?</span><span class="p">.</span><span class="nx">close</span><span class="p">()</span>
|
||||||
<span class="nx">compile</span><span class="p">()</span>
|
<span class="nv">watcher = </span><span class="nx">fs</span><span class="p">.</span><span class="nx">watch</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">compile</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Watch a directory of files for new additions.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">watchDir = </span><span class="nf">(source, base) -></span>
|
||||||
<span class="k">try</span>
|
|
||||||
<span class="nv">watcher = </span><span class="nx">fs</span><span class="p">.</span><span class="nx">watch</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">callback</span>
|
|
||||||
<span class="k">catch</span> <span class="nx">e</span>
|
|
||||||
<span class="nx">watchErr</span> <span class="nx">e</span>
|
|
||||||
<span class="k">catch</span> <span class="nx">e</span>
|
|
||||||
<span class="nx">watchErr</span> <span class="nx">e</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Watch a directory of files for new additions.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">watchDir = </span><span class="nf">(source, base) -></span>
|
|
||||||
<span class="nv">readdirTimeout = </span><span class="kc">null</span>
|
<span class="nv">readdirTimeout = </span><span class="kc">null</span>
|
||||||
<span class="k">try</span>
|
<span class="k">try</span>
|
||||||
<span class="nv">watcher = </span><span class="nx">fs</span><span class="p">.</span><span class="nx">watch</span> <span class="nx">source</span><span class="p">,</span> <span class="o">-></span>
|
<span class="nv">watcher = </span><span class="nx">fs</span><span class="p">.</span><span class="nx">watch</span> <span class="nx">source</span><span class="p">,</span> <span class="o">-></span>
|
||||||
|
@ -186,8 +181,8 @@ such as <code>--lint</code> or <code>--print</code>.</p> </td>
|
||||||
<span class="k">throw</span> <span class="nx">err</span> <span class="nx">unless</span> <span class="nx">err</span><span class="p">.</span><span class="nx">code</span> <span class="o">is</span> <span class="s1">'ENOENT'</span>
|
<span class="k">throw</span> <span class="nx">err</span> <span class="nx">unless</span> <span class="nx">err</span><span class="p">.</span><span class="nx">code</span> <span class="o">is</span> <span class="s1">'ENOENT'</span>
|
||||||
<span class="nx">watcher</span><span class="p">.</span><span class="nx">close</span><span class="p">()</span>
|
<span class="nx">watcher</span><span class="p">.</span><span class="nx">close</span><span class="p">()</span>
|
||||||
<span class="k">return</span> <span class="nx">unwatchDir</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">base</span>
|
<span class="k">return</span> <span class="nx">unwatchDir</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">base</span>
|
||||||
<span class="nv">files = </span><span class="nx">files</span><span class="p">.</span><span class="nx">map</span> <span class="nf">(file) -></span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">file</span>
|
<span class="k">for</span> <span class="nx">file</span> <span class="k">in</span> <span class="nx">files</span> <span class="k">when</span> <span class="o">not</span> <span class="nx">hidden</span><span class="p">(</span><span class="nx">file</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">notSources</span><span class="p">[</span><span class="nx">file</span><span class="p">]</span>
|
||||||
<span class="k">for</span> <span class="nx">file</span> <span class="k">in</span> <span class="nx">files</span> <span class="k">when</span> <span class="o">not</span> <span class="nx">notSources</span><span class="p">[</span><span class="nx">file</span><span class="p">]</span>
|
<span class="nv">file = </span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">file</span>
|
||||||
<span class="k">continue</span> <span class="k">if</span> <span class="nx">sources</span><span class="p">.</span><span class="nx">some</span> <span class="nf">(s) -></span> <span class="nx">s</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">file</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span>
|
<span class="k">continue</span> <span class="k">if</span> <span class="nx">sources</span><span class="p">.</span><span class="nx">some</span> <span class="nf">(s) -></span> <span class="nx">s</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">file</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span>
|
||||||
<span class="nx">sources</span><span class="p">.</span><span class="nx">push</span> <span class="nx">file</span>
|
<span class="nx">sources</span><span class="p">.</span><span class="nx">push</span> <span class="nx">file</span>
|
||||||
<span class="nx">sourceCode</span><span class="p">.</span><span class="nx">push</span> <span class="kc">null</span>
|
<span class="nx">sourceCode</span><span class="p">.</span><span class="nx">push</span> <span class="kc">null</span>
|
||||||
|
@ -196,7 +191,7 @@ such as <code>--lint</code> or <code>--print</code>.</p> </td>
|
||||||
<span class="k">throw</span> <span class="nx">e</span> <span class="nx">unless</span> <span class="nx">e</span><span class="p">.</span><span class="nx">code</span> <span class="o">is</span> <span class="s1">'ENOENT'</span>
|
<span class="k">throw</span> <span class="nx">e</span> <span class="nx">unless</span> <span class="nx">e</span><span class="p">.</span><span class="nx">code</span> <span class="o">is</span> <span class="s1">'ENOENT'</span>
|
||||||
|
|
||||||
<span class="nv">unwatchDir = </span><span class="nf">(source, base) -></span>
|
<span class="nv">unwatchDir = </span><span class="nf">(source, base) -></span>
|
||||||
<span class="nv">prevSources = </span><span class="nx">sources</span><span class="p">.</span><span class="nx">slice</span><span class="p">()</span>
|
<span class="nv">prevSources = </span><span class="nx">sources</span><span class="p">[..]</span>
|
||||||
<span class="nv">toRemove = </span><span class="p">(</span><span class="nx">file</span> <span class="k">for</span> <span class="nx">file</span> <span class="k">in</span> <span class="nx">sources</span> <span class="k">when</span> <span class="nx">file</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">source</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">)</span>
|
<span class="nv">toRemove = </span><span class="p">(</span><span class="nx">file</span> <span class="k">for</span> <span class="nx">file</span> <span class="k">in</span> <span class="nx">sources</span> <span class="k">when</span> <span class="nx">file</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">source</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">)</span>
|
||||||
<span class="nx">removeSource</span> <span class="nx">file</span><span class="p">,</span> <span class="nx">base</span><span class="p">,</span> <span class="kc">yes</span> <span class="k">for</span> <span class="nx">file</span> <span class="k">in</span> <span class="nx">toRemove</span>
|
<span class="nx">removeSource</span> <span class="nx">file</span><span class="p">,</span> <span class="nx">base</span><span class="p">,</span> <span class="kc">yes</span> <span class="k">for</span> <span class="nx">file</span> <span class="k">in</span> <span class="nx">toRemove</span>
|
||||||
<span class="k">return</span> <span class="nx">unless</span> <span class="nx">sources</span><span class="p">.</span><span class="nx">some</span> <span class="nf">(s, i) -></span> <span class="nx">prevSources</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">isnt</span> <span class="nx">s</span>
|
<span class="k">return</span> <span class="nx">unless</span> <span class="nx">sources</span><span class="p">.</span><span class="nx">some</span> <span class="nf">(s, i) -></span> <span class="nx">prevSources</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">isnt</span> <span class="nx">s</span>
|
||||||
|
@ -229,8 +224,7 @@ directory can be customized with <code>--output</code>.</p> </td>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">compile</span> <span class="o">and</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">watch</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">compile</span> <span class="o">and</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">watch</span>
|
||||||
<span class="nx">timeLog</span> <span class="s2">"compiled #{source}"</span>
|
<span class="nx">timeLog</span> <span class="s2">"compiled #{source}"</span>
|
||||||
<span class="nx">path</span><span class="p">.</span><span class="nx">exists</span> <span class="nx">jsDir</span><span class="p">,</span> <span class="nf">(exists) -></span>
|
<span class="nx">path</span><span class="p">.</span><span class="nx">exists</span> <span class="nx">jsDir</span><span class="p">,</span> <span class="nf">(exists) -></span>
|
||||||
<span class="k">if</span> <span class="nx">exists</span> <span class="k">then</span> <span class="nx">compile</span><span class="p">()</span> <span class="k">else</span> <span class="nx">exec</span> <span class="s2">"mkdir -p #{jsDir}"</span><span class="p">,</span> <span class="nx">compile</span>
|
<span class="k">if</span> <span class="nx">exists</span> <span class="k">then</span> <span class="nx">compile</span><span class="p">()</span> <span class="k">else</span> <span class="nx">exec</span> <span class="s2">"mkdir -p #{jsDir}"</span><span class="p">,</span> <span class="nx">compile</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>Convenience for cleaner setTimeouts.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">wait = </span><span class="nf">(milliseconds, func) -></span> <span class="nx">setTimeout</span> <span class="nx">func</span><span class="p">,</span> <span class="nx">milliseconds</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-19">¶</a> </div> <p>When watching scripts, it's useful to log changes with the timestamp.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">timeLog = </span><span class="nf">(message) -></span>
|
||||||
</pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>Convenience for cleaner setTimeouts.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">wait = </span><span class="nf">(milliseconds, func) -></span> <span class="nx">setTimeout</span> <span class="nx">func</span><span class="p">,</span> <span class="nx">milliseconds</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-19">¶</a> </div> <p>When watching scripts, it's useful to log changes with the timestamp.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">timeLog = </span><span class="nf">(message) -></span>
|
|
||||||
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s2">"#{(new Date).toLocaleTimeString()} - #{message}"</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-20">¶</a> </div> <p>Pipe compiled JS through JSLint (requires a working <code>jsl</code> command), printing
|
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s2">"#{(new Date).toLocaleTimeString()} - #{message}"</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-20">¶</a> </div> <p>Pipe compiled JS through JSLint (requires a working <code>jsl</code> command), printing
|
||||||
any errors or warnings that arise.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">lint = </span><span class="nf">(file, js) -></span>
|
any errors or warnings that arise.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">lint = </span><span class="nf">(file, js) -></span>
|
||||||
<span class="nv">printIt = </span><span class="nf">(buffer) -></span> <span class="nx">printLine</span> <span class="nx">file</span> <span class="o">+</span> <span class="s1">':\t'</span> <span class="o">+</span> <span class="nx">buffer</span><span class="p">.</span><span class="nx">toString</span><span class="p">().</span><span class="nx">trim</span><span class="p">()</span>
|
<span class="nv">printIt = </span><span class="nf">(buffer) -></span> <span class="nx">printLine</span> <span class="nx">file</span> <span class="o">+</span> <span class="s1">':\t'</span> <span class="o">+</span> <span class="nx">buffer</span><span class="p">.</span><span class="nx">toString</span><span class="p">().</span><span class="nx">trim</span><span class="p">()</span>
|
||||||
|
@ -246,13 +240,14 @@ any errors or warnings that arise.</p> </td> <td class="
|
||||||
<span class="nx">printLine</span> <span class="nx">strings</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-22">¶</a> </div> <p>Use the <a href="optparse.html">OptionParser module</a> to extract all options from
|
<span class="nx">printLine</span> <span class="nx">strings</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-22">¶</a> </div> <p>Use the <a href="optparse.html">OptionParser module</a> to extract all options from
|
||||||
<code>process.argv</code> that are specified in <code>SWITCHES</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">parseOptions = </span><span class="o">-></span>
|
<code>process.argv</code> that are specified in <code>SWITCHES</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">parseOptions = </span><span class="o">-></span>
|
||||||
<span class="nv">optionParser = </span><span class="k">new</span> <span class="nx">optparse</span><span class="p">.</span><span class="nx">OptionParser</span> <span class="nx">SWITCHES</span><span class="p">,</span> <span class="nx">BANNER</span>
|
<span class="nv">optionParser = </span><span class="k">new</span> <span class="nx">optparse</span><span class="p">.</span><span class="nx">OptionParser</span> <span class="nx">SWITCHES</span><span class="p">,</span> <span class="nx">BANNER</span>
|
||||||
<span class="nv">o = opts = </span><span class="nx">optionParser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">.</span><span class="nx">slice</span> <span class="mi">2</span>
|
<span class="nv">o = opts = </span><span class="nx">optionParser</span><span class="p">.</span><span class="nx">parse</span> <span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">..]</span>
|
||||||
<span class="nx">o</span><span class="p">.</span><span class="nx">compile</span> <span class="o">or=</span> <span class="o">!!</span><span class="nx">o</span><span class="p">.</span><span class="nx">output</span>
|
<span class="nx">o</span><span class="p">.</span><span class="nx">compile</span> <span class="o">or=</span> <span class="o">!!</span><span class="nx">o</span><span class="p">.</span><span class="nx">output</span>
|
||||||
<span class="nv">o.run = </span><span class="o">not</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">compile</span> <span class="o">or</span> <span class="nx">o</span><span class="p">.</span><span class="nx">print</span> <span class="o">or</span> <span class="nx">o</span><span class="p">.</span><span class="nx">lint</span><span class="p">)</span>
|
<span class="nv">o.run = </span><span class="o">not</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">compile</span> <span class="o">or</span> <span class="nx">o</span><span class="p">.</span><span class="nx">print</span> <span class="o">or</span> <span class="nx">o</span><span class="p">.</span><span class="nx">lint</span><span class="p">)</span>
|
||||||
<span class="nv">o.print = </span><span class="o">!!</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">print</span> <span class="o">or</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nb">eval</span> <span class="o">or</span> <span class="nx">o</span><span class="p">.</span><span class="nx">stdio</span> <span class="o">and</span> <span class="nx">o</span><span class="p">.</span><span class="nx">compile</span><span class="p">))</span>
|
<span class="nv">o.print = </span><span class="o">!!</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">print</span> <span class="o">or</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nb">eval</span> <span class="o">or</span> <span class="nx">o</span><span class="p">.</span><span class="nx">stdio</span> <span class="o">and</span> <span class="nx">o</span><span class="p">.</span><span class="nx">compile</span><span class="p">))</span>
|
||||||
<span class="nv">sources = </span><span class="nx">o</span><span class="p">.</span><span class="nx">arguments</span>
|
<span class="nv">sources = </span><span class="nx">o</span><span class="p">.</span><span class="nx">arguments</span>
|
||||||
<span class="nx">sourceCode</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="kc">null</span> <span class="k">for</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">sources</span>
|
<span class="nx">sourceCode</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="kc">null</span> <span class="k">for</span> <span class="nx">source</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">sources</span>
|
||||||
<span class="k">return</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-23">¶</a> </div> <p>The compile-time options to pass to the CoffeeScript compiler.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">compileOptions = </span><span class="nf">(filename) -></span> <span class="p">{</span><span class="nx">filename</span><span class="p">,</span> <span class="nv">bare: </span><span class="nx">opts</span><span class="p">.</span><span class="nx">bare</span><span class="p">}</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-24">¶</a> </div> <p>Start up a new Node.js instance with the arguments in <code>--nodejs</code> passed to
|
<span class="k">return</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-23">¶</a> </div> <p>The compile-time options to pass to the CoffeeScript compiler.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">compileOptions = </span><span class="nf">(filename) -></span>
|
||||||
|
<span class="p">{</span><span class="nx">filename</span><span class="p">,</span> <span class="nv">bare: </span><span class="nx">opts</span><span class="p">.</span><span class="nx">bare</span><span class="p">,</span> <span class="nv">header: </span><span class="nx">opts</span><span class="p">.</span><span class="nx">compile</span><span class="p">}</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-24">¶</a> </div> <p>Start up a new Node.js instance with the arguments in <code>--nodejs</code> passed to
|
||||||
the <code>node</code> binary, preserving the other options.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">forkNode = </span><span class="o">-></span>
|
the <code>node</code> binary, preserving the other options.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">forkNode = </span><span class="o">-></span>
|
||||||
<span class="nv">nodeArgs = </span><span class="nx">opts</span><span class="p">.</span><span class="nx">nodejs</span><span class="p">.</span><span class="nx">split</span> <span class="sr">/\s+/</span>
|
<span class="nv">nodeArgs = </span><span class="nx">opts</span><span class="p">.</span><span class="nx">nodejs</span><span class="p">.</span><span class="nx">split</span> <span class="sr">/\s+/</span>
|
||||||
<span class="nv">args = </span><span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">..]</span>
|
<span class="nv">args = </span><span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">..]</span>
|
||||||
|
|
|
@ -215,6 +215,7 @@ and optional references to the superclass.</p> </td> <td
|
||||||
<span class="nx">o</span> <span class="s1">'Expression RangeDots Expression'</span><span class="p">,</span> <span class="o">-></span> <span class="k">new</span> <span class="nx">Range</span> <span class="nx">$1</span><span class="p">,</span> <span class="nx">$3</span><span class="p">,</span> <span class="nx">$2</span>
|
<span class="nx">o</span> <span class="s1">'Expression RangeDots Expression'</span><span class="p">,</span> <span class="o">-></span> <span class="k">new</span> <span class="nx">Range</span> <span class="nx">$1</span><span class="p">,</span> <span class="nx">$3</span><span class="p">,</span> <span class="nx">$2</span>
|
||||||
<span class="nx">o</span> <span class="s1">'Expression RangeDots'</span><span class="p">,</span> <span class="o">-></span> <span class="k">new</span> <span class="nx">Range</span> <span class="nx">$1</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">$2</span>
|
<span class="nx">o</span> <span class="s1">'Expression RangeDots'</span><span class="p">,</span> <span class="o">-></span> <span class="k">new</span> <span class="nx">Range</span> <span class="nx">$1</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">$2</span>
|
||||||
<span class="nx">o</span> <span class="s1">'RangeDots Expression'</span><span class="p">,</span> <span class="o">-></span> <span class="k">new</span> <span class="nx">Range</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">$2</span><span class="p">,</span> <span class="nx">$1</span>
|
<span class="nx">o</span> <span class="s1">'RangeDots Expression'</span><span class="p">,</span> <span class="o">-></span> <span class="k">new</span> <span class="nx">Range</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">$2</span><span class="p">,</span> <span class="nx">$1</span>
|
||||||
|
<span class="nx">o</span> <span class="s1">'RangeDots'</span><span class="p">,</span> <span class="o">-></span> <span class="k">new</span> <span class="nx">Range</span> <span class="kc">null</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">$1</span>
|
||||||
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-45"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-45">¶</a> </div> <p>The <strong>ArgList</strong> is both the list of objects passed into a function call,
|
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-45"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-45">¶</a> </div> <p>The <strong>ArgList</strong> is both the list of objects passed into a function call,
|
||||||
as well as the contents of an array literal
|
as well as the contents of an array literal
|
||||||
(i.e. comma-separated expressions). Newlines work as well.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">ArgList: </span><span class="p">[</span>
|
(i.e. comma-separated expressions). Newlines work as well.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">ArgList: </span><span class="p">[</span>
|
||||||
|
@ -348,7 +349,7 @@ rules are necessary.</p> </td> <td class="code">
|
||||||
<span class="nx">o</span> <span class="s1">'Expression LOGIC Expression'</span><span class="p">,</span> <span class="o">-></span> <span class="k">new</span> <span class="nx">Op</span> <span class="nx">$2</span><span class="p">,</span> <span class="nx">$1</span><span class="p">,</span> <span class="nx">$3</span>
|
<span class="nx">o</span> <span class="s1">'Expression LOGIC Expression'</span><span class="p">,</span> <span class="o">-></span> <span class="k">new</span> <span class="nx">Op</span> <span class="nx">$2</span><span class="p">,</span> <span class="nx">$1</span><span class="p">,</span> <span class="nx">$3</span>
|
||||||
<span class="nx">o</span> <span class="s1">'Expression RELATION Expression'</span><span class="p">,</span> <span class="o">-></span>
|
<span class="nx">o</span> <span class="s1">'Expression RELATION Expression'</span><span class="p">,</span> <span class="o">-></span>
|
||||||
<span class="k">if</span> <span class="nx">$2</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'!'</span>
|
<span class="k">if</span> <span class="nx">$2</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'!'</span>
|
||||||
<span class="k">new</span> <span class="nx">Op</span><span class="p">(</span><span class="nx">$2</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="nx">$1</span><span class="p">,</span> <span class="nx">$3</span><span class="p">).</span><span class="nx">invert</span><span class="p">()</span>
|
<span class="k">new</span> <span class="nx">Op</span><span class="p">(</span><span class="nx">$2</span><span class="p">[</span><span class="mi">1</span><span class="p">..],</span> <span class="nx">$1</span><span class="p">,</span> <span class="nx">$3</span><span class="p">).</span><span class="nx">invert</span><span class="p">()</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="k">new</span> <span class="nx">Op</span> <span class="nx">$2</span><span class="p">,</span> <span class="nx">$1</span><span class="p">,</span> <span class="nx">$3</span>
|
<span class="k">new</span> <span class="nx">Op</span> <span class="nx">$2</span><span class="p">,</span> <span class="nx">$1</span><span class="p">,</span> <span class="nx">$3</span>
|
||||||
|
|
||||||
|
@ -381,7 +382,7 @@ down. Following these rules is what makes <code>2 + 3 * 4</code> parse as:</p>
|
||||||
<span class="p">[</span><span class="s1">'nonassoc'</span><span class="p">,</span> <span class="s1">'INDENT'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'nonassoc'</span><span class="p">,</span> <span class="s1">'INDENT'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'right'</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="s1">':'</span><span class="p">,</span> <span class="s1">'COMPOUND_ASSIGN'</span><span class="p">,</span> <span class="s1">'RETURN'</span><span class="p">,</span> <span class="s1">'THROW'</span><span class="p">,</span> <span class="s1">'EXTENDS'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'right'</span><span class="p">,</span> <span class="s1">'='</span><span class="p">,</span> <span class="s1">':'</span><span class="p">,</span> <span class="s1">'COMPOUND_ASSIGN'</span><span class="p">,</span> <span class="s1">'RETURN'</span><span class="p">,</span> <span class="s1">'THROW'</span><span class="p">,</span> <span class="s1">'EXTENDS'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'right'</span><span class="p">,</span> <span class="s1">'FORIN'</span><span class="p">,</span> <span class="s1">'FOROF'</span><span class="p">,</span> <span class="s1">'BY'</span><span class="p">,</span> <span class="s1">'WHEN'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'right'</span><span class="p">,</span> <span class="s1">'FORIN'</span><span class="p">,</span> <span class="s1">'FOROF'</span><span class="p">,</span> <span class="s1">'BY'</span><span class="p">,</span> <span class="s1">'WHEN'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'right'</span><span class="p">,</span> <span class="s1">'IF'</span><span class="p">,</span> <span class="s1">'ELSE'</span><span class="p">,</span> <span class="s1">'FOR'</span><span class="p">,</span> <span class="s1">'DO'</span><span class="p">,</span> <span class="s1">'WHILE'</span><span class="p">,</span> <span class="s1">'UNTIL'</span><span class="p">,</span> <span class="s1">'LOOP'</span><span class="p">,</span> <span class="s1">'SUPER'</span><span class="p">,</span> <span class="s1">'CLASS'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'right'</span><span class="p">,</span> <span class="s1">'IF'</span><span class="p">,</span> <span class="s1">'ELSE'</span><span class="p">,</span> <span class="s1">'FOR'</span><span class="p">,</span> <span class="s1">'WHILE'</span><span class="p">,</span> <span class="s1">'UNTIL'</span><span class="p">,</span> <span class="s1">'LOOP'</span><span class="p">,</span> <span class="s1">'SUPER'</span><span class="p">,</span> <span class="s1">'CLASS'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'right'</span><span class="p">,</span> <span class="s1">'POST_IF'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'right'</span><span class="p">,</span> <span class="s1">'POST_IF'</span><span class="p">]</span>
|
||||||
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-65"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-65">¶</a> </div> <h2>Wrapping Up</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-66"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-66">¶</a> </div> <p>Finally, now that we have our <strong>grammar</strong> and our <strong>operators</strong>, we can create
|
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-65"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-65">¶</a> </div> <h2>Wrapping Up</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-66"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-66">¶</a> </div> <p>Finally, now that we have our <strong>grammar</strong> and our <strong>operators</strong>, we can create
|
||||||
our <strong>Jison.Parser</strong>. We do this by processing all of our rules, recording all
|
our <strong>Jison.Parser</strong>. We do this by processing all of our rules, recording all
|
||||||
|
|
|
@ -32,7 +32,7 @@ unless explicitly asked not to.</p> </td> <td class="cod
|
||||||
<span class="vi">@tokens = </span><span class="p">[]</span> <span class="c1"># Stream of parsed tokens in the form `['TYPE', value, line]`.</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>At every position, run through this list of attempted matches,
|
<span class="vi">@tokens = </span><span class="p">[]</span> <span class="c1"># Stream of parsed tokens in the form `['TYPE', value, line]`.</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>At every position, run through this list of attempted matches,
|
||||||
short-circuiting if any of them succeed. Their order determines precedence:
|
short-circuiting if any of them succeed. Their order determines precedence:
|
||||||
<code>@literalToken</code> is the fallback catch-all.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">i = </span><span class="mi">0</span>
|
<code>@literalToken</code> is the fallback catch-all.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">i = </span><span class="mi">0</span>
|
||||||
<span class="k">while</span> <span class="vi">@chunk = </span><span class="nx">code</span><span class="p">.</span><span class="nx">slice</span> <span class="nx">i</span>
|
<span class="k">while</span> <span class="vi">@chunk = </span><span class="nx">code</span><span class="p">[</span><span class="nx">i</span><span class="p">..]</span>
|
||||||
<span class="nx">i</span> <span class="o">+=</span> <span class="nx">@identifierToken</span><span class="p">()</span> <span class="o">or</span>
|
<span class="nx">i</span> <span class="o">+=</span> <span class="nx">@identifierToken</span><span class="p">()</span> <span class="o">or</span>
|
||||||
<span class="nx">@commentToken</span><span class="p">()</span> <span class="o">or</span>
|
<span class="nx">@commentToken</span><span class="p">()</span> <span class="o">or</span>
|
||||||
<span class="nx">@whitespaceToken</span><span class="p">()</span> <span class="o">or</span>
|
<span class="nx">@whitespaceToken</span><span class="p">()</span> <span class="o">or</span>
|
||||||
|
@ -84,7 +84,7 @@ though <code>is</code> means <code>===</code> otherwise.</p> </td>
|
||||||
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
|
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
|
||||||
<span class="nv">id = </span><span class="s1">'!'</span> <span class="o">+</span> <span class="nx">id</span>
|
<span class="nv">id = </span><span class="s1">'!'</span> <span class="o">+</span> <span class="nx">id</span>
|
||||||
|
|
||||||
<span class="k">if</span> <span class="nx">id</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'eval'</span><span class="p">,</span> <span class="s1">'arguments'</span><span class="p">].</span><span class="nx">concat</span> <span class="nx">JS_FORBIDDEN</span>
|
<span class="k">if</span> <span class="nx">id</span> <span class="k">in</span> <span class="nx">JS_FORBIDDEN</span>
|
||||||
<span class="k">if</span> <span class="nx">forcedIdentifier</span>
|
<span class="k">if</span> <span class="nx">forcedIdentifier</span>
|
||||||
<span class="nv">tag = </span><span class="s1">'IDENTIFIER'</span>
|
<span class="nv">tag = </span><span class="s1">'IDENTIFIER'</span>
|
||||||
<span class="nv">id = </span><span class="k">new</span> <span class="nb">String</span> <span class="nx">id</span>
|
<span class="nv">id = </span><span class="k">new</span> <span class="nb">String</span> <span class="nx">id</span>
|
||||||
|
@ -108,9 +108,19 @@ though <code>is</code> means <code>===</code> otherwise.</p> </td>
|
||||||
Be careful not to interfere with ranges-in-progress.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">numberToken: </span><span class="o">-></span>
|
Be careful not to interfere with ranges-in-progress.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">numberToken: </span><span class="o">-></span>
|
||||||
<span class="k">return</span> <span class="mi">0</span> <span class="nx">unless</span> <span class="nv">match = </span><span class="nx">NUMBER</span><span class="p">.</span><span class="nx">exec</span> <span class="nx">@chunk</span>
|
<span class="k">return</span> <span class="mi">0</span> <span class="nx">unless</span> <span class="nv">match = </span><span class="nx">NUMBER</span><span class="p">.</span><span class="nx">exec</span> <span class="nx">@chunk</span>
|
||||||
<span class="nv">number = </span><span class="nx">match</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
<span class="nv">number = </span><span class="nx">match</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
|
<span class="k">if</span> <span class="sr">/^0[BOX]/</span><span class="p">.</span><span class="nx">test</span> <span class="nx">number</span>
|
||||||
|
<span class="nx">@error</span> <span class="s2">"radix prefix '#{number}' must be lowercase"</span>
|
||||||
|
<span class="k">else</span> <span class="k">if</span> <span class="sr">/E/</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="sr">/^0x/</span><span class="p">.</span><span class="nx">test</span> <span class="nx">number</span>
|
||||||
|
<span class="nx">@error</span> <span class="s2">"exponential notation '#{number}' must be indicated with a lowercase 'e'"</span>
|
||||||
|
<span class="k">else</span> <span class="k">if</span> <span class="sr">/^0\d*[89]/</span><span class="p">.</span><span class="nx">test</span> <span class="nx">number</span>
|
||||||
|
<span class="nx">@error</span> <span class="s2">"decimal literal '#{number}' must not be prefixed with '0'"</span>
|
||||||
|
<span class="k">else</span> <span class="k">if</span> <span class="sr">/^0\d+/</span><span class="p">.</span><span class="nx">test</span> <span class="nx">number</span>
|
||||||
|
<span class="nx">@error</span> <span class="s2">"octal literal '#{number}' must be prefixed with '0o'"</span>
|
||||||
<span class="nv">lexedLength = </span><span class="nx">number</span><span class="p">.</span><span class="nx">length</span>
|
<span class="nv">lexedLength = </span><span class="nx">number</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="k">if</span> <span class="nv">binaryLiteral = </span><span class="sr">/0b([01]+)/</span><span class="p">.</span><span class="nx">exec</span> <span class="nx">number</span>
|
<span class="k">if</span> <span class="nv">octalLiteral = </span><span class="sr">/^0o([0-7]+)/</span><span class="p">.</span><span class="nx">exec</span> <span class="nx">number</span>
|
||||||
<span class="nv">number = </span><span class="p">(</span><span class="nb">parseInt</span> <span class="nx">binaryLiteral</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">2</span><span class="p">).</span><span class="nx">toString</span><span class="p">()</span>
|
<span class="nv">number = </span><span class="s1">'0x'</span> <span class="o">+</span> <span class="p">(</span><span class="nb">parseInt</span> <span class="nx">octalLiteral</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">8</span><span class="p">).</span><span class="nx">toString</span> <span class="mi">16</span>
|
||||||
|
<span class="k">if</span> <span class="nv">binaryLiteral = </span><span class="sr">/^0b([01]+)/</span><span class="p">.</span><span class="nx">exec</span> <span class="nx">number</span>
|
||||||
|
<span class="nv">number = </span><span class="s1">'0x'</span> <span class="o">+</span> <span class="p">(</span><span class="nb">parseInt</span> <span class="nx">binaryLiteral</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">2</span><span class="p">).</span><span class="nx">toString</span> <span class="mi">16</span>
|
||||||
<span class="nx">@token</span> <span class="s1">'NUMBER'</span><span class="p">,</span> <span class="nx">number</span>
|
<span class="nx">@token</span> <span class="s1">'NUMBER'</span><span class="p">,</span> <span class="nx">number</span>
|
||||||
<span class="nx">lexedLength</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Matches strings, including multi-line strings. Ensures that quotation marks
|
<span class="nx">lexedLength</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Matches strings, including multi-line strings. Ensures that quotation marks
|
||||||
are balanced within the string's contents, and within nested interpolations.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">stringToken: </span><span class="o">-></span>
|
are balanced within the string's contents, and within nested interpolations.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">stringToken: </span><span class="o">-></span>
|
||||||
|
@ -121,11 +131,13 @@ are balanced within the string's contents, and within nested interpolations.</p>
|
||||||
<span class="k">when</span> <span class="s1">'"'</span>
|
<span class="k">when</span> <span class="s1">'"'</span>
|
||||||
<span class="k">return</span> <span class="mi">0</span> <span class="nx">unless</span> <span class="nv">string = </span><span class="nx">@balancedString</span> <span class="nx">@chunk</span><span class="p">,</span> <span class="s1">'"'</span>
|
<span class="k">return</span> <span class="mi">0</span> <span class="nx">unless</span> <span class="nv">string = </span><span class="nx">@balancedString</span> <span class="nx">@chunk</span><span class="p">,</span> <span class="s1">'"'</span>
|
||||||
<span class="k">if</span> <span class="mi">0</span> <span class="o"><</span> <span class="nx">string</span><span class="p">.</span><span class="nx">indexOf</span> <span class="s1">'#{'</span><span class="p">,</span> <span class="mi">1</span>
|
<span class="k">if</span> <span class="mi">0</span> <span class="o"><</span> <span class="nx">string</span><span class="p">.</span><span class="nx">indexOf</span> <span class="s1">'#{'</span><span class="p">,</span> <span class="mi">1</span>
|
||||||
<span class="nx">@interpolateString</span> <span class="nx">string</span><span class="p">.</span><span class="nx">slice</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span>
|
<span class="nx">@interpolateString</span> <span class="nx">string</span><span class="p">[</span><span class="mi">1</span><span class="p">...</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nx">@token</span> <span class="s1">'STRING'</span><span class="p">,</span> <span class="nx">@escapeLines</span> <span class="nx">string</span>
|
<span class="nx">@token</span> <span class="s1">'STRING'</span><span class="p">,</span> <span class="nx">@escapeLines</span> <span class="nx">string</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="k">return</span> <span class="mi">0</span>
|
<span class="k">return</span> <span class="mi">0</span>
|
||||||
|
<span class="k">if</span> <span class="nv">octalEsc = </span><span class="sr">/^(?:\\.|[^\\])*\\[0-7]/</span><span class="p">.</span><span class="nx">test</span> <span class="nx">string</span>
|
||||||
|
<span class="nx">@error</span> <span class="s2">"octal escape sequences #{string} are not allowed"</span>
|
||||||
<span class="nx">@line</span> <span class="o">+=</span> <span class="nx">count</span> <span class="nx">string</span><span class="p">,</span> <span class="s1">'\n'</span>
|
<span class="nx">@line</span> <span class="o">+=</span> <span class="nx">count</span> <span class="nx">string</span><span class="p">,</span> <span class="s1">'\n'</span>
|
||||||
<span class="nx">string</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>Matches heredocs, adjusting indentation to the correct level, as heredocs
|
<span class="nx">string</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>Matches heredocs, adjusting indentation to the correct level, as heredocs
|
||||||
preserve whitespace, but ignore indentation to the left.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">heredocToken: </span><span class="o">-></span>
|
preserve whitespace, but ignore indentation to the left.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">heredocToken: </span><span class="o">-></span>
|
||||||
|
@ -144,11 +156,10 @@ preserve whitespace, but ignore indentation to the left.</p> </td>
|
||||||
<span class="k">if</span> <span class="nx">here</span>
|
<span class="k">if</span> <span class="nx">here</span>
|
||||||
<span class="nx">@token</span> <span class="s1">'HERECOMMENT'</span><span class="p">,</span> <span class="nx">@sanitizeHeredoc</span> <span class="nx">here</span><span class="p">,</span>
|
<span class="nx">@token</span> <span class="s1">'HERECOMMENT'</span><span class="p">,</span> <span class="nx">@sanitizeHeredoc</span> <span class="nx">here</span><span class="p">,</span>
|
||||||
<span class="nv">herecomment: </span><span class="kc">true</span><span class="p">,</span> <span class="nv">indent: </span><span class="nb">Array</span><span class="p">(</span><span class="nx">@indent</span> <span class="o">+</span> <span class="mi">1</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span>
|
<span class="nv">herecomment: </span><span class="kc">true</span><span class="p">,</span> <span class="nv">indent: </span><span class="nb">Array</span><span class="p">(</span><span class="nx">@indent</span> <span class="o">+</span> <span class="mi">1</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span>
|
||||||
<span class="nx">@token</span> <span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'\n'</span>
|
|
||||||
<span class="nx">@line</span> <span class="o">+=</span> <span class="nx">count</span> <span class="nx">comment</span><span class="p">,</span> <span class="s1">'\n'</span>
|
<span class="nx">@line</span> <span class="o">+=</span> <span class="nx">count</span> <span class="nx">comment</span><span class="p">,</span> <span class="s1">'\n'</span>
|
||||||
<span class="nx">comment</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>Matches JavaScript interpolated directly into the source via backticks.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">jsToken: </span><span class="o">-></span>
|
<span class="nx">comment</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>Matches JavaScript interpolated directly into the source via backticks.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">jsToken: </span><span class="o">-></span>
|
||||||
<span class="k">return</span> <span class="mi">0</span> <span class="nx">unless</span> <span class="nx">@chunk</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'`'</span> <span class="o">and</span> <span class="nv">match = </span><span class="nx">JSTOKEN</span><span class="p">.</span><span class="nx">exec</span> <span class="nx">@chunk</span>
|
<span class="k">return</span> <span class="mi">0</span> <span class="nx">unless</span> <span class="nx">@chunk</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'`'</span> <span class="o">and</span> <span class="nv">match = </span><span class="nx">JSTOKEN</span><span class="p">.</span><span class="nx">exec</span> <span class="nx">@chunk</span>
|
||||||
<span class="nx">@token</span> <span class="s1">'JS'</span><span class="p">,</span> <span class="p">(</span><span class="nv">script = </span><span class="nx">match</span><span class="p">[</span><span class="mi">0</span><span class="p">]).</span><span class="nx">slice</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span>
|
<span class="nx">@token</span> <span class="s1">'JS'</span><span class="p">,</span> <span class="p">(</span><span class="nv">script = </span><span class="nx">match</span><span class="p">[</span><span class="mi">0</span><span class="p">])[</span><span class="mi">1</span><span class="p">...</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||||||
<span class="nx">script</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Matches regular expression literals. Lexing regular expressions is difficult
|
<span class="nx">script</span><span class="p">.</span><span class="nx">length</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Matches regular expression literals. Lexing regular expressions is difficult
|
||||||
to distinguish from division, so we borrow some basic heuristics from
|
to distinguish from division, so we borrow some basic heuristics from
|
||||||
JavaScript and Ruby.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">regexToken: </span><span class="o">-></span>
|
JavaScript and Ruby.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">regexToken: </span><span class="o">-></span>
|
||||||
|
@ -275,9 +286,9 @@ parentheses that indicate a method call from regular parentheses, and so on.</p>
|
||||||
<span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'COMPOUND_ASSIGN'</span>
|
<span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'COMPOUND_ASSIGN'</span>
|
||||||
<span class="nx">prev</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'='</span>
|
<span class="nx">prev</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">'='</span>
|
||||||
<span class="k">return</span> <span class="nx">value</span><span class="p">.</span><span class="nx">length</span>
|
<span class="k">return</span> <span class="nx">value</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="k">if</span> <span class="nx">value</span> <span class="o">is</span> <span class="s1">';'</span>
|
<span class="k">if</span> <span class="nx">value</span> <span class="o">is</span> <span class="s1">';'</span>
|
||||||
<span class="vi">@seenFor = </span><span class="kc">no</span>
|
<span class="vi">@seenFor = </span><span class="kc">no</span>
|
||||||
<span class="nv">tag = </span><span class="s1">'TERMINATOR'</span>
|
<span class="nv">tag = </span><span class="s1">'TERMINATOR'</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">value</span> <span class="k">in</span> <span class="nx">MATH</span> <span class="k">then</span> <span class="nv">tag = </span><span class="s1">'MATH'</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">value</span> <span class="k">in</span> <span class="nx">MATH</span> <span class="k">then</span> <span class="nv">tag = </span><span class="s1">'MATH'</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">value</span> <span class="k">in</span> <span class="nx">COMPARE</span> <span class="k">then</span> <span class="nv">tag = </span><span class="s1">'COMPARE'</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">value</span> <span class="k">in</span> <span class="nx">COMPARE</span> <span class="k">then</span> <span class="nv">tag = </span><span class="s1">'COMPARE'</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">value</span> <span class="k">in</span> <span class="nx">COMPOUND_ASSIGN</span> <span class="k">then</span> <span class="nv">tag = </span><span class="s1">'COMPOUND_ASSIGN'</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">value</span> <span class="k">in</span> <span class="nx">COMPOUND_ASSIGN</span> <span class="k">then</span> <span class="nv">tag = </span><span class="s1">'COMPOUND_ASSIGN'</span>
|
||||||
|
@ -332,22 +343,26 @@ parameters specially in order to make things easier for the parser.</p>
|
||||||
a series of delimiters, all of which must be nested correctly within the
|
a series of delimiters, all of which must be nested correctly within the
|
||||||
contents of the string. This method allows us to have strings within
|
contents of the string. This method allows us to have strings within
|
||||||
interpolations within strings, ad infinitum.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">balancedString: </span><span class="nf">(str, end) -></span>
|
interpolations within strings, ad infinitum.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">balancedString: </span><span class="nf">(str, end) -></span>
|
||||||
|
<span class="nv">continueCount = </span><span class="mi">0</span>
|
||||||
<span class="nv">stack = </span><span class="p">[</span><span class="nx">end</span><span class="p">]</span>
|
<span class="nv">stack = </span><span class="p">[</span><span class="nx">end</span><span class="p">]</span>
|
||||||
<span class="k">for</span> <span class="nx">i</span> <span class="k">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">...</span><span class="nx">str</span><span class="p">.</span><span class="nx">length</span><span class="p">]</span>
|
<span class="k">for</span> <span class="nx">i</span> <span class="k">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">...</span><span class="nx">str</span><span class="p">.</span><span class="nx">length</span><span class="p">]</span>
|
||||||
|
<span class="k">if</span> <span class="nx">continueCount</span>
|
||||||
|
<span class="o">--</span><span class="nx">continueCount</span>
|
||||||
|
<span class="k">continue</span>
|
||||||
<span class="k">switch</span> <span class="nv">letter = </span><span class="nx">str</span><span class="p">.</span><span class="nx">charAt</span> <span class="nx">i</span>
|
<span class="k">switch</span> <span class="nv">letter = </span><span class="nx">str</span><span class="p">.</span><span class="nx">charAt</span> <span class="nx">i</span>
|
||||||
<span class="k">when</span> <span class="s1">'\\'</span>
|
<span class="k">when</span> <span class="s1">'\\'</span>
|
||||||
<span class="nx">i</span><span class="o">++</span>
|
<span class="o">++</span><span class="nx">continueCount</span>
|
||||||
<span class="k">continue</span>
|
<span class="k">continue</span>
|
||||||
<span class="k">when</span> <span class="nx">end</span>
|
<span class="k">when</span> <span class="nx">end</span>
|
||||||
<span class="nx">stack</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
|
<span class="nx">stack</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
|
||||||
<span class="nx">unless</span> <span class="nx">stack</span><span class="p">.</span><span class="nx">length</span>
|
<span class="nx">unless</span> <span class="nx">stack</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="k">return</span> <span class="nx">str</span><span class="p">.</span><span class="nx">slice</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span>
|
<span class="k">return</span> <span class="nx">str</span><span class="p">[</span><span class="mi">0</span><span class="p">..</span><span class="nx">i</span><span class="p">]</span>
|
||||||
<span class="nv">end = </span><span class="nx">stack</span><span class="p">[</span><span class="nx">stack</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
|
<span class="nv">end = </span><span class="nx">stack</span><span class="p">[</span><span class="nx">stack</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
|
||||||
<span class="k">continue</span>
|
<span class="k">continue</span>
|
||||||
<span class="k">if</span> <span class="nx">end</span> <span class="o">is</span> <span class="s1">'}'</span> <span class="o">and</span> <span class="nx">letter</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'"'</span><span class="p">,</span> <span class="s2">"'"</span><span class="p">]</span>
|
<span class="k">if</span> <span class="nx">end</span> <span class="o">is</span> <span class="s1">'}'</span> <span class="o">and</span> <span class="nx">letter</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'"'</span><span class="p">,</span> <span class="s2">"'"</span><span class="p">]</span>
|
||||||
<span class="nx">stack</span><span class="p">.</span><span class="nx">push</span> <span class="nv">end = </span><span class="nx">letter</span>
|
<span class="nx">stack</span><span class="p">.</span><span class="nx">push</span> <span class="nv">end = </span><span class="nx">letter</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">end</span> <span class="o">is</span> <span class="s1">'}'</span> <span class="o">and</span> <span class="nx">letter</span> <span class="o">is</span> <span class="s1">'/'</span> <span class="o">and</span> <span class="nv">match = </span><span class="p">(</span><span class="nx">HEREGEX</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="nx">str</span><span class="p">.</span><span class="nx">slice</span> <span class="nx">i</span><span class="p">)</span> <span class="o">or</span> <span class="nx">REGEX</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="nx">str</span><span class="p">.</span><span class="nx">slice</span> <span class="nx">i</span><span class="p">))</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">end</span> <span class="o">is</span> <span class="s1">'}'</span> <span class="o">and</span> <span class="nx">letter</span> <span class="o">is</span> <span class="s1">'/'</span> <span class="o">and</span> <span class="nv">match = </span><span class="p">(</span><span class="nx">HEREGEX</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="nx">str</span><span class="p">[</span><span class="nx">i</span><span class="p">..])</span> <span class="o">or</span> <span class="nx">REGEX</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="nx">str</span><span class="p">[</span><span class="nx">i</span><span class="p">..]))</span>
|
||||||
<span class="nx">i</span> <span class="o">+=</span> <span class="nx">match</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span>
|
<span class="nx">continueCount</span> <span class="o">+=</span> <span class="nx">match</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">end</span> <span class="o">is</span> <span class="s1">'}'</span> <span class="o">and</span> <span class="nx">letter</span> <span class="o">is</span> <span class="s1">'{'</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">end</span> <span class="o">is</span> <span class="s1">'}'</span> <span class="o">and</span> <span class="nx">letter</span> <span class="o">is</span> <span class="s1">'{'</span>
|
||||||
<span class="nx">stack</span><span class="p">.</span><span class="nx">push</span> <span class="nv">end = </span><span class="s1">'}'</span>
|
<span class="nx">stack</span><span class="p">.</span><span class="nx">push</span> <span class="nv">end = </span><span class="s1">'}'</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">end</span> <span class="o">is</span> <span class="s1">'"'</span> <span class="o">and</span> <span class="nx">prev</span> <span class="o">is</span> <span class="s1">'#'</span> <span class="o">and</span> <span class="nx">letter</span> <span class="o">is</span> <span class="s1">'{'</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">end</span> <span class="o">is</span> <span class="s1">'"'</span> <span class="o">and</span> <span class="nx">prev</span> <span class="o">is</span> <span class="s1">'#'</span> <span class="o">and</span> <span class="nx">letter</span> <span class="o">is</span> <span class="s1">'{'</span>
|
||||||
|
@ -371,10 +386,10 @@ token stream.</p> </td> <td class="code">
|
||||||
<span class="nx">i</span> <span class="o">+=</span> <span class="mi">1</span>
|
<span class="nx">i</span> <span class="o">+=</span> <span class="mi">1</span>
|
||||||
<span class="k">continue</span>
|
<span class="k">continue</span>
|
||||||
<span class="nx">unless</span> <span class="nx">letter</span> <span class="o">is</span> <span class="s1">'#'</span> <span class="o">and</span> <span class="nx">str</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="nx">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'{'</span> <span class="o">and</span>
|
<span class="nx">unless</span> <span class="nx">letter</span> <span class="o">is</span> <span class="s1">'#'</span> <span class="o">and</span> <span class="nx">str</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="nx">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'{'</span> <span class="o">and</span>
|
||||||
<span class="p">(</span><span class="nv">expr = </span><span class="nx">@balancedString</span> <span class="nx">str</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span> <span class="s1">'}'</span><span class="p">)</span>
|
<span class="p">(</span><span class="nv">expr = </span><span class="nx">@balancedString</span> <span class="nx">str</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">..],</span> <span class="s1">'}'</span><span class="p">)</span>
|
||||||
<span class="k">continue</span>
|
<span class="k">continue</span>
|
||||||
<span class="nx">tokens</span><span class="p">.</span><span class="nx">push</span> <span class="p">[</span><span class="s1">'NEOSTRING'</span><span class="p">,</span> <span class="nx">str</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="nx">pi</span><span class="p">,</span> <span class="nx">i</span><span class="p">)]</span> <span class="k">if</span> <span class="nx">pi</span> <span class="o"><</span> <span class="nx">i</span>
|
<span class="nx">tokens</span><span class="p">.</span><span class="nx">push</span> <span class="p">[</span><span class="s1">'NEOSTRING'</span><span class="p">,</span> <span class="nx">str</span><span class="p">[</span><span class="nx">pi</span><span class="p">...</span><span class="nx">i</span><span class="p">]]</span> <span class="k">if</span> <span class="nx">pi</span> <span class="o"><</span> <span class="nx">i</span>
|
||||||
<span class="nv">inner = </span><span class="nx">expr</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
<span class="nv">inner = </span><span class="nx">expr</span><span class="p">[</span><span class="mi">1</span><span class="p">...</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||||||
<span class="k">if</span> <span class="nx">inner</span><span class="p">.</span><span class="nx">length</span>
|
<span class="k">if</span> <span class="nx">inner</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="nv">nested = </span><span class="k">new</span> <span class="nx">Lexer</span><span class="p">().</span><span class="nx">tokenize</span> <span class="nx">inner</span><span class="p">,</span> <span class="nv">line: </span><span class="nx">@line</span><span class="p">,</span> <span class="nv">rewrite: </span><span class="kc">off</span>
|
<span class="nv">nested = </span><span class="k">new</span> <span class="nx">Lexer</span><span class="p">().</span><span class="nx">tokenize</span> <span class="nx">inner</span><span class="p">,</span> <span class="nv">line: </span><span class="nx">@line</span><span class="p">,</span> <span class="nv">rewrite: </span><span class="kc">off</span>
|
||||||
<span class="nx">nested</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
|
<span class="nx">nested</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
|
||||||
|
@ -386,7 +401,7 @@ token stream.</p> </td> <td class="code">
|
||||||
<span class="nx">tokens</span><span class="p">.</span><span class="nx">push</span> <span class="p">[</span><span class="s1">'TOKENS'</span><span class="p">,</span> <span class="nx">nested</span><span class="p">]</span>
|
<span class="nx">tokens</span><span class="p">.</span><span class="nx">push</span> <span class="p">[</span><span class="s1">'TOKENS'</span><span class="p">,</span> <span class="nx">nested</span><span class="p">]</span>
|
||||||
<span class="nx">i</span> <span class="o">+=</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">length</span>
|
<span class="nx">i</span> <span class="o">+=</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="nv">pi = </span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span>
|
<span class="nv">pi = </span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span>
|
||||||
<span class="nx">tokens</span><span class="p">.</span><span class="nx">push</span> <span class="p">[</span><span class="s1">'NEOSTRING'</span><span class="p">,</span> <span class="nx">str</span><span class="p">.</span><span class="nx">slice</span> <span class="nx">pi</span><span class="p">]</span> <span class="k">if</span> <span class="nx">i</span> <span class="o">></span> <span class="nx">pi</span> <span class="o"><</span> <span class="nx">str</span><span class="p">.</span><span class="nx">length</span>
|
<span class="nx">tokens</span><span class="p">.</span><span class="nx">push</span> <span class="p">[</span><span class="s1">'NEOSTRING'</span><span class="p">,</span> <span class="nx">str</span><span class="p">[</span><span class="nx">pi</span><span class="p">..]]</span> <span class="k">if</span> <span class="nx">i</span> <span class="o">></span> <span class="nx">pi</span> <span class="o"><</span> <span class="nx">str</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="k">return</span> <span class="nx">tokens</span> <span class="k">if</span> <span class="nx">regex</span>
|
<span class="k">return</span> <span class="nx">tokens</span> <span class="k">if</span> <span class="nx">regex</span>
|
||||||
<span class="k">return</span> <span class="nx">@token</span> <span class="s1">'STRING'</span><span class="p">,</span> <span class="s1">'""'</span> <span class="nx">unless</span> <span class="nx">tokens</span><span class="p">.</span><span class="nx">length</span>
|
<span class="k">return</span> <span class="nx">@token</span> <span class="s1">'STRING'</span><span class="p">,</span> <span class="s1">'""'</span> <span class="nx">unless</span> <span class="nx">tokens</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="nx">tokens</span><span class="p">.</span><span class="nx">unshift</span> <span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">''</span><span class="p">]</span> <span class="nx">unless</span> <span class="nx">tokens</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'NEOSTRING'</span>
|
<span class="nx">tokens</span><span class="p">.</span><span class="nx">unshift</span> <span class="p">[</span><span class="s1">''</span><span class="p">,</span> <span class="s1">''</span><span class="p">]</span> <span class="nx">unless</span> <span class="nx">tokens</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'NEOSTRING'</span>
|
||||||
|
@ -414,14 +429,13 @@ correctly balanced throughout the course of the token stream.</p> </
|
||||||
<span class="p">(</span><span class="nv">tok = </span><span class="nx">last</span> <span class="nx">@tokens</span><span class="p">,</span> <span class="nx">index</span><span class="p">)</span> <span class="o">and</span> <span class="k">if</span> <span class="nx">val</span> <span class="k">then</span> <span class="nx">tok</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span> <span class="k">else</span> <span class="nx">tok</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-34"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-34">¶</a> </div> <p>Are we in the midst of an unfinished expression?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">unfinished: </span><span class="o">-></span>
|
<span class="p">(</span><span class="nv">tok = </span><span class="nx">last</span> <span class="nx">@tokens</span><span class="p">,</span> <span class="nx">index</span><span class="p">)</span> <span class="o">and</span> <span class="k">if</span> <span class="nx">val</span> <span class="k">then</span> <span class="nx">tok</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span> <span class="k">else</span> <span class="nx">tok</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-34"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-34">¶</a> </div> <p>Are we in the midst of an unfinished expression?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">unfinished: </span><span class="o">-></span>
|
||||||
<span class="nx">LINE_CONTINUER</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">@chunk</span><span class="p">)</span> <span class="o">or</span>
|
<span class="nx">LINE_CONTINUER</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">@chunk</span><span class="p">)</span> <span class="o">or</span>
|
||||||
<span class="nx">@tag</span><span class="p">()</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'\\'</span><span class="p">,</span> <span class="s1">'.'</span><span class="p">,</span> <span class="s1">'?.'</span><span class="p">,</span> <span class="s1">'UNARY'</span><span class="p">,</span> <span class="s1">'MATH'</span><span class="p">,</span> <span class="s1">'+'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">,</span> <span class="s1">'SHIFT'</span><span class="p">,</span> <span class="s1">'RELATION'</span>
|
<span class="nx">@tag</span><span class="p">()</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'\\'</span><span class="p">,</span> <span class="s1">'.'</span><span class="p">,</span> <span class="s1">'?.'</span><span class="p">,</span> <span class="s1">'UNARY'</span><span class="p">,</span> <span class="s1">'MATH'</span><span class="p">,</span> <span class="s1">'+'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">,</span> <span class="s1">'SHIFT'</span><span class="p">,</span> <span class="s1">'RELATION'</span>
|
||||||
<span class="s1">'COMPARE'</span><span class="p">,</span> <span class="s1">'LOGIC'</span><span class="p">,</span> <span class="s1">'COMPOUND_ASSIGN'</span><span class="p">,</span> <span class="s1">'THROW'</span><span class="p">,</span> <span class="s1">'EXTENDS'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-35"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-35">¶</a> </div> <p>Converts newlines for string literals.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">escapeLines: </span><span class="nf">(str, heredoc) -></span>
|
<span class="s1">'COMPARE'</span><span class="p">,</span> <span class="s1">'LOGIC'</span><span class="p">,</span> <span class="s1">'THROW'</span><span class="p">,</span> <span class="s1">'EXTENDS'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-35"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-35">¶</a> </div> <p>Converts newlines for string literals.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">escapeLines: </span><span class="nf">(str, heredoc) -></span>
|
||||||
<span class="nx">str</span><span class="p">.</span><span class="nx">replace</span> <span class="nx">MULTILINER</span><span class="p">,</span> <span class="k">if</span> <span class="nx">heredoc</span> <span class="k">then</span> <span class="s1">'\\n'</span> <span class="k">else</span> <span class="s1">''</span></pre></div> </td> </tr> <tr id="section-36"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-36">¶</a> </div> <p>Constructs a string token by escaping quotes and newlines.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">makeString: </span><span class="nf">(body, quote, heredoc) -></span>
|
<span class="nx">str</span><span class="p">.</span><span class="nx">replace</span> <span class="nx">MULTILINER</span><span class="p">,</span> <span class="k">if</span> <span class="nx">heredoc</span> <span class="k">then</span> <span class="s1">'\\n'</span> <span class="k">else</span> <span class="s1">''</span></pre></div> </td> </tr> <tr id="section-36"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-36">¶</a> </div> <p>Constructs a string token by escaping quotes and newlines.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">makeString: </span><span class="nf">(body, quote, heredoc) -></span>
|
||||||
<span class="k">return</span> <span class="nx">quote</span> <span class="o">+</span> <span class="nx">quote</span> <span class="nx">unless</span> <span class="nx">body</span>
|
<span class="k">return</span> <span class="nx">quote</span> <span class="o">+</span> <span class="nx">quote</span> <span class="nx">unless</span> <span class="nx">body</span>
|
||||||
<span class="nv">body = </span><span class="nx">body</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\\([\s\S])/g</span><span class="p">,</span> <span class="nf">(match, contents) -></span>
|
<span class="nv">body = </span><span class="nx">body</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\\([\s\S])/g</span><span class="p">,</span> <span class="nf">(match, contents) -></span>
|
||||||
<span class="k">if</span> <span class="nx">contents</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'\n'</span><span class="p">,</span> <span class="nx">quote</span><span class="p">]</span> <span class="k">then</span> <span class="nx">contents</span> <span class="k">else</span> <span class="nx">match</span>
|
<span class="k">if</span> <span class="nx">contents</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'\n'</span><span class="p">,</span> <span class="nx">quote</span><span class="p">]</span> <span class="k">then</span> <span class="nx">contents</span> <span class="k">else</span> <span class="nx">match</span>
|
||||||
<span class="nv">body = </span><span class="nx">body</span><span class="p">.</span><span class="nx">replace</span> <span class="err">/// #{quote} ///g, '\\$&'</span>
|
<span class="nv">body = </span><span class="nx">body</span><span class="p">.</span><span class="nx">replace</span> <span class="err">/// #{quote} ///g, '\\$&'</span>
|
||||||
<span class="nx">quote</span> <span class="o">+</span> <span class="nx">@escapeLines</span><span class="p">(</span><span class="nx">body</span><span class="p">,</span> <span class="nx">heredoc</span><span class="p">)</span> <span class="o">+</span> <span class="nx">quote</span>
|
<span class="nx">quote</span> <span class="o">+</span> <span class="nx">@escapeLines</span><span class="p">(</span><span class="nx">body</span><span class="p">,</span> <span class="nx">heredoc</span><span class="p">)</span> <span class="o">+</span> <span class="nx">quote</span></pre></div> </td> </tr> <tr id="section-37"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-37">¶</a> </div> <p>Throws a syntax error on the current <code>@line</code>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">error: </span><span class="nf">(message) -></span>
|
||||||
</pre></div> </td> </tr> <tr id="section-37"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-37">¶</a> </div> <p>Throws a syntax error on the current <code>@line</code>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">error: </span><span class="nf">(message) -></span>
|
|
||||||
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s2">"#{message} on line #{ @line + 1}"</span></pre></div> </td> </tr> <tr id="section-38"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-38">¶</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-39"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-39">¶</a> </div> <p>Keywords that CoffeeScript shares in common with JavaScript.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">JS_KEYWORDS = </span><span class="p">[</span>
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s2">"#{message} on line #{ @line + 1}"</span></pre></div> </td> </tr> <tr id="section-38"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-38">¶</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-39"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-39">¶</a> </div> <p>Keywords that CoffeeScript shares in common with JavaScript.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">JS_KEYWORDS = </span><span class="p">[</span>
|
||||||
<span class="s1">'true'</span><span class="p">,</span> <span class="s1">'false'</span><span class="p">,</span> <span class="s1">'null'</span><span class="p">,</span> <span class="s1">'this'</span>
|
<span class="s1">'true'</span><span class="p">,</span> <span class="s1">'false'</span><span class="p">,</span> <span class="s1">'null'</span><span class="p">,</span> <span class="s1">'this'</span>
|
||||||
<span class="s1">'new'</span><span class="p">,</span> <span class="s1">'delete'</span><span class="p">,</span> <span class="s1">'typeof'</span><span class="p">,</span> <span class="s1">'in'</span><span class="p">,</span> <span class="s1">'instanceof'</span>
|
<span class="s1">'new'</span><span class="p">,</span> <span class="s1">'delete'</span><span class="p">,</span> <span class="s1">'typeof'</span><span class="p">,</span> <span class="s1">'in'</span><span class="p">,</span> <span class="s1">'instanceof'</span>
|
||||||
|
@ -448,17 +462,23 @@ to avoid having a JavaScript error at runtime.</p> </td>
|
||||||
<span class="s1">'case'</span><span class="p">,</span> <span class="s1">'default'</span><span class="p">,</span> <span class="s1">'function'</span><span class="p">,</span> <span class="s1">'var'</span><span class="p">,</span> <span class="s1">'void'</span><span class="p">,</span> <span class="s1">'with'</span>
|
<span class="s1">'case'</span><span class="p">,</span> <span class="s1">'default'</span><span class="p">,</span> <span class="s1">'function'</span><span class="p">,</span> <span class="s1">'var'</span><span class="p">,</span> <span class="s1">'void'</span><span class="p">,</span> <span class="s1">'with'</span>
|
||||||
<span class="s1">'const'</span><span class="p">,</span> <span class="s1">'let'</span><span class="p">,</span> <span class="s1">'enum'</span><span class="p">,</span> <span class="s1">'export'</span><span class="p">,</span> <span class="s1">'import'</span><span class="p">,</span> <span class="s1">'native'</span>
|
<span class="s1">'const'</span><span class="p">,</span> <span class="s1">'let'</span><span class="p">,</span> <span class="s1">'enum'</span><span class="p">,</span> <span class="s1">'export'</span><span class="p">,</span> <span class="s1">'import'</span><span class="p">,</span> <span class="s1">'native'</span>
|
||||||
<span class="s1">'__hasProp'</span><span class="p">,</span> <span class="s1">'__extends'</span><span class="p">,</span> <span class="s1">'__slice'</span><span class="p">,</span> <span class="s1">'__bind'</span><span class="p">,</span> <span class="s1">'__indexOf'</span>
|
<span class="s1">'__hasProp'</span><span class="p">,</span> <span class="s1">'__extends'</span><span class="p">,</span> <span class="s1">'__slice'</span><span class="p">,</span> <span class="s1">'__bind'</span><span class="p">,</span> <span class="s1">'__indexOf'</span>
|
||||||
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-42"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-42">¶</a> </div> <p>The superset of both JavaScript keywords and reserved words, none of which may
|
<span class="s1">'implements'</span><span class="p">,</span> <span class="s1">'interface'</span><span class="p">,</span> <span class="s1">'let'</span><span class="p">,</span> <span class="s1">'package'</span><span class="p">,</span>
|
||||||
be used as identifiers or properties.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">JS_FORBIDDEN = </span><span class="nx">JS_KEYWORDS</span><span class="p">.</span><span class="nx">concat</span> <span class="nx">RESERVED</span>
|
<span class="s1">'private'</span><span class="p">,</span> <span class="s1">'protected'</span><span class="p">,</span> <span class="s1">'public'</span><span class="p">,</span> <span class="s1">'static'</span><span class="p">,</span> <span class="s1">'yield'</span>
|
||||||
|
<span class="p">]</span>
|
||||||
|
|
||||||
<span class="nv">exports.RESERVED = </span><span class="nx">RESERVED</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">JS_KEYWORDS</span><span class="p">).</span><span class="nx">concat</span><span class="p">(</span><span class="nx">COFFEE_KEYWORDS</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-43"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-43">¶</a> </div> <p>Token matching regexes.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IDENTIFIER = </span><span class="err">/// ^</span>
|
<span class="nv">STRICT_PROSCRIBED = </span><span class="p">[</span><span class="s1">'arguments'</span><span class="p">,</span> <span class="s1">'eval'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-42"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-42">¶</a> </div> <p>The superset of both JavaScript keywords and reserved words, none of which may
|
||||||
|
be used as identifiers or properties.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">JS_FORBIDDEN = </span><span class="nx">JS_KEYWORDS</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">RESERVED</span><span class="p">).</span><span class="nx">concat</span><span class="p">(</span><span class="nx">STRICT_PROSCRIBED</span><span class="p">)</span>
|
||||||
|
|
||||||
|
<span class="nv">exports.RESERVED = </span><span class="nx">RESERVED</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">JS_KEYWORDS</span><span class="p">).</span><span class="nx">concat</span><span class="p">(</span><span class="nx">COFFEE_KEYWORDS</span><span class="p">).</span><span class="nx">concat</span><span class="p">(</span><span class="nx">STRICT_PROSCRIBED</span><span class="p">)</span>
|
||||||
|
<span class="nv">exports.STRICT_PROSCRIBED = </span><span class="nx">STRICT_PROSCRIBED</span></pre></div> </td> </tr> <tr id="section-43"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-43">¶</a> </div> <p>Token matching regexes.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IDENTIFIER = </span><span class="err">/// ^</span>
|
||||||
<span class="p">(</span> <span class="p">[</span><span class="nx">$A</span><span class="o">-</span><span class="nx">Za</span><span class="o">-</span><span class="nx">z_</span><span class="err">\</span><span class="nx">x7f</span><span class="o">-</span><span class="err">\</span><span class="nx">uffff</span><span class="p">][</span><span class="nx">$</span><span class="err">\</span><span class="nx">w</span><span class="err">\</span><span class="nx">x7f</span><span class="o">-</span><span class="err">\</span><span class="nx">uffff</span><span class="p">]</span><span class="o">*</span> <span class="p">)</span>
|
<span class="p">(</span> <span class="p">[</span><span class="nx">$A</span><span class="o">-</span><span class="nx">Za</span><span class="o">-</span><span class="nx">z_</span><span class="err">\</span><span class="nx">x7f</span><span class="o">-</span><span class="err">\</span><span class="nx">uffff</span><span class="p">][</span><span class="nx">$</span><span class="err">\</span><span class="nx">w</span><span class="err">\</span><span class="nx">x7f</span><span class="o">-</span><span class="err">\</span><span class="nx">uffff</span><span class="p">]</span><span class="o">*</span> <span class="p">)</span>
|
||||||
<span class="p">(</span> <span class="p">[</span><span class="o">^</span><span class="err">\</span><span class="nx">n</span><span class="err">\</span><span class="nx">S</span><span class="p">]</span><span class="o">*</span> <span class="o">:</span> <span class="p">(</span><span class="o">?!:</span><span class="p">)</span> <span class="p">)</span><span class="o">?</span> <span class="c1"># Is this a property name?</span>
|
<span class="p">(</span> <span class="p">[</span><span class="o">^</span><span class="err">\</span><span class="nx">n</span><span class="err">\</span><span class="nx">S</span><span class="p">]</span><span class="o">*</span> <span class="o">:</span> <span class="p">(</span><span class="o">?!:</span><span class="p">)</span> <span class="p">)</span><span class="o">?</span> <span class="c1"># Is this a property name?</span>
|
||||||
<span class="err">///</span>
|
<span class="err">///</span>
|
||||||
|
|
||||||
<span class="nv">NUMBER = </span><span class="err">///</span>
|
<span class="nv">NUMBER = </span><span class="err">///</span>
|
||||||
<span class="o">^</span> <span class="mi">0</span><span class="nx">x</span><span class="p">[</span><span class="err">\</span><span class="nx">da</span><span class="o">-</span><span class="nx">f</span><span class="p">]</span><span class="o">+</span> <span class="o">|</span> <span class="c1"># hex</span>
|
<span class="o">^</span> <span class="mi">0</span><span class="nx">b</span><span class="p">[</span><span class="mi">01</span><span class="p">]</span><span class="o">+</span> <span class="o">|</span> <span class="c1"># binary</span>
|
||||||
<span class="o">^</span> <span class="mi">0</span><span class="nx">b</span><span class="p">[</span><span class="mi">01</span><span class="p">]</span><span class="o">+</span> <span class="o">|</span> <span class="c1"># binary</span>
|
<span class="o">^</span> <span class="mi">0</span><span class="nx">o</span><span class="p">[</span><span class="mi">0</span><span class="o">-</span><span class="mi">7</span><span class="p">]</span><span class="o">+</span> <span class="o">|</span> <span class="c1"># octal</span>
|
||||||
|
<span class="o">^</span> <span class="mi">0</span><span class="nx">x</span><span class="p">[</span><span class="err">\</span><span class="nx">da</span><span class="o">-</span><span class="nx">f</span><span class="p">]</span><span class="o">+</span> <span class="o">|</span> <span class="c1"># hex</span>
|
||||||
<span class="o">^</span> <span class="err">\</span><span class="nx">d</span><span class="o">*</span><span class="err">\</span><span class="p">.</span><span class="o">?</span><span class="err">\</span><span class="nx">d</span><span class="o">+</span> <span class="p">(</span><span class="o">?:</span><span class="nx">e</span><span class="p">[</span><span class="o">+-</span><span class="p">]</span><span class="o">?</span><span class="err">\</span><span class="nx">d</span><span class="o">+</span><span class="p">)</span><span class="o">?</span> <span class="c1"># decimal</span>
|
<span class="o">^</span> <span class="err">\</span><span class="nx">d</span><span class="o">*</span><span class="err">\</span><span class="p">.</span><span class="o">?</span><span class="err">\</span><span class="nx">d</span><span class="o">+</span> <span class="p">(</span><span class="o">?:</span><span class="nx">e</span><span class="p">[</span><span class="o">+-</span><span class="p">]</span><span class="o">?</span><span class="err">\</span><span class="nx">d</span><span class="o">+</span><span class="p">)</span><span class="o">?</span> <span class="c1"># decimal</span>
|
||||||
<span class="err">///i</span>
|
<span class="err">///i</span>
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
nodes are created as the result of actions in the <a href="grammar.html">grammar</a>,
|
nodes are created as the result of actions in the <a href="grammar.html">grammar</a>,
|
||||||
but some are created by other nodes as a method of code generation. To convert
|
but some are created by other nodes as a method of code generation. To convert
|
||||||
the syntax tree into a string of JavaScript code, call <code>compile()</code> on the root.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">Scope</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'./scope'</span>
|
the syntax tree into a string of JavaScript code, call <code>compile()</code> on the root.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">Scope</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'./scope'</span>
|
||||||
<span class="p">{</span><span class="nx">RESERVED</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'./lexer'</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <p>Import the helpers we plan to use.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">compact</span><span class="p">,</span> <span class="nx">flatten</span><span class="p">,</span> <span class="nx">extend</span><span class="p">,</span> <span class="nx">merge</span><span class="p">,</span> <span class="nx">del</span><span class="p">,</span> <span class="nx">starts</span><span class="p">,</span> <span class="nx">ends</span><span class="p">,</span> <span class="nx">last</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'./helpers'</span>
|
<span class="p">{</span><span class="nx">RESERVED</span><span class="p">,</span> <span class="nx">STRICT_PROSCRIBED</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'./lexer'</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <p>Import the helpers we plan to use.</p> </td> <td class="code"> <div class="highlight"><pre><span class="p">{</span><span class="nx">compact</span><span class="p">,</span> <span class="nx">flatten</span><span class="p">,</span> <span class="nx">extend</span><span class="p">,</span> <span class="nx">merge</span><span class="p">,</span> <span class="nx">del</span><span class="p">,</span> <span class="nx">starts</span><span class="p">,</span> <span class="nx">ends</span><span class="p">,</span> <span class="nx">last</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'./helpers'</span>
|
||||||
|
|
||||||
<span class="nv">exports.extend = </span><span class="nx">extend</span> <span class="c1"># for parser</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Constant functions for nodes that don't need customization.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">YES = </span><span class="o">-></span> <span class="kc">yes</span>
|
<span class="nv">exports.extend = </span><span class="nx">extend</span> <span class="c1"># for parser</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Constant functions for nodes that don't need customization.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">YES = </span><span class="o">-></span> <span class="kc">yes</span>
|
||||||
<span class="nv">NO = </span><span class="o">-></span> <span class="kc">no</span>
|
<span class="nv">NO = </span><span class="o">-></span> <span class="kc">no</span>
|
||||||
|
@ -147,7 +147,10 @@ our own</p> </td> <td class="code"> <div c
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">top</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">top</span>
|
||||||
<span class="nv">node.front = </span><span class="kc">true</span>
|
<span class="nv">node.front = </span><span class="kc">true</span>
|
||||||
<span class="nv">code = </span><span class="nx">node</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
|
<span class="nv">code = </span><span class="nx">node</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
|
||||||
<span class="nx">codes</span><span class="p">.</span><span class="nx">push</span> <span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">isStatement</span> <span class="nx">o</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"#{@tab}#{code};"</span>
|
<span class="nx">unless</span> <span class="nx">node</span><span class="p">.</span><span class="nx">isStatement</span> <span class="nx">o</span>
|
||||||
|
<span class="nv">code = </span><span class="s2">"#{@tab}#{code};"</span>
|
||||||
|
<span class="nv">code = </span><span class="s2">"#{code}\n"</span> <span class="k">if</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Literal</span>
|
||||||
|
<span class="nx">codes</span><span class="p">.</span><span class="nx">push</span> <span class="nx">code</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nx">codes</span><span class="p">.</span><span class="nx">push</span> <span class="nx">node</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
<span class="nx">codes</span><span class="p">.</span><span class="nx">push</span> <span class="nx">node</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
||||||
<span class="k">if</span> <span class="nx">top</span>
|
<span class="k">if</span> <span class="nx">top</span>
|
||||||
|
@ -232,7 +235,7 @@ JavaScript without translation, such as: strings, numbers,
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">>=</span> <span class="nx">LEVEL_ACCESS</span> <span class="k">then</span> <span class="s1">'(void 0)'</span> <span class="k">else</span> <span class="s1">'void 0'</span>
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">>=</span> <span class="nx">LEVEL_ACCESS</span> <span class="k">then</span> <span class="s1">'(void 0)'</span> <span class="k">else</span> <span class="s1">'void 0'</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">@value</span> <span class="o">is</span> <span class="s1">'this'</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">@value</span> <span class="o">is</span> <span class="s1">'this'</span>
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span><span class="o">?</span><span class="p">.</span><span class="nx">bound</span> <span class="k">then</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span><span class="p">.</span><span class="nx">context</span> <span class="k">else</span> <span class="nx">@value</span>
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span><span class="o">?</span><span class="p">.</span><span class="nx">bound</span> <span class="k">then</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">method</span><span class="p">.</span><span class="nx">context</span> <span class="k">else</span> <span class="nx">@value</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">@value</span><span class="p">.</span><span class="nx">reserved</span> <span class="o">and</span> <span class="s2">"#{@value}"</span> <span class="o">not</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'eval'</span><span class="p">,</span> <span class="s1">'arguments'</span><span class="p">]</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">@value</span><span class="p">.</span><span class="nx">reserved</span>
|
||||||
<span class="s2">"\"#{@value}\""</span>
|
<span class="s2">"\"#{@value}\""</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nx">@value</span>
|
<span class="nx">@value</span>
|
||||||
|
@ -273,6 +276,7 @@ or vanilla.</p> </td> <td class="code"> <d
|
||||||
<span class="nv">isComplex : </span><span class="o">-></span> <span class="nx">@hasProperties</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span>
|
<span class="nv">isComplex : </span><span class="o">-></span> <span class="nx">@hasProperties</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span>
|
||||||
<span class="nv">isAssignable : </span><span class="o">-></span> <span class="nx">@hasProperties</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">isAssignable</span><span class="p">()</span>
|
<span class="nv">isAssignable : </span><span class="o">-></span> <span class="nx">@hasProperties</span><span class="p">()</span> <span class="o">or</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">isAssignable</span><span class="p">()</span>
|
||||||
<span class="nv">isSimpleNumber : </span><span class="o">-></span> <span class="nx">@base</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">SIMPLENUM</span><span class="p">.</span><span class="nx">test</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">value</span>
|
<span class="nv">isSimpleNumber : </span><span class="o">-></span> <span class="nx">@base</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">SIMPLENUM</span><span class="p">.</span><span class="nx">test</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">value</span>
|
||||||
|
<span class="nv">isString : </span><span class="o">-></span> <span class="nx">@base</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">IS_STRING</span><span class="p">.</span><span class="nx">test</span> <span class="nx">@base</span><span class="p">.</span><span class="nx">value</span>
|
||||||
<span class="nv">isAtomic : </span><span class="o">-></span>
|
<span class="nv">isAtomic : </span><span class="o">-></span>
|
||||||
<span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">@properties</span><span class="p">.</span><span class="nx">concat</span> <span class="nx">@base</span>
|
<span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">@properties</span><span class="p">.</span><span class="nx">concat</span> <span class="nx">@base</span>
|
||||||
<span class="k">return</span> <span class="kc">no</span> <span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">soak</span> <span class="o">or</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Call</span>
|
<span class="k">return</span> <span class="kc">no</span> <span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">soak</span> <span class="o">or</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Call</span>
|
||||||
|
@ -337,7 +341,7 @@ at the same position.</p> </td> <td class="code">
|
||||||
<span class="nv">makeReturn: </span> <span class="nx">THIS</span>
|
<span class="nv">makeReturn: </span> <span class="nx">THIS</span>
|
||||||
|
|
||||||
<span class="nv">compileNode: </span><span class="nf">(o, level) -></span>
|
<span class="nv">compileNode: </span><span class="nf">(o, level) -></span>
|
||||||
<span class="nv">code = </span><span class="s1">'/*'</span> <span class="o">+</span> <span class="nx">multident</span><span class="p">(</span><span class="nx">@comment</span><span class="p">,</span> <span class="nx">@tab</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"\n#{@tab}*/"</span>
|
<span class="nv">code = </span><span class="s1">'/*'</span> <span class="o">+</span> <span class="nx">multident</span><span class="p">(</span><span class="nx">@comment</span><span class="p">,</span> <span class="nx">@tab</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"\n#{@tab}*/\n"</span>
|
||||||
<span class="nv">code = </span><span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+</span> <span class="nx">code</span> <span class="k">if</span> <span class="p">(</span><span class="nx">level</span> <span class="o">or</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span><span class="p">)</span> <span class="o">is</span> <span class="nx">LEVEL_TOP</span>
|
<span class="nv">code = </span><span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+</span> <span class="nx">code</span> <span class="k">if</span> <span class="p">(</span><span class="nx">level</span> <span class="o">or</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span><span class="p">)</span> <span class="o">is</span> <span class="nx">LEVEL_TOP</span>
|
||||||
<span class="nx">code</span></pre></div> </td> </tr> <tr id="section-46"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-46">¶</a> </div> <h3>Call</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-47"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-47">¶</a> </div> <p>Node for a function invocation. Takes care of converting <code>super()</code> calls into
|
<span class="nx">code</span></pre></div> </td> </tr> <tr id="section-46"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-46">¶</a> </div> <h3>Call</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-47"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-47">¶</a> </div> <p>Node for a function invocation. Takes care of converting <code>super()</code> calls into
|
||||||
calls against the prototype's function of the same name.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Call = </span><span class="k">class</span> <span class="nx">Call</span> <span class="k">extends</span> <span class="nx">Base</span>
|
calls against the prototype's function of the same name.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Call = </span><span class="k">class</span> <span class="nx">Call</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
|
@ -429,9 +433,9 @@ inner constructor in order to be able to pass the varargs.</p> </td>
|
||||||
<span class="k">return</span> <span class="s2">"""</span>
|
<span class="k">return</span> <span class="s2">"""</span>
|
||||||
<span class="s2"> (function(func, args, ctor) {</span>
|
<span class="s2"> (function(func, args, ctor) {</span>
|
||||||
<span class="s2"> #{idt}ctor.prototype = func.prototype;</span>
|
<span class="s2"> #{idt}ctor.prototype = func.prototype;</span>
|
||||||
<span class="s2"> #{idt}var child = new ctor, result = func.apply(child, args);</span>
|
<span class="s2"> #{idt}var child = new ctor, result = func.apply(child, args), t = typeof result;</span>
|
||||||
<span class="s2"> #{idt}return typeof result === "</span><span class="nx">object</span><span class="s2">" ? result : child;</span>
|
<span class="s2"> #{idt}return t == "</span><span class="nx">object</span><span class="s2">" || t == "</span><span class="nx">function</span><span class="s2">" ? result || child : child;</span>
|
||||||
<span class="s2"> #{@tab}})(#{ @variable.compile o, LEVEL_LIST }, #{splatArgs}, function() {})</span>
|
<span class="s2"> #{@tab}})(#{ @variable.compile o, LEVEL_LIST }, #{splatArgs}, function(){})</span>
|
||||||
<span class="s2"> """</span>
|
<span class="s2"> """</span>
|
||||||
<span class="nv">base = </span><span class="k">new</span> <span class="nx">Value</span> <span class="nx">@variable</span>
|
<span class="nv">base = </span><span class="k">new</span> <span class="nx">Value</span> <span class="nx">@variable</span>
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nv">name = </span><span class="nx">base</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">pop</span><span class="p">())</span> <span class="o">and</span> <span class="nx">base</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span>
|
<span class="k">if</span> <span class="p">(</span><span class="nv">name = </span><span class="nx">base</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">pop</span><span class="p">())</span> <span class="o">and</span> <span class="nx">base</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span>
|
||||||
|
@ -492,6 +496,8 @@ needed to iterate over the values in the range. Used by comprehensions.</p>
|
||||||
<span class="nx">@compileVariables</span> <span class="nx">o</span> <span class="nx">unless</span> <span class="nx">@fromVar</span>
|
<span class="nx">@compileVariables</span> <span class="nx">o</span> <span class="nx">unless</span> <span class="nx">@fromVar</span>
|
||||||
<span class="k">return</span> <span class="nx">@compileArray</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">index</span></pre></div> </td> </tr> <tr id="section-66"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-66">¶</a> </div> <p>Set up endpoints.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">known = </span><span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span>
|
<span class="k">return</span> <span class="nx">@compileArray</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">index</span></pre></div> </td> </tr> <tr id="section-66"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-66">¶</a> </div> <p>Set up endpoints.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">known = </span><span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span>
|
||||||
<span class="nv">idx = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">'index'</span>
|
<span class="nv">idx = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">'index'</span>
|
||||||
|
<span class="nv">idxName = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">'name'</span>
|
||||||
|
<span class="nv">namedIndex = </span><span class="nx">idxName</span> <span class="o">and</span> <span class="nx">idxName</span> <span class="o">isnt</span> <span class="nx">idx</span>
|
||||||
<span class="nv">varPart = </span><span class="s2">"#{idx} = #{@fromC}"</span>
|
<span class="nv">varPart = </span><span class="s2">"#{idx} = #{@fromC}"</span>
|
||||||
<span class="nx">varPart</span> <span class="o">+=</span> <span class="s2">", #{@toC}"</span> <span class="k">if</span> <span class="nx">@toC</span> <span class="o">isnt</span> <span class="nx">@toVar</span>
|
<span class="nx">varPart</span> <span class="o">+=</span> <span class="s2">", #{@toC}"</span> <span class="k">if</span> <span class="nx">@toC</span> <span class="o">isnt</span> <span class="nx">@toVar</span>
|
||||||
<span class="nx">varPart</span> <span class="o">+=</span> <span class="s2">", #{@step}"</span> <span class="k">if</span> <span class="nx">@step</span> <span class="o">isnt</span> <span class="nx">@stepVar</span>
|
<span class="nx">varPart</span> <span class="o">+=</span> <span class="s2">", #{@step}"</span> <span class="k">if</span> <span class="nx">@step</span> <span class="o">isnt</span> <span class="nx">@stepVar</span>
|
||||||
|
@ -505,9 +511,18 @@ needed to iterate over the values in the range. Used by comprehensions.</p>
|
||||||
<span class="s2">"#{cond} ? #{lt} #{@toVar} : #{gt} #{@toVar}"</span></pre></div> </td> </tr> <tr id="section-68"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-68">¶</a> </div> <p>Generate the step.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">stepPart = </span><span class="k">if</span> <span class="nx">@stepVar</span>
|
<span class="s2">"#{cond} ? #{lt} #{@toVar} : #{gt} #{@toVar}"</span></pre></div> </td> </tr> <tr id="section-68"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-68">¶</a> </div> <p>Generate the step.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">stepPart = </span><span class="k">if</span> <span class="nx">@stepVar</span>
|
||||||
<span class="s2">"#{idx} += #{@stepVar}"</span>
|
<span class="s2">"#{idx} += #{@stepVar}"</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">known</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">known</span>
|
||||||
<span class="k">if</span> <span class="nx">from</span> <span class="o"><=</span> <span class="nx">to</span> <span class="k">then</span> <span class="s2">"#{idx}++"</span> <span class="k">else</span> <span class="s2">"#{idx}--"</span>
|
<span class="k">if</span> <span class="nx">namedIndex</span>
|
||||||
|
<span class="k">if</span> <span class="nx">from</span> <span class="o"><=</span> <span class="nx">to</span> <span class="k">then</span> <span class="s2">"++#{idx}"</span> <span class="k">else</span> <span class="s2">"--#{idx}"</span>
|
||||||
|
<span class="k">else</span>
|
||||||
|
<span class="k">if</span> <span class="nx">from</span> <span class="o"><=</span> <span class="nx">to</span> <span class="k">then</span> <span class="s2">"#{idx}++"</span> <span class="k">else</span> <span class="s2">"#{idx}--"</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="s2">"#{cond} ? #{idx}++ : #{idx}--"</span></pre></div> </td> </tr> <tr id="section-69"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-69">¶</a> </div> <p>The final loop body.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="s2">"#{varPart}; #{condPart}; #{stepPart}"</span></pre></div> </td> </tr> <tr id="section-70"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-70">¶</a> </div> <p>When used as a value, expand the range into the equivalent array.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileArray: </span><span class="nf">(o) -></span>
|
<span class="k">if</span> <span class="nx">namedIndex</span>
|
||||||
|
<span class="s2">"#{cond} ? ++#{idx} : --#{idx}"</span>
|
||||||
|
<span class="k">else</span>
|
||||||
|
<span class="s2">"#{cond} ? #{idx}++ : #{idx}--"</span>
|
||||||
|
|
||||||
|
<span class="nv">varPart = </span><span class="s2">"#{idxName} = #{varPart}"</span> <span class="k">if</span> <span class="nx">namedIndex</span>
|
||||||
|
<span class="nv">stepPart = </span><span class="s2">"#{idxName} = #{stepPart}"</span> <span class="k">if</span> <span class="nx">namedIndex</span></pre></div> </td> </tr> <tr id="section-69"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-69">¶</a> </div> <p>The final loop body.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="s2">"#{varPart}; #{condPart}; #{stepPart}"</span></pre></div> </td> </tr> <tr id="section-70"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-70">¶</a> </div> <p>When used as a value, expand the range into the equivalent array.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileArray: </span><span class="nf">(o) -></span>
|
||||||
<span class="k">if</span> <span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span> <span class="o">and</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="nx">@fromNum</span> <span class="o">-</span> <span class="nx">@toNum</span><span class="p">)</span> <span class="o"><=</span> <span class="mi">20</span>
|
<span class="k">if</span> <span class="nx">@fromNum</span> <span class="o">and</span> <span class="nx">@toNum</span> <span class="o">and</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">abs</span><span class="p">(</span><span class="nx">@fromNum</span> <span class="o">-</span> <span class="nx">@toNum</span><span class="p">)</span> <span class="o"><=</span> <span class="mi">20</span>
|
||||||
<span class="nv">range = </span><span class="p">[</span><span class="o">+</span><span class="nx">@fromNum</span><span class="p">..</span><span class="o">+</span><span class="nx">@toNum</span><span class="p">]</span>
|
<span class="nv">range = </span><span class="p">[</span><span class="o">+</span><span class="nx">@fromNum</span><span class="p">..</span><span class="o">+</span><span class="nx">@toNum</span><span class="p">]</span>
|
||||||
<span class="nx">range</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@exclusive</span>
|
<span class="nx">range</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@exclusive</span>
|
||||||
|
@ -538,13 +553,14 @@ is the index of the beginning.</p> </td> <td class="code
|
||||||
<code>9e9</code> should be safe because <code>9e9</code> > <code>2**32</code>, the max array length.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
<code>9e9</code> should be safe because <code>9e9</code> > <code>2**32</code>, the max array length.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
||||||
<span class="p">{</span><span class="nx">to</span><span class="p">,</span> <span class="nx">from</span><span class="p">}</span> <span class="o">=</span> <span class="nx">@range</span>
|
<span class="p">{</span><span class="nx">to</span><span class="p">,</span> <span class="nx">from</span><span class="p">}</span> <span class="o">=</span> <span class="nx">@range</span>
|
||||||
<span class="nv">fromStr = </span><span class="nx">from</span> <span class="o">and</span> <span class="nx">from</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_PAREN</span><span class="p">)</span> <span class="o">or</span> <span class="s1">'0'</span>
|
<span class="nv">fromStr = </span><span class="nx">from</span> <span class="o">and</span> <span class="nx">from</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_PAREN</span><span class="p">)</span> <span class="o">or</span> <span class="s1">'0'</span>
|
||||||
<span class="nv">compiled = </span><span class="nx">to</span> <span class="o">and</span> <span class="nx">to</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_ACCESS</span>
|
<span class="nv">compiled = </span><span class="nx">to</span> <span class="o">and</span> <span class="nx">to</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_PAREN</span>
|
||||||
<span class="k">if</span> <span class="nx">to</span> <span class="o">and</span> <span class="o">not</span> <span class="p">(</span><span class="o">not</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">exclusive</span> <span class="o">and</span> <span class="o">+</span><span class="nx">compiled</span> <span class="o">is</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
<span class="k">if</span> <span class="nx">to</span> <span class="o">and</span> <span class="o">not</span> <span class="p">(</span><span class="o">not</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">exclusive</span> <span class="o">and</span> <span class="o">+</span><span class="nx">compiled</span> <span class="o">is</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
||||||
<span class="nv">toStr = </span><span class="s1">', '</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">exclusive</span>
|
<span class="nv">toStr = </span><span class="s1">', '</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">@range</span><span class="p">.</span><span class="nx">exclusive</span>
|
||||||
<span class="nx">compiled</span>
|
<span class="nx">compiled</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">SIMPLENUM</span><span class="p">.</span><span class="nx">test</span> <span class="nx">compiled</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">SIMPLENUM</span><span class="p">.</span><span class="nx">test</span> <span class="nx">compiled</span>
|
||||||
<span class="p">(</span><span class="o">+</span><span class="nx">compiled</span> <span class="o">+</span> <span class="mi">1</span><span class="p">).</span><span class="nx">toString</span><span class="p">()</span>
|
<span class="s2">"#{+compiled + 1}"</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
|
<span class="nv">compiled = </span><span class="nx">to</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_ACCESS</span>
|
||||||
<span class="s2">"#{compiled} + 1 || 9e9"</span>
|
<span class="s2">"#{compiled} + 1 || 9e9"</span>
|
||||||
<span class="s2">".slice(#{ fromStr }#{ toStr or '' })"</span></pre></div> </td> </tr> <tr id="section-74"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-74">¶</a> </div> <h3>Obj</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-75"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-75">¶</a> </div> <p>An object literal, nothing fancy.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Obj = </span><span class="k">class</span> <span class="nx">Obj</span> <span class="k">extends</span> <span class="nx">Base</span>
|
<span class="s2">".slice(#{ fromStr }#{ toStr or '' })"</span></pre></div> </td> </tr> <tr id="section-74"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-74">¶</a> </div> <h3>Obj</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-75"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-75">¶</a> </div> <p>An object literal, nothing fancy.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Obj = </span><span class="k">class</span> <span class="nx">Obj</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(props, @generated = false) -></span>
|
<span class="nv">constructor: </span><span class="nf">(props, @generated = false) -></span>
|
||||||
|
@ -554,6 +570,14 @@ is the index of the beginning.</p> </td> <td class="code
|
||||||
|
|
||||||
<span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
<span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
||||||
<span class="nv">props = </span><span class="nx">@properties</span>
|
<span class="nv">props = </span><span class="nx">@properties</span>
|
||||||
|
<span class="nv">propNames = </span><span class="p">[]</span>
|
||||||
|
<span class="k">for</span> <span class="nx">prop</span> <span class="k">in</span> <span class="nx">@properties</span>
|
||||||
|
<span class="nv">prop = </span><span class="nx">prop</span><span class="p">.</span><span class="nx">variable</span> <span class="k">if</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span>
|
||||||
|
<span class="k">if</span> <span class="nx">prop</span><span class="o">?</span>
|
||||||
|
<span class="nv">propName = </span><span class="nx">prop</span><span class="p">.</span><span class="nx">unwrapAll</span><span class="p">().</span><span class="nx">value</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span>
|
||||||
|
<span class="k">if</span> <span class="nx">propName</span> <span class="k">in</span> <span class="nx">propNames</span>
|
||||||
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s2">"multiple object literal properties named \"#{propName}\""</span>
|
||||||
|
<span class="nx">propNames</span><span class="p">.</span><span class="nx">push</span> <span class="nx">propName</span>
|
||||||
<span class="k">return</span> <span class="p">(</span><span class="k">if</span> <span class="nx">@front</span> <span class="k">then</span> <span class="s1">'({})'</span> <span class="k">else</span> <span class="s1">'{}'</span><span class="p">)</span> <span class="nx">unless</span> <span class="nx">props</span><span class="p">.</span><span class="nx">length</span>
|
<span class="k">return</span> <span class="p">(</span><span class="k">if</span> <span class="nx">@front</span> <span class="k">then</span> <span class="s1">'({})'</span> <span class="k">else</span> <span class="s1">'{}'</span><span class="p">)</span> <span class="nx">unless</span> <span class="nx">props</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="k">if</span> <span class="nx">@generated</span>
|
<span class="k">if</span> <span class="nx">@generated</span>
|
||||||
<span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">props</span> <span class="k">when</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Value</span>
|
<span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">props</span> <span class="k">when</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Value</span>
|
||||||
|
@ -615,6 +639,8 @@ list of prototype property assignments.</p> </td> <td cl
|
||||||
<span class="nx">tail</span> <span class="k">instanceof</span> <span class="nx">Access</span> <span class="o">and</span> <span class="nx">tail</span><span class="p">.</span><span class="nx">name</span><span class="p">.</span><span class="nx">value</span>
|
<span class="nx">tail</span> <span class="k">instanceof</span> <span class="nx">Access</span> <span class="o">and</span> <span class="nx">tail</span><span class="p">.</span><span class="nx">name</span><span class="p">.</span><span class="nx">value</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nx">@variable</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">value</span>
|
<span class="nx">@variable</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">value</span>
|
||||||
|
<span class="k">if</span> <span class="nx">decl</span> <span class="k">in</span> <span class="nx">STRICT_PROSCRIBED</span>
|
||||||
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s2">"variable name may not be #{decl}"</span>
|
||||||
<span class="nx">decl</span> <span class="o">and=</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">decl</span><span class="p">)</span> <span class="o">and</span> <span class="nx">decl</span></pre></div> </td> </tr> <tr id="section-81"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-81">¶</a> </div> <p>For all <code>this</code>-references and bound functions in the class definition,
|
<span class="nx">decl</span> <span class="o">and=</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">decl</span><span class="p">)</span> <span class="o">and</span> <span class="nx">decl</span></pre></div> </td> </tr> <tr id="section-81"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-81">¶</a> </div> <p>For all <code>this</code>-references and bound functions in the class definition,
|
||||||
<code>this</code> is the Class being constructed.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">setContext: </span><span class="nf">(name) -></span>
|
<code>this</code> is the Class being constructed.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">setContext: </span><span class="nf">(name) -></span>
|
||||||
<span class="nx">@body</span><span class="p">.</span><span class="nx">traverseChildren</span> <span class="kc">false</span><span class="p">,</span> <span class="nf">(node) -></span>
|
<span class="nx">@body</span><span class="p">.</span><span class="nx">traverseChildren</span> <span class="kc">false</span><span class="p">,</span> <span class="nf">(node) -></span>
|
||||||
|
@ -630,7 +656,7 @@ constructor.</p> </td> <td class="code"> <
|
||||||
<span class="nv">lhs = </span><span class="p">(</span><span class="k">new</span> <span class="nx">Value</span> <span class="p">(</span><span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"this"</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="nx">Access</span> <span class="nx">bvar</span><span class="p">]).</span><span class="nx">compile</span> <span class="nx">o</span>
|
<span class="nv">lhs = </span><span class="p">(</span><span class="k">new</span> <span class="nx">Value</span> <span class="p">(</span><span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"this"</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="nx">Access</span> <span class="nx">bvar</span><span class="p">]).</span><span class="nx">compile</span> <span class="nx">o</span>
|
||||||
<span class="nx">@ctor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">unshift</span> <span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"#{lhs} = #{utility 'bind'}(#{lhs}, this)"</span></pre></div> </td> </tr> <tr id="section-83"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-83">¶</a> </div> <p>Merge the properties from a top-level object as prototypal properties
|
<span class="nx">@ctor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">unshift</span> <span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"#{lhs} = #{utility 'bind'}(#{lhs}, this)"</span></pre></div> </td> </tr> <tr id="section-83"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-83">¶</a> </div> <p>Merge the properties from a top-level object as prototypal properties
|
||||||
on the class.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addProperties: </span><span class="nf">(node, name, o) -></span>
|
on the class.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addProperties: </span><span class="nf">(node, name, o) -></span>
|
||||||
<span class="nv">props = </span><span class="nx">node</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="mi">0</span><span class="p">..]</span>
|
<span class="nv">props = </span><span class="nx">node</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">properties</span><span class="p">[..]</span>
|
||||||
<span class="nv">exprs = </span><span class="k">while</span> <span class="nv">assign = </span><span class="nx">props</span><span class="p">.</span><span class="nx">shift</span><span class="p">()</span>
|
<span class="nv">exprs = </span><span class="k">while</span> <span class="nv">assign = </span><span class="nx">props</span><span class="p">.</span><span class="nx">shift</span><span class="p">()</span>
|
||||||
<span class="k">if</span> <span class="nx">assign</span> <span class="k">instanceof</span> <span class="nx">Assign</span>
|
<span class="k">if</span> <span class="nx">assign</span> <span class="k">instanceof</span> <span class="nx">Assign</span>
|
||||||
<span class="nv">base = </span><span class="nx">assign</span><span class="p">.</span><span class="nx">variable</span><span class="p">.</span><span class="nx">base</span>
|
<span class="nv">base = </span><span class="nx">assign</span><span class="p">.</span><span class="nx">variable</span><span class="p">.</span><span class="nx">base</span>
|
||||||
|
@ -664,46 +690,62 @@ on the class.</p> </td> <td class="code">
|
||||||
<span class="k">for</span> <span class="nx">node</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nv">exps = </span><span class="nx">child</span><span class="p">.</span><span class="nx">expressions</span>
|
<span class="k">for</span> <span class="nx">node</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nv">exps = </span><span class="nx">child</span><span class="p">.</span><span class="nx">expressions</span>
|
||||||
<span class="k">if</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Value</span> <span class="o">and</span> <span class="nx">node</span><span class="p">.</span><span class="nx">isObject</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span>
|
<span class="k">if</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Value</span> <span class="o">and</span> <span class="nx">node</span><span class="p">.</span><span class="nx">isObject</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span>
|
||||||
<span class="nx">exps</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@addProperties</span> <span class="nx">node</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">o</span>
|
<span class="nx">exps</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@addProperties</span> <span class="nx">node</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">o</span>
|
||||||
<span class="nv">child.expressions = exps = </span><span class="nx">flatten</span> <span class="nx">exps</span></pre></div> </td> </tr> <tr id="section-85"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-85">¶</a> </div> <p>Make sure that a constructor is defined for the class, and properly
|
<span class="nv">child.expressions = exps = </span><span class="nx">flatten</span> <span class="nx">exps</span></pre></div> </td> </tr> <tr id="section-85"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-85">¶</a> </div> <p><code>use strict</code> (and other directives) must be the first expression statement(s)
|
||||||
|
of a function body. This method ensures the prologue is correctly positioned
|
||||||
|
above the <code>constructor</code>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">hoistDirectivePrologue: </span><span class="o">-></span>
|
||||||
|
<span class="nv">index = </span><span class="mi">0</span>
|
||||||
|
<span class="p">{</span><span class="nx">expressions</span><span class="p">}</span> <span class="o">=</span> <span class="nx">@body</span>
|
||||||
|
<span class="o">++</span><span class="nx">index</span> <span class="k">while</span> <span class="p">(</span><span class="nv">node = </span><span class="nx">expressions</span><span class="p">[</span><span class="nx">index</span><span class="p">])</span> <span class="o">and</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Comment</span> <span class="o">or</span>
|
||||||
|
<span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Value</span> <span class="o">and</span> <span class="nx">node</span><span class="p">.</span><span class="nx">isString</span><span class="p">()</span>
|
||||||
|
<span class="vi">@directives = </span><span class="nx">expressions</span><span class="p">.</span><span class="nx">splice</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">index</span></pre></div> </td> </tr> <tr id="section-86"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-86">¶</a> </div> <p>Make sure that a constructor is defined for the class, and properly
|
||||||
configured.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">ensureConstructor: </span><span class="nf">(name) -></span>
|
configured.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">ensureConstructor: </span><span class="nf">(name) -></span>
|
||||||
<span class="k">if</span> <span class="o">not</span> <span class="nx">@ctor</span>
|
<span class="k">if</span> <span class="o">not</span> <span class="nx">@ctor</span>
|
||||||
<span class="vi">@ctor = </span><span class="k">new</span> <span class="nx">Code</span>
|
<span class="vi">@ctor = </span><span class="k">new</span> <span class="nx">Code</span>
|
||||||
<span class="nx">@ctor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"#{name}.__super__.constructor.apply(this, arguments)"</span> <span class="k">if</span> <span class="nx">@parent</span>
|
<span class="nx">@ctor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"#{name}.__super__.constructor.apply(this, arguments)"</span> <span class="k">if</span> <span class="nx">@parent</span>
|
||||||
<span class="nx">@ctor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"#{@externalCtor}.apply(this, arguments)"</span> <span class="k">if</span> <span class="nx">@externalCtor</span>
|
<span class="nx">@ctor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"#{@externalCtor}.apply(this, arguments)"</span> <span class="k">if</span> <span class="nx">@externalCtor</span>
|
||||||
|
<span class="nx">@ctor</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span>
|
||||||
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">@ctor</span>
|
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">@ctor</span>
|
||||||
<span class="vi">@ctor.ctor = @ctor.name = </span><span class="nx">name</span>
|
<span class="vi">@ctor.ctor = @ctor.name = </span><span class="nx">name</span>
|
||||||
<span class="vi">@ctor.klass = </span><span class="kc">null</span>
|
<span class="vi">@ctor.klass = </span><span class="kc">null</span>
|
||||||
<span class="vi">@ctor.noReturn = </span><span class="kc">yes</span></pre></div> </td> </tr> <tr id="section-86"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-86">¶</a> </div> <p>Instead of generating the JavaScript string directly, we build up the
|
<span class="vi">@ctor.noReturn = </span><span class="kc">yes</span></pre></div> </td> </tr> <tr id="section-87"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-87">¶</a> </div> <p>Instead of generating the JavaScript string directly, we build up the
|
||||||
equivalent syntax tree and compile that, in pieces. You can see the
|
equivalent syntax tree and compile that, in pieces. You can see the
|
||||||
constructor, property assignments, and inheritance getting built out below.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
constructor, property assignments, and inheritance getting built out below.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
||||||
<span class="nv">decl = </span><span class="nx">@determineName</span><span class="p">()</span>
|
<span class="nv">decl = </span><span class="nx">@determineName</span><span class="p">()</span>
|
||||||
<span class="nv">name = </span><span class="nx">decl</span> <span class="o">or</span> <span class="nx">@name</span> <span class="o">or</span> <span class="s1">'_Class'</span>
|
<span class="nv">name = </span><span class="nx">decl</span> <span class="o">or</span> <span class="s1">'_Class'</span>
|
||||||
<span class="nv">name = </span><span class="s2">"_#{name}"</span> <span class="k">if</span> <span class="nx">name</span><span class="p">.</span><span class="nx">reserved</span>
|
<span class="nv">name = </span><span class="s2">"_#{name}"</span> <span class="k">if</span> <span class="nx">name</span><span class="p">.</span><span class="nx">reserved</span>
|
||||||
<span class="nv">lname = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">name</span>
|
<span class="nv">lname = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">name</span>
|
||||||
|
|
||||||
|
<span class="nx">@hoistDirectivePrologue</span><span class="p">()</span>
|
||||||
<span class="nx">@setContext</span> <span class="nx">name</span>
|
<span class="nx">@setContext</span> <span class="nx">name</span>
|
||||||
<span class="nx">@walkBody</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">o</span>
|
<span class="nx">@walkBody</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">o</span>
|
||||||
<span class="nx">@ensureConstructor</span> <span class="nx">name</span>
|
<span class="nx">@ensureConstructor</span> <span class="nx">name</span>
|
||||||
<span class="vi">@body.spaced = </span><span class="kc">yes</span>
|
<span class="vi">@body.spaced = </span><span class="kc">yes</span>
|
||||||
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">@ctor</span> <span class="nx">unless</span> <span class="nx">@ctor</span> <span class="k">instanceof</span> <span class="nx">Code</span>
|
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">@ctor</span> <span class="nx">unless</span> <span class="nx">@ctor</span> <span class="k">instanceof</span> <span class="nx">Code</span>
|
||||||
|
<span class="k">if</span> <span class="nx">decl</span>
|
||||||
|
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="k">new</span> <span class="nx">Assign</span> <span class="p">(</span><span class="k">new</span> <span class="nx">Value</span> <span class="p">(</span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">name</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="nx">Access</span> <span class="k">new</span> <span class="nx">Literal</span> <span class="s1">'name'</span><span class="p">]),</span> <span class="p">(</span><span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"'#{name}'"</span><span class="p">)</span>
|
||||||
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">push</span> <span class="nx">lname</span>
|
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">push</span> <span class="nx">lname</span>
|
||||||
|
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">@directives</span><span class="p">...</span>
|
||||||
<span class="nx">@addBoundFunctions</span> <span class="nx">o</span>
|
<span class="nx">@addBoundFunctions</span> <span class="nx">o</span>
|
||||||
|
|
||||||
<span class="nv">call = </span><span class="nx">Closure</span><span class="p">.</span><span class="nx">wrap</span> <span class="nx">@body</span>
|
<span class="nv">call = </span><span class="nx">Closure</span><span class="p">.</span><span class="nx">wrap</span> <span class="nx">@body</span>
|
||||||
|
|
||||||
<span class="k">if</span> <span class="nx">@parent</span>
|
<span class="k">if</span> <span class="nx">@parent</span>
|
||||||
<span class="vi">@superClass = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'super'</span><span class="p">,</span> <span class="kc">no</span>
|
<span class="vi">@superClass = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'super'</span><span class="p">,</span> <span class="kc">no</span>
|
||||||
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="k">new</span> <span class="nx">Extends</span> <span class="nx">lname</span><span class="p">,</span> <span class="nx">@superClass</span>
|
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="k">new</span> <span class="nx">Extends</span> <span class="nx">lname</span><span class="p">,</span> <span class="nx">@superClass</span>
|
||||||
<span class="nx">call</span><span class="p">.</span><span class="nx">args</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@parent</span>
|
<span class="nx">call</span><span class="p">.</span><span class="nx">args</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@parent</span>
|
||||||
<span class="nx">call</span><span class="p">.</span><span class="nx">variable</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">Param</span> <span class="nx">@superClass</span>
|
<span class="nv">params = </span><span class="nx">call</span><span class="p">.</span><span class="nx">variable</span><span class="p">.</span><span class="nx">params</span> <span class="o">or</span> <span class="nx">call</span><span class="p">.</span><span class="nx">variable</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">params</span>
|
||||||
|
<span class="nx">params</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">Param</span> <span class="nx">@superClass</span>
|
||||||
|
|
||||||
<span class="nv">klass = </span><span class="k">new</span> <span class="nx">Parens</span> <span class="nx">call</span><span class="p">,</span> <span class="kc">yes</span>
|
<span class="nv">klass = </span><span class="k">new</span> <span class="nx">Parens</span> <span class="nx">call</span><span class="p">,</span> <span class="kc">yes</span>
|
||||||
<span class="nv">klass = </span><span class="k">new</span> <span class="nx">Assign</span> <span class="nx">@variable</span><span class="p">,</span> <span class="nx">klass</span> <span class="k">if</span> <span class="nx">@variable</span>
|
<span class="nv">klass = </span><span class="k">new</span> <span class="nx">Assign</span> <span class="nx">@variable</span><span class="p">,</span> <span class="nx">klass</span> <span class="k">if</span> <span class="nx">@variable</span>
|
||||||
<span class="nx">klass</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-87"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-87">¶</a> </div> <h3>Assign</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-88"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-88">¶</a> </div> <p>The <strong>Assign</strong> is used to assign a local variable to value, or to set the
|
<span class="nx">klass</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-88"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-88">¶</a> </div> <h3>Assign</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-89"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-89">¶</a> </div> <p>The <strong>Assign</strong> is used to assign a local variable to value, or to set the
|
||||||
property of an object -- including within object literals.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Assign = </span><span class="k">class</span> <span class="nx">Assign</span> <span class="k">extends</span> <span class="nx">Base</span>
|
property of an object -- including within object literals.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Assign = </span><span class="k">class</span> <span class="nx">Assign</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(@variable, @value, @context, options) -></span>
|
<span class="nv">constructor: </span><span class="nf">(@variable, @value, @context, options) -></span>
|
||||||
<span class="vi">@param = </span><span class="nx">options</span> <span class="o">and</span> <span class="nx">options</span><span class="p">.</span><span class="nx">param</span>
|
<span class="vi">@param = </span><span class="nx">options</span> <span class="o">and</span> <span class="nx">options</span><span class="p">.</span><span class="nx">param</span>
|
||||||
<span class="vi">@subpattern = </span><span class="nx">options</span> <span class="o">and</span> <span class="nx">options</span><span class="p">.</span><span class="nx">subpattern</span>
|
<span class="vi">@subpattern = </span><span class="nx">options</span> <span class="o">and</span> <span class="nx">options</span><span class="p">.</span><span class="nx">subpattern</span>
|
||||||
|
<span class="nv">forbidden = </span><span class="p">(</span><span class="nv">name = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">unwrapAll</span><span class="p">().</span><span class="nx">value</span><span class="p">)</span> <span class="k">in</span> <span class="nx">STRICT_PROSCRIBED</span>
|
||||||
|
<span class="k">if</span> <span class="nx">forbidden</span> <span class="o">and</span> <span class="nx">@context</span> <span class="o">isnt</span> <span class="s1">'object'</span>
|
||||||
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s2">"variable name may not be \"#{name}\""</span>
|
||||||
|
|
||||||
<span class="nv">children: </span><span class="p">[</span><span class="s1">'variable'</span><span class="p">,</span> <span class="s1">'value'</span><span class="p">]</span>
|
<span class="nv">children: </span><span class="p">[</span><span class="s1">'variable'</span><span class="p">,</span> <span class="s1">'value'</span><span class="p">]</span>
|
||||||
|
|
||||||
|
@ -714,7 +756,7 @@ property of an object -- including within object literals.</p> </td>
|
||||||
<span class="err">@</span><span class="p">[</span><span class="k">if</span> <span class="nx">@context</span> <span class="o">is</span> <span class="s1">'object'</span> <span class="k">then</span> <span class="s1">'value'</span> <span class="k">else</span> <span class="s1">'variable'</span><span class="p">].</span><span class="nx">assigns</span> <span class="nx">name</span>
|
<span class="err">@</span><span class="p">[</span><span class="k">if</span> <span class="nx">@context</span> <span class="o">is</span> <span class="s1">'object'</span> <span class="k">then</span> <span class="s1">'value'</span> <span class="k">else</span> <span class="s1">'variable'</span><span class="p">].</span><span class="nx">assigns</span> <span class="nx">name</span>
|
||||||
|
|
||||||
<span class="nv">unfoldSoak: </span><span class="nf">(o) -></span>
|
<span class="nv">unfoldSoak: </span><span class="nf">(o) -></span>
|
||||||
<span class="nx">unfoldSoak</span> <span class="nx">o</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="s1">'variable'</span></pre></div> </td> </tr> <tr id="section-89"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-89">¶</a> </div> <p>Compile an assignment, delegating to <code>compilePatternMatch</code> or
|
<span class="nx">unfoldSoak</span> <span class="nx">o</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="s1">'variable'</span></pre></div> </td> </tr> <tr id="section-90"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-90">¶</a> </div> <p>Compile an assignment, delegating to <code>compilePatternMatch</code> or
|
||||||
<code>compileSplice</code> if appropriate. Keep track of the name of the base object
|
<code>compileSplice</code> if appropriate. Keep track of the name of the base object
|
||||||
we've been assigned to, for correct internal references. If the variable
|
we've been assigned to, for correct internal references. If the variable
|
||||||
has not been seen yet within the current scope, declare it.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
has not been seen yet within the current scope, declare it.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
||||||
|
@ -737,7 +779,7 @@ has not been seen yet within the current scope, declare it.</p> </td
|
||||||
<span class="nv">val = </span><span class="nx">@value</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
<span class="nv">val = </span><span class="nx">@value</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
||||||
<span class="k">return</span> <span class="s2">"#{name}: #{val}"</span> <span class="k">if</span> <span class="nx">@context</span> <span class="o">is</span> <span class="s1">'object'</span>
|
<span class="k">return</span> <span class="s2">"#{name}: #{val}"</span> <span class="k">if</span> <span class="nx">@context</span> <span class="o">is</span> <span class="s1">'object'</span>
|
||||||
<span class="nv">val = </span><span class="nx">name</span> <span class="o">+</span> <span class="s2">" #{ @context or '=' } "</span> <span class="o">+</span> <span class="nx">val</span>
|
<span class="nv">val = </span><span class="nx">name</span> <span class="o">+</span> <span class="s2">" #{ @context or '=' } "</span> <span class="o">+</span> <span class="nx">val</span>
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><=</span> <span class="nx">LEVEL_LIST</span> <span class="k">then</span> <span class="nx">val</span> <span class="k">else</span> <span class="s2">"(#{val})"</span></pre></div> </td> </tr> <tr id="section-90"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-90">¶</a> </div> <p>Brief implementation of recursive pattern matching, when assigning array or
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><=</span> <span class="nx">LEVEL_LIST</span> <span class="k">then</span> <span class="nx">val</span> <span class="k">else</span> <span class="s2">"(#{val})"</span></pre></div> </td> </tr> <tr id="section-91"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-91">¶</a> </div> <p>Brief implementation of recursive pattern matching, when assigning array or
|
||||||
object literals to a value. Peeks at their properties to assign inner names.
|
object literals to a value. Peeks at their properties to assign inner names.
|
||||||
See the <a href="http://wiki.ecmascript.org/doku.php?id=harmony:destructuring">ECMAScript Harmony Wiki</a>
|
See the <a href="http://wiki.ecmascript.org/doku.php?id=harmony:destructuring">ECMAScript Harmony Wiki</a>
|
||||||
for details.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compilePatternMatch: </span><span class="nf">(o) -></span>
|
for details.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compilePatternMatch: </span><span class="nf">(o) -></span>
|
||||||
|
@ -748,7 +790,7 @@ for details.</p> </td> <td class="code"> <
|
||||||
<span class="nv">code = </span><span class="nx">value</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
|
<span class="nv">code = </span><span class="nx">value</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
|
||||||
<span class="k">return</span> <span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">>=</span> <span class="nx">LEVEL_OP</span> <span class="k">then</span> <span class="s2">"(#{code})"</span> <span class="k">else</span> <span class="nx">code</span>
|
<span class="k">return</span> <span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">>=</span> <span class="nx">LEVEL_OP</span> <span class="k">then</span> <span class="s2">"(#{code})"</span> <span class="k">else</span> <span class="nx">code</span>
|
||||||
<span class="nv">isObject = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">isObject</span><span class="p">()</span>
|
<span class="nv">isObject = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">isObject</span><span class="p">()</span>
|
||||||
<span class="k">if</span> <span class="nx">top</span> <span class="o">and</span> <span class="nx">olen</span> <span class="o">is</span> <span class="mi">1</span> <span class="o">and</span> <span class="p">(</span><span class="nv">obj = </span><span class="nx">objects</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">not</span> <span class="k">instanceof</span> <span class="nx">Splat</span></pre></div> </td> </tr> <tr id="section-91"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-91">¶</a> </div> <p>Unroll simplest cases: <code>{v} = x</code> -> <code>v = x.v</code></p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">Assign</span>
|
<span class="k">if</span> <span class="nx">top</span> <span class="o">and</span> <span class="nx">olen</span> <span class="o">is</span> <span class="mi">1</span> <span class="o">and</span> <span class="p">(</span><span class="nv">obj = </span><span class="nx">objects</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">not</span> <span class="k">instanceof</span> <span class="nx">Splat</span></pre></div> </td> </tr> <tr id="section-92"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-92">¶</a> </div> <p>Unroll simplest cases: <code>{v} = x</code> -> <code>v = x.v</code></p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">Assign</span>
|
||||||
<span class="p">{</span><span class="nv">variable: </span><span class="p">{</span><span class="nv">base: </span><span class="nx">idx</span><span class="p">},</span> <span class="nv">value: </span><span class="nx">obj</span><span class="p">}</span> <span class="o">=</span> <span class="nx">obj</span>
|
<span class="p">{</span><span class="nv">variable: </span><span class="p">{</span><span class="nv">base: </span><span class="nx">idx</span><span class="p">},</span> <span class="nv">value: </span><span class="nx">obj</span><span class="p">}</span> <span class="o">=</span> <span class="nx">obj</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">base</span> <span class="k">instanceof</span> <span class="nx">Parens</span>
|
<span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">base</span> <span class="k">instanceof</span> <span class="nx">Parens</span>
|
||||||
|
@ -761,7 +803,7 @@ for details.</p> </td> <td class="code"> <
|
||||||
<span class="nv">acc = </span><span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span> <span class="nx">idx</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">value</span> <span class="o">or</span> <span class="mi">0</span>
|
<span class="nv">acc = </span><span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span> <span class="nx">idx</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">value</span> <span class="o">or</span> <span class="mi">0</span>
|
||||||
<span class="nv">value = </span><span class="k">new</span> <span class="nx">Value</span> <span class="nx">value</span>
|
<span class="nv">value = </span><span class="k">new</span> <span class="nx">Value</span> <span class="nx">value</span>
|
||||||
<span class="nx">value</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="p">(</span><span class="k">if</span> <span class="nx">acc</span> <span class="k">then</span> <span class="nx">Access</span> <span class="k">else</span> <span class="nx">Index</span><span class="p">)</span> <span class="nx">idx</span>
|
<span class="nx">value</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="p">(</span><span class="k">if</span> <span class="nx">acc</span> <span class="k">then</span> <span class="nx">Access</span> <span class="k">else</span> <span class="nx">Index</span><span class="p">)</span> <span class="nx">idx</span>
|
||||||
<span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">value</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'arguments'</span><span class="p">,</span><span class="s1">'eval'</span><span class="p">].</span><span class="nx">concat</span> <span class="nx">RESERVED</span>
|
<span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">value</span> <span class="k">in</span> <span class="nx">RESERVED</span>
|
||||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">SyntaxError</span> <span class="s2">"assignment to a reserved word: #{obj.compile o} = #{value.compile o}"</span>
|
<span class="k">throw</span> <span class="k">new</span> <span class="nx">SyntaxError</span> <span class="s2">"assignment to a reserved word: #{obj.compile o} = #{value.compile o}"</span>
|
||||||
<span class="k">return</span> <span class="k">new</span> <span class="nx">Assign</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nv">param: </span><span class="nx">@param</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_TOP</span>
|
<span class="k">return</span> <span class="k">new</span> <span class="nx">Assign</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nv">param: </span><span class="nx">@param</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_TOP</span>
|
||||||
<span class="nv">vvar = </span><span class="nx">value</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
<span class="nv">vvar = </span><span class="nx">value</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
||||||
|
@ -770,10 +812,10 @@ for details.</p> </td> <td class="code"> <
|
||||||
<span class="k">if</span> <span class="o">not</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">vvar</span><span class="p">)</span> <span class="o">or</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">assigns</span><span class="p">(</span><span class="nx">vvar</span><span class="p">)</span>
|
<span class="k">if</span> <span class="o">not</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">vvar</span><span class="p">)</span> <span class="o">or</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">assigns</span><span class="p">(</span><span class="nx">vvar</span><span class="p">)</span>
|
||||||
<span class="nx">assigns</span><span class="p">.</span><span class="nx">push</span> <span class="s2">"#{ ref = o.scope.freeVariable 'ref' } = #{vvar}"</span>
|
<span class="nx">assigns</span><span class="p">.</span><span class="nx">push</span> <span class="s2">"#{ ref = o.scope.freeVariable 'ref' } = #{vvar}"</span>
|
||||||
<span class="nv">vvar = </span><span class="nx">ref</span>
|
<span class="nv">vvar = </span><span class="nx">ref</span>
|
||||||
<span class="k">for</span> <span class="nx">obj</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">objects</span></pre></div> </td> </tr> <tr id="section-92"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-92">¶</a> </div> <p>A regular array pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">idx = </span><span class="nx">i</span>
|
<span class="k">for</span> <span class="nx">obj</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">objects</span></pre></div> </td> </tr> <tr id="section-93"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-93">¶</a> </div> <p>A regular array pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">idx = </span><span class="nx">i</span>
|
||||||
<span class="k">if</span> <span class="nx">isObject</span>
|
<span class="k">if</span> <span class="nx">isObject</span>
|
||||||
<span class="k">if</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">Assign</span></pre></div> </td> </tr> <tr id="section-93"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-93">¶</a> </div> <p>A regular object pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="p">{</span><span class="nv">variable: </span><span class="p">{</span><span class="nv">base: </span><span class="nx">idx</span><span class="p">},</span> <span class="nv">value: </span><span class="nx">obj</span><span class="p">}</span> <span class="o">=</span> <span class="nx">obj</span>
|
<span class="k">if</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">Assign</span></pre></div> </td> </tr> <tr id="section-94"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-94">¶</a> </div> <p>A regular object pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="p">{</span><span class="nv">variable: </span><span class="p">{</span><span class="nv">base: </span><span class="nx">idx</span><span class="p">},</span> <span class="nv">value: </span><span class="nx">obj</span><span class="p">}</span> <span class="o">=</span> <span class="nx">obj</span>
|
||||||
<span class="k">else</span></pre></div> </td> </tr> <tr id="section-94"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-94">¶</a> </div> <p>A shorthand <code>{a, b, @c} = val</code> pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">base</span> <span class="k">instanceof</span> <span class="nx">Parens</span>
|
<span class="k">else</span></pre></div> </td> </tr> <tr id="section-95"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-95">¶</a> </div> <p>A shorthand <code>{a, b, @c} = val</code> pattern-match.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">base</span> <span class="k">instanceof</span> <span class="nx">Parens</span>
|
||||||
<span class="p">[</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">idx</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Value</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">unwrapAll</span><span class="p">()).</span><span class="nx">cacheReference</span> <span class="nx">o</span>
|
<span class="p">[</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">idx</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Value</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">unwrapAll</span><span class="p">()).</span><span class="nx">cacheReference</span> <span class="nx">o</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nv">idx = </span><span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="k">this</span> <span class="k">then</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">name</span> <span class="k">else</span> <span class="nx">obj</span>
|
<span class="nv">idx = </span><span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="k">this</span> <span class="k">then</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">name</span> <span class="k">else</span> <span class="nx">obj</span>
|
||||||
|
@ -800,17 +842,18 @@ for details.</p> </td> <td class="code"> <
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nv">acc = </span><span class="nx">isObject</span> <span class="o">and</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span> <span class="nx">idx</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">value</span> <span class="o">or</span> <span class="mi">0</span>
|
<span class="nv">acc = </span><span class="nx">isObject</span> <span class="o">and</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span> <span class="nx">idx</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">value</span> <span class="o">or</span> <span class="mi">0</span>
|
||||||
<span class="nv">val = </span><span class="k">new</span> <span class="nx">Value</span> <span class="k">new</span> <span class="nx">Literal</span><span class="p">(</span><span class="nx">vvar</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="p">(</span><span class="k">if</span> <span class="nx">acc</span> <span class="k">then</span> <span class="nx">Access</span> <span class="k">else</span> <span class="nx">Index</span><span class="p">)</span> <span class="nx">idx</span><span class="p">]</span>
|
<span class="nv">val = </span><span class="k">new</span> <span class="nx">Value</span> <span class="k">new</span> <span class="nx">Literal</span><span class="p">(</span><span class="nx">vvar</span><span class="p">),</span> <span class="p">[</span><span class="k">new</span> <span class="p">(</span><span class="k">if</span> <span class="nx">acc</span> <span class="k">then</span> <span class="nx">Access</span> <span class="k">else</span> <span class="nx">Index</span><span class="p">)</span> <span class="nx">idx</span><span class="p">]</span>
|
||||||
<span class="k">if</span> <span class="nx">name</span><span class="o">?</span> <span class="o">and</span> <span class="nx">name</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'arguments'</span><span class="p">,</span><span class="s1">'eval'</span><span class="p">].</span><span class="nx">concat</span> <span class="nx">RESERVED</span>
|
<span class="k">if</span> <span class="nx">name</span><span class="o">?</span> <span class="o">and</span> <span class="nx">name</span> <span class="k">in</span> <span class="nx">RESERVED</span>
|
||||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">SyntaxError</span> <span class="s2">"assignment to a reserved word: #{obj.compile o} = #{val.compile o}"</span>
|
<span class="k">throw</span> <span class="k">new</span> <span class="nx">SyntaxError</span> <span class="s2">"assignment to a reserved word: #{obj.compile o} = #{val.compile o}"</span>
|
||||||
<span class="nx">assigns</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">Assign</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">val</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nv">param: </span><span class="nx">@param</span><span class="p">,</span> <span class="nv">subpattern: </span><span class="kc">yes</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
<span class="nx">assigns</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">Assign</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">val</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nv">param: </span><span class="nx">@param</span><span class="p">,</span> <span class="nv">subpattern: </span><span class="kc">yes</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
||||||
<span class="nx">assigns</span><span class="p">.</span><span class="nx">push</span> <span class="nx">vvar</span> <span class="nx">unless</span> <span class="nx">top</span> <span class="o">or</span> <span class="nx">@subpattern</span>
|
<span class="nx">assigns</span><span class="p">.</span><span class="nx">push</span> <span class="nx">vvar</span> <span class="nx">unless</span> <span class="nx">top</span> <span class="o">or</span> <span class="nx">@subpattern</span>
|
||||||
<span class="nv">code = </span><span class="nx">assigns</span><span class="p">.</span><span class="nx">join</span> <span class="s1">', '</span>
|
<span class="nv">code = </span><span class="nx">assigns</span><span class="p">.</span><span class="nx">join</span> <span class="s1">', '</span>
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><</span> <span class="nx">LEVEL_LIST</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span></pre></div> </td> </tr> <tr id="section-95"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-95">¶</a> </div> <p>When compiling a conditional assignment, take care to ensure that the
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><</span> <span class="nx">LEVEL_LIST</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span></pre></div> </td> </tr> <tr id="section-96"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-96">¶</a> </div> <p>When compiling a conditional assignment, take care to ensure that the
|
||||||
operands are only evaluated once, even though we have to reference them
|
operands are only evaluated once, even though we have to reference them
|
||||||
more than once.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileConditional: </span><span class="nf">(o) -></span>
|
more than once.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileConditional: </span><span class="nf">(o) -></span>
|
||||||
<span class="p">[</span><span class="nx">left</span><span class="p">,</span> <span class="nx">rite</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">cacheReference</span> <span class="nx">o</span>
|
<span class="p">[</span><span class="nx">left</span><span class="p">,</span> <span class="nx">right</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">cacheReference</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-97"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-97">¶</a> </div> <p>Disallow conditional assignment of undefined variables.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="nx">left</span><span class="p">.</span><span class="nx">base</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">left</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">value</span> <span class="o">!=</span> <span class="s2">"this"</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">check</span> <span class="nx">left</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">value</span>
|
||||||
|
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s2">"the variable \"#{left.base.value}\" can't be assigned with #{@context} because it has not been defined."</span>
|
||||||
<span class="k">if</span> <span class="s2">"?"</span> <span class="k">in</span> <span class="nx">@context</span> <span class="k">then</span> <span class="nv">o.isExistentialEquals = </span><span class="kc">true</span>
|
<span class="k">if</span> <span class="s2">"?"</span> <span class="k">in</span> <span class="nx">@context</span> <span class="k">then</span> <span class="nv">o.isExistentialEquals = </span><span class="kc">true</span>
|
||||||
<span class="k">new</span> <span class="nx">Op</span><span class="p">(</span><span class="nx">@context</span><span class="p">[</span><span class="mi">0</span><span class="p">...</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="nx">left</span><span class="p">,</span> <span class="k">new</span> <span class="nx">Assign</span><span class="p">(</span><span class="nx">rite</span><span class="p">,</span> <span class="nx">@value</span><span class="p">,</span> <span class="s1">'='</span><span class="p">)</span> <span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-96"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-96">¶</a> </div> <p>Compile the assignment from an array splice literal, using JavaScript's
|
<span class="k">new</span> <span class="nx">Op</span><span class="p">(</span><span class="nx">@context</span><span class="p">[...</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="nx">left</span><span class="p">,</span> <span class="k">new</span> <span class="nx">Assign</span><span class="p">(</span><span class="nx">right</span><span class="p">,</span> <span class="nx">@value</span><span class="p">,</span> <span class="s1">'='</span><span class="p">)</span> <span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-98"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-98">¶</a> </div> <p>Compile the assignment from an array splice literal, using JavaScript's
|
||||||
<code>Array#splice</code> method.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileSplice: </span><span class="nf">(o) -></span>
|
<code>Array#splice</code> method.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileSplice: </span><span class="nf">(o) -></span>
|
||||||
<span class="p">{</span><span class="nv">range: </span><span class="p">{</span><span class="nx">from</span><span class="p">,</span> <span class="nx">to</span><span class="p">,</span> <span class="nx">exclusive</span><span class="p">}}</span> <span class="o">=</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
|
<span class="p">{</span><span class="nv">range: </span><span class="p">{</span><span class="nx">from</span><span class="p">,</span> <span class="nx">to</span><span class="p">,</span> <span class="nx">exclusive</span><span class="p">}}</span> <span class="o">=</span> <span class="nx">@variable</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
|
||||||
<span class="nv">name = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
|
<span class="nv">name = </span><span class="nx">@variable</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
|
||||||
|
@ -826,7 +869,7 @@ more than once.</p> </td> <td class="code">
|
||||||
<span class="nv">to = </span><span class="s2">"9e9"</span>
|
<span class="nv">to = </span><span class="s2">"9e9"</span>
|
||||||
<span class="p">[</span><span class="nx">valDef</span><span class="p">,</span> <span class="nx">valRef</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@value</span><span class="p">.</span><span class="nx">cache</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
<span class="p">[</span><span class="nx">valDef</span><span class="p">,</span> <span class="nx">valRef</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@value</span><span class="p">.</span><span class="nx">cache</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
||||||
<span class="nv">code = </span><span class="s2">"[].splice.apply(#{name}, [#{fromDecl}, #{to}].concat(#{valDef})), #{valRef}"</span>
|
<span class="nv">code = </span><span class="s2">"[].splice.apply(#{name}, [#{fromDecl}, #{to}].concat(#{valDef})), #{valRef}"</span>
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">></span> <span class="nx">LEVEL_TOP</span> <span class="k">then</span> <span class="s2">"(#{code})"</span> <span class="k">else</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-97"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-97">¶</a> </div> <h3>Code</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-98"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-98">¶</a> </div> <p>A function definition. This is the only node that creates a new Scope.
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">></span> <span class="nx">LEVEL_TOP</span> <span class="k">then</span> <span class="s2">"(#{code})"</span> <span class="k">else</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-99"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-99">¶</a> </div> <h3>Code</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-100"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-100">¶</a> </div> <p>A function definition. This is the only node that creates a new Scope.
|
||||||
When for the purposes of walking the contents of a function body, the Code
|
When for the purposes of walking the contents of a function body, the Code
|
||||||
has no <em>children</em> -- they're within the inner scope.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Code = </span><span class="k">class</span> <span class="nx">Code</span> <span class="k">extends</span> <span class="nx">Base</span>
|
has no <em>children</em> -- they're within the inner scope.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Code = </span><span class="k">class</span> <span class="nx">Code</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(params, body, tag) -></span>
|
<span class="nv">constructor: </span><span class="nf">(params, body, tag) -></span>
|
||||||
|
@ -839,7 +882,7 @@ has no <em>children</em> -- they're within the inner scope.</p> </td
|
||||||
|
|
||||||
<span class="nv">isStatement: </span><span class="o">-></span> <span class="o">!!</span><span class="nx">@ctor</span>
|
<span class="nv">isStatement: </span><span class="o">-></span> <span class="o">!!</span><span class="nx">@ctor</span>
|
||||||
|
|
||||||
<span class="nv">jumps: </span><span class="nx">NO</span></pre></div> </td> </tr> <tr id="section-99"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-99">¶</a> </div> <p>Compilation creates a new scope unless explicitly asked to share with the
|
<span class="nv">jumps: </span><span class="nx">NO</span></pre></div> </td> </tr> <tr id="section-101"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-101">¶</a> </div> <p>Compilation creates a new scope unless explicitly asked to share with the
|
||||||
outer scope. Handles splat parameters in the parameter list by peeking at
|
outer scope. Handles splat parameters in the parameter list by peeking at
|
||||||
the JavaScript <code>arguments</code> object. If the function is bound with the <code>=></code>
|
the JavaScript <code>arguments</code> object. If the function is bound with the <code>=></code>
|
||||||
arrow, generates a wrapper that saves the current value of <code>this</code> through
|
arrow, generates a wrapper that saves the current value of <code>this</code> through
|
||||||
|
@ -848,8 +891,11 @@ a closure.</p> </td> <td class="code"> <di
|
||||||
<span class="nv">o.scope.shared = </span><span class="nx">del</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="s1">'sharedScope'</span><span class="p">)</span>
|
<span class="nv">o.scope.shared = </span><span class="nx">del</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="s1">'sharedScope'</span><span class="p">)</span>
|
||||||
<span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+=</span> <span class="nx">TAB</span>
|
<span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+=</span> <span class="nx">TAB</span>
|
||||||
<span class="k">delete</span> <span class="nx">o</span><span class="p">.</span><span class="nx">bare</span>
|
<span class="k">delete</span> <span class="nx">o</span><span class="p">.</span><span class="nx">bare</span>
|
||||||
<span class="nv">vars = </span><span class="p">[]</span>
|
<span class="k">delete</span> <span class="nx">o</span><span class="p">.</span><span class="nx">isExistentialEquals</span>
|
||||||
|
<span class="nv">params = </span><span class="p">[]</span>
|
||||||
<span class="nv">exprs = </span><span class="p">[]</span>
|
<span class="nv">exprs = </span><span class="p">[]</span>
|
||||||
|
<span class="k">for</span> <span class="nx">name</span> <span class="k">in</span> <span class="nx">@paramNames</span><span class="p">()</span> <span class="c1"># this step must be performed before the others</span>
|
||||||
|
<span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">check</span> <span class="nx">name</span> <span class="k">then</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">parameter</span> <span class="nx">name</span>
|
||||||
<span class="k">for</span> <span class="nx">param</span> <span class="k">in</span> <span class="nx">@params</span> <span class="k">when</span> <span class="nx">param</span><span class="p">.</span><span class="nx">splat</span>
|
<span class="k">for</span> <span class="nx">param</span> <span class="k">in</span> <span class="nx">@params</span> <span class="k">when</span> <span class="nx">param</span><span class="p">.</span><span class="nx">splat</span>
|
||||||
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">add</span> <span class="nx">p</span><span class="p">.</span><span class="nx">name</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span> <span class="s1">'var'</span><span class="p">,</span> <span class="kc">yes</span> <span class="k">for</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">@params</span> <span class="k">when</span> <span class="nx">p</span><span class="p">.</span><span class="nx">name</span><span class="p">.</span><span class="nx">value</span>
|
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">add</span> <span class="nx">p</span><span class="p">.</span><span class="nx">name</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span> <span class="s1">'var'</span><span class="p">,</span> <span class="kc">yes</span> <span class="k">for</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">@params</span> <span class="k">when</span> <span class="nx">p</span><span class="p">.</span><span class="nx">name</span><span class="p">.</span><span class="nx">value</span>
|
||||||
<span class="nv">splats = </span><span class="k">new</span> <span class="nx">Assign</span> <span class="k">new</span> <span class="nx">Value</span><span class="p">(</span><span class="k">new</span> <span class="nx">Arr</span><span class="p">(</span><span class="nx">p</span><span class="p">.</span><span class="nx">asReference</span> <span class="nx">o</span> <span class="k">for</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">@params</span><span class="p">)),</span>
|
<span class="nv">splats = </span><span class="k">new</span> <span class="nx">Assign</span> <span class="k">new</span> <span class="nx">Value</span><span class="p">(</span><span class="k">new</span> <span class="nx">Arr</span><span class="p">(</span><span class="nx">p</span><span class="p">.</span><span class="nx">asReference</span> <span class="nx">o</span> <span class="k">for</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">@params</span><span class="p">)),</span>
|
||||||
|
@ -866,11 +912,15 @@ a closure.</p> </td> <td class="code"> <di
|
||||||
<span class="nv">lit = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">ref</span><span class="p">.</span><span class="nx">name</span><span class="p">.</span><span class="nx">value</span> <span class="o">+</span> <span class="s1">' == null'</span>
|
<span class="nv">lit = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">ref</span><span class="p">.</span><span class="nx">name</span><span class="p">.</span><span class="nx">value</span> <span class="o">+</span> <span class="s1">' == null'</span>
|
||||||
<span class="nv">val = </span><span class="k">new</span> <span class="nx">Assign</span> <span class="k">new</span> <span class="nx">Value</span><span class="p">(</span><span class="nx">param</span><span class="p">.</span><span class="nx">name</span><span class="p">),</span> <span class="nx">param</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span> <span class="s1">'='</span>
|
<span class="nv">val = </span><span class="k">new</span> <span class="nx">Assign</span> <span class="k">new</span> <span class="nx">Value</span><span class="p">(</span><span class="nx">param</span><span class="p">.</span><span class="nx">name</span><span class="p">),</span> <span class="nx">param</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span> <span class="s1">'='</span>
|
||||||
<span class="nx">exprs</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">If</span> <span class="nx">lit</span><span class="p">,</span> <span class="nx">val</span>
|
<span class="nx">exprs</span><span class="p">.</span><span class="nx">push</span> <span class="k">new</span> <span class="nx">If</span> <span class="nx">lit</span><span class="p">,</span> <span class="nx">val</span>
|
||||||
<span class="nx">vars</span><span class="p">.</span><span class="nx">push</span> <span class="nx">ref</span> <span class="nx">unless</span> <span class="nx">splats</span>
|
<span class="nx">params</span><span class="p">.</span><span class="nx">push</span> <span class="nx">ref</span> <span class="nx">unless</span> <span class="nx">splats</span>
|
||||||
<span class="nv">wasEmpty = </span><span class="nx">@body</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">()</span>
|
<span class="nv">wasEmpty = </span><span class="nx">@body</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">()</span>
|
||||||
<span class="nx">exprs</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">splats</span> <span class="k">if</span> <span class="nx">splats</span>
|
<span class="nx">exprs</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">splats</span> <span class="k">if</span> <span class="nx">splats</span>
|
||||||
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">exprs</span><span class="p">...</span> <span class="k">if</span> <span class="nx">exprs</span><span class="p">.</span><span class="nx">length</span>
|
<span class="nx">@body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="nx">exprs</span><span class="p">...</span> <span class="k">if</span> <span class="nx">exprs</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">parameter</span> <span class="nx">vars</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">v</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span> <span class="k">for</span> <span class="nx">v</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">vars</span> <span class="nx">unless</span> <span class="nx">splats</span>
|
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">parameter</span> <span class="nx">params</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">p</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span> <span class="k">for</span> <span class="nx">p</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">params</span>
|
||||||
|
<span class="nv">uniqs = </span><span class="p">[]</span>
|
||||||
|
<span class="k">for</span> <span class="nx">name</span> <span class="k">in</span> <span class="nx">@paramNames</span><span class="p">()</span>
|
||||||
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s2">"multiple parameters named '#{name}'"</span> <span class="k">if</span> <span class="nx">name</span> <span class="k">in</span> <span class="nx">uniqs</span>
|
||||||
|
<span class="nx">uniqs</span><span class="p">.</span><span class="nx">push</span> <span class="nx">name</span>
|
||||||
<span class="nx">@body</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span> <span class="nx">unless</span> <span class="nx">wasEmpty</span> <span class="o">or</span> <span class="nx">@noReturn</span>
|
<span class="nx">@body</span><span class="p">.</span><span class="nx">makeReturn</span><span class="p">()</span> <span class="nx">unless</span> <span class="nx">wasEmpty</span> <span class="o">or</span> <span class="nx">@noReturn</span>
|
||||||
<span class="k">if</span> <span class="nx">@bound</span>
|
<span class="k">if</span> <span class="nx">@bound</span>
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">parent</span><span class="p">.</span><span class="nx">method</span><span class="o">?</span><span class="p">.</span><span class="nx">bound</span>
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">parent</span><span class="p">.</span><span class="nx">method</span><span class="o">?</span><span class="p">.</span><span class="nx">bound</span>
|
||||||
|
@ -880,16 +930,21 @@ a closure.</p> </td> <td class="code"> <di
|
||||||
<span class="nv">idt = </span><span class="nx">o</span><span class="p">.</span><span class="nx">indent</span>
|
<span class="nv">idt = </span><span class="nx">o</span><span class="p">.</span><span class="nx">indent</span>
|
||||||
<span class="nv">code = </span><span class="s1">'function'</span>
|
<span class="nv">code = </span><span class="s1">'function'</span>
|
||||||
<span class="nx">code</span> <span class="o">+=</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">@name</span> <span class="k">if</span> <span class="nx">@ctor</span>
|
<span class="nx">code</span> <span class="o">+=</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">@name</span> <span class="k">if</span> <span class="nx">@ctor</span>
|
||||||
<span class="nx">code</span> <span class="o">+=</span> <span class="s1">'('</span> <span class="o">+</span> <span class="nx">vars</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span> <span class="o">+</span> <span class="s1">') {'</span>
|
<span class="nx">code</span> <span class="o">+=</span> <span class="s1">'('</span> <span class="o">+</span> <span class="nx">params</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">', '</span><span class="p">)</span> <span class="o">+</span> <span class="s1">') {'</span>
|
||||||
<span class="nx">code</span> <span class="o">+=</span> <span class="s2">"\n#{ @body.compileWithDeclarations o }\n#{@tab}"</span> <span class="nx">unless</span> <span class="nx">@body</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">()</span>
|
<span class="nx">code</span> <span class="o">+=</span> <span class="s2">"\n#{ @body.compileWithDeclarations o }\n#{@tab}"</span> <span class="nx">unless</span> <span class="nx">@body</span><span class="p">.</span><span class="nx">isEmpty</span><span class="p">()</span>
|
||||||
<span class="nx">code</span> <span class="o">+=</span> <span class="s1">'}'</span>
|
<span class="nx">code</span> <span class="o">+=</span> <span class="s1">'}'</span>
|
||||||
<span class="k">return</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="nx">code</span> <span class="k">if</span> <span class="nx">@ctor</span>
|
<span class="k">return</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="nx">code</span> <span class="k">if</span> <span class="nx">@ctor</span>
|
||||||
<span class="k">if</span> <span class="nx">@front</span> <span class="o">or</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">>=</span> <span class="nx">LEVEL_ACCESS</span><span class="p">)</span> <span class="k">then</span> <span class="s2">"(#{code})"</span> <span class="k">else</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-100"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-100">¶</a> </div> <p>Short-circuit <code>traverseChildren</code> method to prevent it from crossing scope boundaries
|
<span class="k">if</span> <span class="nx">@front</span> <span class="o">or</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">>=</span> <span class="nx">LEVEL_ACCESS</span><span class="p">)</span> <span class="k">then</span> <span class="s2">"(#{code})"</span> <span class="k">else</span> <span class="nx">code</span></pre></div> </td> </tr> <tr id="section-102"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-102">¶</a> </div> <p>A list of parameter names, excluding those generated by the compiler.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">paramNames: </span><span class="o">-></span>
|
||||||
|
<span class="nv">names = </span><span class="p">[]</span>
|
||||||
|
<span class="nx">names</span><span class="p">.</span><span class="nx">push</span> <span class="nx">param</span><span class="p">.</span><span class="nx">names</span><span class="p">()...</span> <span class="k">for</span> <span class="nx">param</span> <span class="k">in</span> <span class="nx">@params</span>
|
||||||
|
<span class="nx">names</span></pre></div> </td> </tr> <tr id="section-103"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-103">¶</a> </div> <p>Short-circuit <code>traverseChildren</code> method to prevent it from crossing scope boundaries
|
||||||
unless <code>crossScope</code> is <code>true</code>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">traverseChildren: </span><span class="nf">(crossScope, func) -></span>
|
unless <code>crossScope</code> is <code>true</code>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">traverseChildren: </span><span class="nf">(crossScope, func) -></span>
|
||||||
<span class="k">super</span><span class="p">(</span><span class="nx">crossScope</span><span class="p">,</span> <span class="nx">func</span><span class="p">)</span> <span class="k">if</span> <span class="nx">crossScope</span></pre></div> </td> </tr> <tr id="section-101"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-101">¶</a> </div> <h3>Param</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-102"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-102">¶</a> </div> <p>A parameter in a function definition. Beyond a typical Javascript parameter,
|
<span class="k">super</span><span class="p">(</span><span class="nx">crossScope</span><span class="p">,</span> <span class="nx">func</span><span class="p">)</span> <span class="k">if</span> <span class="nx">crossScope</span></pre></div> </td> </tr> <tr id="section-104"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-104">¶</a> </div> <h3>Param</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-105"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-105">¶</a> </div> <p>A parameter in a function definition. Beyond a typical Javascript parameter,
|
||||||
these parameters can also attach themselves to the context of the function,
|
these parameters can also attach themselves to the context of the function,
|
||||||
as well as be a splat, gathering up a group of parameters into an array.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Param = </span><span class="k">class</span> <span class="nx">Param</span> <span class="k">extends</span> <span class="nx">Base</span>
|
as well as be a splat, gathering up a group of parameters into an array.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Param = </span><span class="k">class</span> <span class="nx">Param</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(@name, @value, @splat) -></span>
|
<span class="nv">constructor: </span><span class="nf">(@name, @value, @splat) -></span>
|
||||||
|
<span class="k">if</span> <span class="p">(</span><span class="nv">name = </span><span class="nx">@name</span><span class="p">.</span><span class="nx">unwrapAll</span><span class="p">().</span><span class="nx">value</span><span class="p">)</span> <span class="k">in</span> <span class="nx">STRICT_PROSCRIBED</span>
|
||||||
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s2">"parameter name \"#{name}\" is not allowed"</span>
|
||||||
|
|
||||||
<span class="nv">children: </span><span class="p">[</span><span class="s1">'name'</span><span class="p">,</span> <span class="s1">'value'</span><span class="p">]</span>
|
<span class="nv">children: </span><span class="p">[</span><span class="s1">'name'</span><span class="p">,</span> <span class="s1">'value'</span><span class="p">]</span>
|
||||||
|
|
||||||
|
@ -901,7 +956,8 @@ as well as be a splat, gathering up a group of parameters into an array.</p>
|
||||||
<span class="nv">node = </span><span class="nx">@name</span>
|
<span class="nv">node = </span><span class="nx">@name</span>
|
||||||
<span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="k">this</span>
|
<span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="k">this</span>
|
||||||
<span class="nv">node = </span><span class="nx">node</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">name</span>
|
<span class="nv">node = </span><span class="nx">node</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">name</span>
|
||||||
<span class="nv">node = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="s1">'_'</span> <span class="o">+</span> <span class="nx">node</span><span class="p">.</span><span class="nx">value</span> <span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">reserved</span>
|
<span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">reserved</span>
|
||||||
|
<span class="nv">node = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="nx">node</span><span class="p">.</span><span class="nx">value</span>
|
||||||
<span class="k">else</span> <span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span>
|
<span class="k">else</span> <span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span>
|
||||||
<span class="nv">node = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'arg'</span>
|
<span class="nv">node = </span><span class="k">new</span> <span class="nx">Literal</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'arg'</span>
|
||||||
<span class="nv">node = </span><span class="k">new</span> <span class="nx">Value</span> <span class="nx">node</span>
|
<span class="nv">node = </span><span class="k">new</span> <span class="nx">Value</span> <span class="nx">node</span>
|
||||||
|
@ -909,7 +965,34 @@ as well as be a splat, gathering up a group of parameters into an array.</p>
|
||||||
<span class="vi">@reference = </span><span class="nx">node</span>
|
<span class="vi">@reference = </span><span class="nx">node</span>
|
||||||
|
|
||||||
<span class="nv">isComplex: </span><span class="o">-></span>
|
<span class="nv">isComplex: </span><span class="o">-></span>
|
||||||
<span class="nx">@name</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-103"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-103">¶</a> </div> <h3>Splat</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-104"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-104">¶</a> </div> <p>A splat, either as a parameter to a function, an argument to a call,
|
<span class="nx">@name</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-106"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-106">¶</a> </div> <p>Finds the name or names of a <code>Param</code>; useful for detecting duplicates.
|
||||||
|
In a sense, a destructured parameter represents multiple JS parameters,
|
||||||
|
thus this method returns an <code>Array</code> of names.
|
||||||
|
Reserved words used as param names, as well as the Object and Array
|
||||||
|
literals used for destructured params, get a compiler generated name
|
||||||
|
during the <code>Code</code> compilation step, so this is necessarily an incomplete
|
||||||
|
list of a parameter's names.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">names: </span><span class="nf">(name = @name)-></span>
|
||||||
|
<span class="nv">atParam = </span><span class="nf">(obj) -></span>
|
||||||
|
<span class="p">{</span><span class="nx">value</span><span class="p">}</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">properties</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">name</span>
|
||||||
|
<span class="k">return</span> <span class="k">if</span> <span class="nx">value</span><span class="p">.</span><span class="nx">reserved</span> <span class="k">then</span> <span class="p">[]</span> <span class="k">else</span> <span class="p">[</span><span class="nx">value</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-107"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-107">¶</a> </div> <ul>
|
||||||
|
<li>simple literals <code>foo</code></li>
|
||||||
|
</ul> </td> <td class="code"> <div class="highlight"><pre> <span class="k">return</span> <span class="p">[</span><span class="nx">name</span><span class="p">.</span><span class="nx">value</span><span class="p">]</span> <span class="k">if</span> <span class="nx">name</span> <span class="k">instanceof</span> <span class="nx">Literal</span></pre></div> </td> </tr> <tr id="section-108"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-108">¶</a> </div> <ul>
|
||||||
|
<li>at-params <code>@foo</code></li>
|
||||||
|
</ul> </td> <td class="code"> <div class="highlight"><pre> <span class="k">return</span> <span class="nx">atParam</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="k">if</span> <span class="nx">name</span> <span class="k">instanceof</span> <span class="nx">Value</span>
|
||||||
|
<span class="nv">names = </span><span class="p">[]</span>
|
||||||
|
<span class="k">for</span> <span class="nx">obj</span> <span class="k">in</span> <span class="nx">name</span><span class="p">.</span><span class="nx">objects</span></pre></div> </td> </tr> <tr id="section-109"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-109">¶</a> </div> <ul>
|
||||||
|
<li>assignments within destructured parameters <code>{foo:bar}</code></li>
|
||||||
|
</ul> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">Assign</span>
|
||||||
|
<span class="nx">names</span><span class="p">.</span><span class="nx">push</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">variable</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">value</span></pre></div> </td> </tr> <tr id="section-110"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-110">¶</a> </div> <ul>
|
||||||
|
<li>destructured parameters within destructured parameters <code>[{a}]</code></li>
|
||||||
|
</ul> </td> <td class="code"> <div class="highlight"><pre> <span class="k">else</span> <span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">isArray</span><span class="p">()</span> <span class="o">or</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">isObject</span><span class="p">()</span>
|
||||||
|
<span class="nx">names</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@names</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">base</span><span class="p">)...</span></pre></div> </td> </tr> <tr id="section-111"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-111">¶</a> </div> <ul>
|
||||||
|
<li>at-params within destructured parameters <code>{@foo}</code></li>
|
||||||
|
</ul> </td> <td class="code"> <div class="highlight"><pre> <span class="k">else</span> <span class="k">if</span> <span class="nx">obj</span><span class="p">.</span><span class="k">this</span>
|
||||||
|
<span class="nx">names</span><span class="p">.</span><span class="nx">push</span> <span class="nx">atParam</span><span class="p">(</span><span class="nx">obj</span><span class="p">)...</span></pre></div> </td> </tr> <tr id="section-112"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-112">¶</a> </div> <ul>
|
||||||
|
<li>simple destructured parameters {foo}</li>
|
||||||
|
</ul> </td> <td class="code"> <div class="highlight"><pre> <span class="k">else</span> <span class="nx">names</span><span class="p">.</span><span class="nx">push</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">value</span>
|
||||||
|
<span class="nx">names</span></pre></div> </td> </tr> <tr id="section-113"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-113">¶</a> </div> <h3>Splat</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-114"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-114">¶</a> </div> <p>A splat, either as a parameter to a function, an argument to a call,
|
||||||
or as part of a destructuring assignment.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Splat = </span><span class="k">class</span> <span class="nx">Splat</span> <span class="k">extends</span> <span class="nx">Base</span>
|
or as part of a destructuring assignment.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Splat = </span><span class="k">class</span> <span class="nx">Splat</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
|
|
||||||
<span class="nv">children: </span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span>
|
<span class="nv">children: </span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span>
|
||||||
|
@ -924,8 +1007,8 @@ or as part of a destructuring assignment.</p> </td> <td
|
||||||
|
|
||||||
<span class="nv">compile: </span><span class="nf">(o) -></span>
|
<span class="nv">compile: </span><span class="nf">(o) -></span>
|
||||||
<span class="k">if</span> <span class="nx">@index</span><span class="o">?</span> <span class="k">then</span> <span class="nx">@compileParam</span> <span class="nx">o</span> <span class="k">else</span> <span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
|
<span class="k">if</span> <span class="nx">@index</span><span class="o">?</span> <span class="k">then</span> <span class="nx">@compileParam</span> <span class="nx">o</span> <span class="k">else</span> <span class="nx">@name</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
|
||||||
|
|
||||||
<span class="nv">unwrap: </span><span class="o">-></span> <span class="nx">@name</span></pre></div> </td> </tr> <tr id="section-105"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-105">¶</a> </div> <p>Utility function that converts an arbitrary number of elements, mixed with
|
<span class="nv">unwrap: </span><span class="o">-></span> <span class="nx">@name</span></pre></div> </td> </tr> <tr id="section-115"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-115">¶</a> </div> <p>Utility function that converts an arbitrary number of elements, mixed with
|
||||||
splats, to a proper array.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@compileSplattedArray: </span><span class="nf">(o, list, apply) -></span>
|
splats, to a proper array.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@compileSplattedArray: </span><span class="nf">(o, list, apply) -></span>
|
||||||
<span class="nv">index = </span><span class="o">-</span><span class="mi">1</span>
|
<span class="nv">index = </span><span class="o">-</span><span class="mi">1</span>
|
||||||
<span class="k">continue</span> <span class="k">while</span> <span class="p">(</span><span class="nv">node = </span><span class="nx">list</span><span class="p">[</span><span class="o">++</span><span class="nx">index</span><span class="p">])</span> <span class="o">and</span> <span class="nx">node</span> <span class="o">not</span> <span class="k">instanceof</span> <span class="nx">Splat</span>
|
<span class="k">continue</span> <span class="k">while</span> <span class="p">(</span><span class="nv">node = </span><span class="nx">list</span><span class="p">[</span><span class="o">++</span><span class="nx">index</span><span class="p">])</span> <span class="o">and</span> <span class="nx">node</span> <span class="o">not</span> <span class="k">instanceof</span> <span class="nx">Splat</span>
|
||||||
|
@ -941,8 +1024,8 @@ splats, to a proper array.</p> </td> <td class="code">
|
||||||
<span class="k">then</span> <span class="s2">"#{ utility 'slice' }.call(#{code})"</span>
|
<span class="k">then</span> <span class="s2">"#{ utility 'slice' }.call(#{code})"</span>
|
||||||
<span class="k">else</span> <span class="s2">"[#{code}]"</span>
|
<span class="k">else</span> <span class="s2">"[#{code}]"</span>
|
||||||
<span class="k">return</span> <span class="nx">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s2">".concat(#{ args[1..].join ', ' })"</span> <span class="k">if</span> <span class="nx">index</span> <span class="o">is</span> <span class="mi">0</span>
|
<span class="k">return</span> <span class="nx">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s2">".concat(#{ args[1..].join ', ' })"</span> <span class="k">if</span> <span class="nx">index</span> <span class="o">is</span> <span class="mi">0</span>
|
||||||
<span class="nv">base = </span><span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span> <span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">list</span><span class="p">[</span><span class="mi">0</span><span class="p">...</span><span class="nx">index</span><span class="p">])</span>
|
<span class="nv">base = </span><span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span> <span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">list</span><span class="p">[...</span><span class="nx">index</span><span class="p">])</span>
|
||||||
<span class="s2">"[#{ base.join ', ' }].concat(#{ args.join ', ' })"</span></pre></div> </td> </tr> <tr id="section-106"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-106">¶</a> </div> <h3>While</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-107"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-107">¶</a> </div> <p>A while loop, the only sort of low-level loop exposed by CoffeeScript. From
|
<span class="s2">"[#{ base.join ', ' }].concat(#{ args.join ', ' })"</span></pre></div> </td> </tr> <tr id="section-116"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-116">¶</a> </div> <h3>While</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-117"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-117">¶</a> </div> <p>A while loop, the only sort of low-level loop exposed by CoffeeScript. From
|
||||||
it, all other loops can be manufactured. Useful in cases where you need more
|
it, all other loops can be manufactured. Useful in cases where you need more
|
||||||
flexibility or more speed than a comprehension can provide.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.While = </span><span class="k">class</span> <span class="nx">While</span> <span class="k">extends</span> <span class="nx">Base</span>
|
flexibility or more speed than a comprehension can provide.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.While = </span><span class="k">class</span> <span class="nx">While</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(condition, options) -></span>
|
<span class="nv">constructor: </span><span class="nf">(condition, options) -></span>
|
||||||
|
@ -968,7 +1051,7 @@ flexibility or more speed than a comprehension can provide.</p> </td
|
||||||
<span class="k">return</span> <span class="kc">no</span> <span class="nx">unless</span> <span class="nx">expressions</span><span class="p">.</span><span class="nx">length</span>
|
<span class="k">return</span> <span class="kc">no</span> <span class="nx">unless</span> <span class="nx">expressions</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">expressions</span>
|
<span class="k">for</span> <span class="nx">node</span> <span class="k">in</span> <span class="nx">expressions</span>
|
||||||
<span class="k">return</span> <span class="nx">node</span> <span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">jumps</span> <span class="nv">loop: </span><span class="kc">yes</span>
|
<span class="k">return</span> <span class="nx">node</span> <span class="k">if</span> <span class="nx">node</span><span class="p">.</span><span class="nx">jumps</span> <span class="nv">loop: </span><span class="kc">yes</span>
|
||||||
<span class="kc">no</span></pre></div> </td> </tr> <tr id="section-108"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-108">¶</a> </div> <p>The main difference from a JavaScript <em>while</em> is that the CoffeeScript
|
<span class="kc">no</span></pre></div> </td> </tr> <tr id="section-118"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-118">¶</a> </div> <p>The main difference from a JavaScript <em>while</em> is that the CoffeeScript
|
||||||
<em>while</em> can be used as a part of a larger expression -- while loops may
|
<em>while</em> can be used as a part of a larger expression -- while loops may
|
||||||
return an array containing the computed result of each iteration.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
return an array containing the computed result of each iteration.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
||||||
<span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+=</span> <span class="nx">TAB</span>
|
<span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+=</span> <span class="nx">TAB</span>
|
||||||
|
@ -989,14 +1072,12 @@ return an array containing the computed result of each iteration.</p>
|
||||||
<span class="nv">code = </span><span class="nx">set</span> <span class="o">+</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="s2">"while (#{ @condition.compile o, LEVEL_PAREN }) {#{body}}"</span>
|
<span class="nv">code = </span><span class="nx">set</span> <span class="o">+</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="s2">"while (#{ @condition.compile o, LEVEL_PAREN }) {#{body}}"</span>
|
||||||
<span class="k">if</span> <span class="nx">@returns</span>
|
<span class="k">if</span> <span class="nx">@returns</span>
|
||||||
<span class="nx">code</span> <span class="o">+=</span> <span class="s2">"\n#{@tab}return #{rvar};"</span>
|
<span class="nx">code</span> <span class="o">+=</span> <span class="s2">"\n#{@tab}return #{rvar};"</span>
|
||||||
<span class="nx">code</span></pre></div> </td> </tr> <tr id="section-109"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-109">¶</a> </div> <h3>Op</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-110"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-110">¶</a> </div> <p>Simple Arithmetic and logical operations. Performs some conversion from
|
<span class="nx">code</span></pre></div> </td> </tr> <tr id="section-119"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-119">¶</a> </div> <h3>Op</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-120"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-120">¶</a> </div> <p>Simple Arithmetic and logical operations. Performs some conversion from
|
||||||
CoffeeScript operations into their JavaScript equivalents.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Op = </span><span class="k">class</span> <span class="nx">Op</span> <span class="k">extends</span> <span class="nx">Base</span>
|
CoffeeScript operations into their JavaScript equivalents.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Op = </span><span class="k">class</span> <span class="nx">Op</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(op, first, second, flip ) -></span>
|
<span class="nv">constructor: </span><span class="nf">(op, first, second, flip ) -></span>
|
||||||
<span class="k">return</span> <span class="k">new</span> <span class="nx">In</span> <span class="nx">first</span><span class="p">,</span> <span class="nx">second</span> <span class="k">if</span> <span class="nx">op</span> <span class="o">is</span> <span class="s1">'in'</span>
|
<span class="k">return</span> <span class="k">new</span> <span class="nx">In</span> <span class="nx">first</span><span class="p">,</span> <span class="nx">second</span> <span class="k">if</span> <span class="nx">op</span> <span class="o">is</span> <span class="s1">'in'</span>
|
||||||
<span class="k">if</span> <span class="nx">op</span> <span class="o">is</span> <span class="s1">'do'</span>
|
<span class="k">if</span> <span class="nx">op</span> <span class="o">is</span> <span class="s1">'do'</span>
|
||||||
<span class="nv">call = </span><span class="k">new</span> <span class="nx">Call</span> <span class="nx">first</span><span class="p">,</span> <span class="nx">first</span><span class="p">.</span><span class="nx">params</span> <span class="o">or</span> <span class="p">[]</span>
|
<span class="k">return</span> <span class="nx">@generateDo</span> <span class="nx">first</span>
|
||||||
<span class="nv">call.do = </span><span class="kc">yes</span>
|
|
||||||
<span class="k">return</span> <span class="nx">call</span>
|
|
||||||
<span class="k">if</span> <span class="nx">op</span> <span class="o">is</span> <span class="s1">'new'</span>
|
<span class="k">if</span> <span class="nx">op</span> <span class="o">is</span> <span class="s1">'new'</span>
|
||||||
<span class="k">return</span> <span class="nx">first</span><span class="p">.</span><span class="nx">newInstance</span><span class="p">()</span> <span class="k">if</span> <span class="nx">first</span> <span class="k">instanceof</span> <span class="nx">Call</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">first</span><span class="p">.</span><span class="nx">do</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">first</span><span class="p">.</span><span class="nx">isNew</span>
|
<span class="k">return</span> <span class="nx">first</span><span class="p">.</span><span class="nx">newInstance</span><span class="p">()</span> <span class="k">if</span> <span class="nx">first</span> <span class="k">instanceof</span> <span class="nx">Call</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">first</span><span class="p">.</span><span class="nx">do</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">first</span><span class="p">.</span><span class="nx">isNew</span>
|
||||||
<span class="nv">first = </span><span class="k">new</span> <span class="nx">Parens</span> <span class="nx">first</span> <span class="k">if</span> <span class="nx">first</span> <span class="k">instanceof</span> <span class="nx">Code</span> <span class="o">and</span> <span class="nx">first</span><span class="p">.</span><span class="nx">bound</span> <span class="o">or</span> <span class="nx">first</span><span class="p">.</span><span class="nx">do</span>
|
<span class="nv">first = </span><span class="k">new</span> <span class="nx">Parens</span> <span class="nx">first</span> <span class="k">if</span> <span class="nx">first</span> <span class="k">instanceof</span> <span class="nx">Code</span> <span class="o">and</span> <span class="nx">first</span><span class="p">.</span><span class="nx">bound</span> <span class="o">or</span> <span class="nx">first</span><span class="p">.</span><span class="nx">do</span>
|
||||||
|
@ -1004,10 +1085,10 @@ CoffeeScript operations into their JavaScript equivalents.</p> </td>
|
||||||
<span class="vi">@first = </span><span class="nx">first</span>
|
<span class="vi">@first = </span><span class="nx">first</span>
|
||||||
<span class="vi">@second = </span><span class="nx">second</span>
|
<span class="vi">@second = </span><span class="nx">second</span>
|
||||||
<span class="vi">@flip = </span><span class="o">!!</span><span class="nx">flip</span>
|
<span class="vi">@flip = </span><span class="o">!!</span><span class="nx">flip</span>
|
||||||
<span class="k">return</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-111"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-111">¶</a> </div> <p>The map of conversions from CoffeeScript to JavaScript symbols.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">CONVERSIONS =</span>
|
<span class="k">return</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-121"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-121">¶</a> </div> <p>The map of conversions from CoffeeScript to JavaScript symbols.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">CONVERSIONS =</span>
|
||||||
<span class="s1">'=='</span><span class="o">:</span> <span class="s1">'==='</span>
|
<span class="s1">'=='</span><span class="o">:</span> <span class="s1">'==='</span>
|
||||||
<span class="s1">'!='</span><span class="o">:</span> <span class="s1">'!=='</span>
|
<span class="s1">'!='</span><span class="o">:</span> <span class="s1">'!=='</span>
|
||||||
<span class="s1">'of'</span><span class="o">:</span> <span class="s1">'in'</span></pre></div> </td> </tr> <tr id="section-112"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-112">¶</a> </div> <p>The map of invertible operators.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">INVERSIONS =</span>
|
<span class="s1">'of'</span><span class="o">:</span> <span class="s1">'in'</span></pre></div> </td> </tr> <tr id="section-122"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-122">¶</a> </div> <p>The map of invertible operators.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">INVERSIONS =</span>
|
||||||
<span class="s1">'!=='</span><span class="o">:</span> <span class="s1">'==='</span>
|
<span class="s1">'!=='</span><span class="o">:</span> <span class="s1">'==='</span>
|
||||||
<span class="s1">'==='</span><span class="o">:</span> <span class="s1">'!=='</span>
|
<span class="s1">'==='</span><span class="o">:</span> <span class="s1">'!=='</span>
|
||||||
|
|
||||||
|
@ -1019,7 +1100,7 @@ CoffeeScript operations into their JavaScript equivalents.</p> </td>
|
||||||
<span class="o">not</span> <span class="nx">@second</span>
|
<span class="o">not</span> <span class="nx">@second</span>
|
||||||
|
|
||||||
<span class="nv">isComplex: </span><span class="o">-></span>
|
<span class="nv">isComplex: </span><span class="o">-></span>
|
||||||
<span class="o">not</span> <span class="p">(</span><span class="nx">@isUnary</span><span class="p">()</span> <span class="o">and</span> <span class="p">(</span><span class="nx">@operator</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'+'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">]))</span> <span class="o">or</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-113"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-113">¶</a> </div> <p>Am I capable of
|
<span class="o">not</span> <span class="p">(</span><span class="nx">@isUnary</span><span class="p">()</span> <span class="o">and</span> <span class="p">(</span><span class="nx">@operator</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'+'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">]))</span> <span class="o">or</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">isComplex</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-123"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-123">¶</a> </div> <p>Am I capable of
|
||||||
<a href="http://docs.python.org/reference/expressions.html#notin">Python-style comparison chaining</a>?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">isChainable: </span><span class="o">-></span>
|
<a href="http://docs.python.org/reference/expressions.html#notin">Python-style comparison chaining</a>?</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">isChainable: </span><span class="o">-></span>
|
||||||
<span class="nx">@operator</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'<'</span><span class="p">,</span> <span class="s1">'>'</span><span class="p">,</span> <span class="s1">'>='</span><span class="p">,</span> <span class="s1">'<='</span><span class="p">,</span> <span class="s1">'==='</span><span class="p">,</span> <span class="s1">'!=='</span><span class="p">]</span>
|
<span class="nx">@operator</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'<'</span><span class="p">,</span> <span class="s1">'>'</span><span class="p">,</span> <span class="s1">'>='</span><span class="p">,</span> <span class="s1">'<='</span><span class="p">,</span> <span class="s1">'==='</span><span class="p">,</span> <span class="s1">'!=='</span><span class="p">]</span>
|
||||||
|
|
||||||
|
@ -1053,15 +1134,35 @@ CoffeeScript operations into their JavaScript equivalents.</p> </td>
|
||||||
<span class="nv">unfoldSoak: </span><span class="nf">(o) -></span>
|
<span class="nv">unfoldSoak: </span><span class="nf">(o) -></span>
|
||||||
<span class="nx">@operator</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'++'</span><span class="p">,</span> <span class="s1">'--'</span><span class="p">,</span> <span class="s1">'delete'</span><span class="p">]</span> <span class="o">and</span> <span class="nx">unfoldSoak</span> <span class="nx">o</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="s1">'first'</span>
|
<span class="nx">@operator</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'++'</span><span class="p">,</span> <span class="s1">'--'</span><span class="p">,</span> <span class="s1">'delete'</span><span class="p">]</span> <span class="o">and</span> <span class="nx">unfoldSoak</span> <span class="nx">o</span><span class="p">,</span> <span class="k">this</span><span class="p">,</span> <span class="s1">'first'</span>
|
||||||
|
|
||||||
<span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
<span class="nv">generateDo: </span><span class="nf">(exp) -></span>
|
||||||
<span class="nv">isChain = </span><span class="nx">@isChainable</span><span class="p">()</span> <span class="o">and</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">isChainable</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-114"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-114">¶</a> </div> <p>In chains, there's no need to wrap bare obj literals in parens,
|
<span class="nv">passedParams = </span><span class="p">[]</span>
|
||||||
|
<span class="nv">func = </span><span class="k">if</span> <span class="nx">exp</span> <span class="k">instanceof</span> <span class="nx">Assign</span> <span class="o">and</span> <span class="p">(</span><span class="nv">ref = </span><span class="nx">exp</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">())</span> <span class="k">instanceof</span> <span class="nx">Code</span>
|
||||||
|
<span class="nx">ref</span>
|
||||||
|
<span class="k">else</span>
|
||||||
|
<span class="nx">exp</span>
|
||||||
|
<span class="k">for</span> <span class="nx">param</span> <span class="k">in</span> <span class="nx">func</span><span class="p">.</span><span class="nx">params</span> <span class="o">or</span> <span class="p">[]</span>
|
||||||
|
<span class="k">if</span> <span class="nx">param</span><span class="p">.</span><span class="nx">value</span>
|
||||||
|
<span class="nx">passedParams</span><span class="p">.</span><span class="nx">push</span> <span class="nx">param</span><span class="p">.</span><span class="nx">value</span>
|
||||||
|
<span class="k">delete</span> <span class="nx">param</span><span class="p">.</span><span class="nx">value</span>
|
||||||
|
<span class="k">else</span>
|
||||||
|
<span class="nx">passedParams</span><span class="p">.</span><span class="nx">push</span> <span class="nx">param</span>
|
||||||
|
<span class="nv">call = </span><span class="k">new</span> <span class="nx">Call</span> <span class="nx">exp</span><span class="p">,</span> <span class="nx">passedParams</span>
|
||||||
|
<span class="nv">call.do = </span><span class="kc">yes</span>
|
||||||
|
<span class="nx">call</span>
|
||||||
|
|
||||||
|
<span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
||||||
|
<span class="nv">isChain = </span><span class="nx">@isChainable</span><span class="p">()</span> <span class="o">and</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">isChainable</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-124"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-124">¶</a> </div> <p>In chains, there's no need to wrap bare obj literals in parens,
|
||||||
as the chained expression is wrapped.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@first.front = </span><span class="nx">@front</span> <span class="nx">unless</span> <span class="nx">isChain</span>
|
as the chained expression is wrapped.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@first.front = </span><span class="nx">@front</span> <span class="nx">unless</span> <span class="nx">isChain</span>
|
||||||
|
<span class="k">if</span> <span class="nx">@operator</span> <span class="o">is</span> <span class="s1">'delete'</span> <span class="o">and</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">check</span><span class="p">(</span><span class="nx">@first</span><span class="p">.</span><span class="nx">unwrapAll</span><span class="p">().</span><span class="nx">value</span><span class="p">)</span>
|
||||||
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s1">'delete operand may not be argument or var'</span>
|
||||||
|
<span class="k">if</span> <span class="nx">@operator</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'--'</span><span class="p">,</span> <span class="s1">'++'</span><span class="p">]</span> <span class="o">and</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">unwrapAll</span><span class="p">().</span><span class="nx">value</span> <span class="k">in</span> <span class="nx">STRICT_PROSCRIBED</span>
|
||||||
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s1">'prefix increment/decrement may not have eval or arguments operand'</span>
|
||||||
<span class="k">return</span> <span class="nx">@compileUnary</span> <span class="nx">o</span> <span class="k">if</span> <span class="nx">@isUnary</span><span class="p">()</span>
|
<span class="k">return</span> <span class="nx">@compileUnary</span> <span class="nx">o</span> <span class="k">if</span> <span class="nx">@isUnary</span><span class="p">()</span>
|
||||||
<span class="k">return</span> <span class="nx">@compileChain</span> <span class="nx">o</span> <span class="k">if</span> <span class="nx">isChain</span>
|
<span class="k">return</span> <span class="nx">@compileChain</span> <span class="nx">o</span> <span class="k">if</span> <span class="nx">isChain</span>
|
||||||
<span class="k">return</span> <span class="nx">@compileExistence</span> <span class="nx">o</span> <span class="k">if</span> <span class="nx">@operator</span> <span class="o">is</span> <span class="s1">'?'</span>
|
<span class="k">return</span> <span class="nx">@compileExistence</span> <span class="nx">o</span> <span class="k">if</span> <span class="nx">@operator</span> <span class="o">is</span> <span class="s1">'?'</span>
|
||||||
<span class="nv">code = </span><span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_OP</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">@operator</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span>
|
<span class="nv">code = </span><span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_OP</span><span class="p">)</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">@operator</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span>
|
||||||
<span class="nx">@second</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_OP</span><span class="p">)</span>
|
<span class="nx">@second</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_OP</span><span class="p">)</span>
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><=</span> <span class="nx">LEVEL_OP</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span></pre></div> </td> </tr> <tr id="section-115"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-115">¶</a> </div> <p>Mimic Python's chained comparisons when multiple comparison operators are
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><=</span> <span class="nx">LEVEL_OP</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span></pre></div> </td> </tr> <tr id="section-125"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-125">¶</a> </div> <p>Mimic Python's chained comparisons when multiple comparison operators are
|
||||||
used sequentially. For example:</p>
|
used sequentially. For example:</p>
|
||||||
|
|
||||||
<pre><code>bin/coffee -e 'console.log 50 < 65 > 10'
|
<pre><code>bin/coffee -e 'console.log 50 < 65 > 10'
|
||||||
|
@ -1079,19 +1180,21 @@ true
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nv">fst = </span><span class="nx">@first</span>
|
<span class="nv">fst = </span><span class="nx">@first</span>
|
||||||
<span class="nv">ref = </span><span class="nx">fst</span>
|
<span class="nv">ref = </span><span class="nx">fst</span>
|
||||||
<span class="k">new</span> <span class="nx">If</span><span class="p">(</span><span class="k">new</span> <span class="nx">Existence</span><span class="p">(</span><span class="nx">fst</span><span class="p">),</span> <span class="nx">ref</span><span class="p">,</span> <span class="nv">type: </span><span class="s1">'if'</span><span class="p">).</span><span class="nx">addElse</span><span class="p">(</span><span class="nx">@second</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-116"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-116">¶</a> </div> <p>Compile a unary <strong>Op</strong>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileUnary: </span><span class="nf">(o) -></span>
|
<span class="k">new</span> <span class="nx">If</span><span class="p">(</span><span class="k">new</span> <span class="nx">Existence</span><span class="p">(</span><span class="nx">fst</span><span class="p">),</span> <span class="nx">ref</span><span class="p">,</span> <span class="nv">type: </span><span class="s1">'if'</span><span class="p">).</span><span class="nx">addElse</span><span class="p">(</span><span class="nx">@second</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span></pre></div> </td> </tr> <tr id="section-126"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-126">¶</a> </div> <p>Compile a unary <strong>Op</strong>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileUnary: </span><span class="nf">(o) -></span>
|
||||||
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">>=</span> <span class="nx">LEVEL_ACCESS</span>
|
||||||
|
<span class="k">return</span> <span class="p">(</span><span class="k">new</span> <span class="nx">Parens</span> <span class="k">this</span><span class="p">).</span><span class="nx">compile</span> <span class="nx">o</span>
|
||||||
<span class="nv">parts = </span><span class="p">[</span><span class="nv">op = </span><span class="nx">@operator</span><span class="p">]</span>
|
<span class="nv">parts = </span><span class="p">[</span><span class="nv">op = </span><span class="nx">@operator</span><span class="p">]</span>
|
||||||
<span class="nv">plusMinus = </span><span class="nx">op</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'+'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">]</span>
|
<span class="nv">plusMinus = </span><span class="nx">op</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'+'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">]</span>
|
||||||
<span class="nx">parts</span><span class="p">.</span><span class="nx">push</span> <span class="s1">' '</span> <span class="k">if</span> <span class="nx">op</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'new'</span><span class="p">,</span> <span class="s1">'typeof'</span><span class="p">,</span> <span class="s1">'delete'</span><span class="p">]</span> <span class="o">or</span>
|
<span class="nx">parts</span><span class="p">.</span><span class="nx">push</span> <span class="s1">' '</span> <span class="k">if</span> <span class="nx">op</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'new'</span><span class="p">,</span> <span class="s1">'typeof'</span><span class="p">,</span> <span class="s1">'delete'</span><span class="p">]</span> <span class="o">or</span>
|
||||||
<span class="nx">plusMinus</span> <span class="o">and</span> <span class="nx">@first</span> <span class="k">instanceof</span> <span class="nx">Op</span> <span class="o">and</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">operator</span> <span class="o">is</span> <span class="nx">op</span>
|
<span class="nx">plusMinus</span> <span class="o">and</span> <span class="nx">@first</span> <span class="k">instanceof</span> <span class="nx">Op</span> <span class="o">and</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">operator</span> <span class="o">is</span> <span class="nx">op</span>
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">plusMinus</span> <span class="o">&&</span> <span class="nx">@first</span> <span class="k">instanceof</span> <span class="nx">Op</span><span class="p">)</span> <span class="o">or</span> <span class="p">(</span><span class="nx">op</span> <span class="o">is</span> <span class="s1">'new'</span> <span class="o">and</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">isStatement</span> <span class="nx">o</span><span class="p">)</span>
|
<span class="k">if</span> <span class="p">(</span><span class="nx">plusMinus</span> <span class="o">&&</span> <span class="nx">@first</span> <span class="k">instanceof</span> <span class="nx">Op</span><span class="p">)</span> <span class="o">or</span> <span class="p">(</span><span class="nx">op</span> <span class="o">is</span> <span class="s1">'new'</span> <span class="o">and</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">isStatement</span> <span class="nx">o</span><span class="p">)</span>
|
||||||
<span class="vi">@first = </span><span class="k">new</span> <span class="nx">Parens</span> <span class="nx">@first</span>
|
<span class="vi">@first = </span><span class="k">new</span> <span class="nx">Parens</span> <span class="nx">@first</span>
|
||||||
<span class="nx">parts</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_OP</span>
|
<span class="nx">parts</span><span class="p">.</span><span class="nx">push</span> <span class="nx">@first</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_OP</span>
|
||||||
<span class="nx">parts</span><span class="p">.</span><span class="nx">reverse</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@flip</span>
|
<span class="nx">parts</span><span class="p">.</span><span class="nx">reverse</span><span class="p">()</span> <span class="k">if</span> <span class="nx">@flip</span>
|
||||||
<span class="nx">parts</span><span class="p">.</span><span class="nx">join</span> <span class="s1">''</span>
|
<span class="nx">parts</span><span class="p">.</span><span class="nx">join</span> <span class="s1">''</span>
|
||||||
|
|
||||||
<span class="nv">toString: </span><span class="nf">(idt) -></span>
|
<span class="nv">toString: </span><span class="nf">(idt) -></span>
|
||||||
<span class="k">super</span> <span class="nx">idt</span><span class="p">,</span> <span class="nx">@constructor</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">@operator</span></pre></div> </td> </tr> <tr id="section-117"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-117">¶</a> </div> <h3>In</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.In = </span><span class="k">class</span> <span class="nx">In</span> <span class="k">extends</span> <span class="nx">Base</span>
|
<span class="k">super</span> <span class="nx">idt</span><span class="p">,</span> <span class="nx">@constructor</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">@operator</span></pre></div> </td> </tr> <tr id="section-127"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-127">¶</a> </div> <h3>In</h3> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.In = </span><span class="k">class</span> <span class="nx">In</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(@object, @array) -></span>
|
<span class="nv">constructor: </span><span class="nf">(@object, @array) -></span>
|
||||||
|
|
||||||
<span class="nv">children: </span><span class="p">[</span><span class="s1">'object'</span><span class="p">,</span> <span class="s1">'array'</span><span class="p">]</span>
|
<span class="nv">children: </span><span class="p">[</span><span class="s1">'object'</span><span class="p">,</span> <span class="s1">'array'</span><span class="p">]</span>
|
||||||
|
@ -1102,7 +1205,7 @@ true
|
||||||
<span class="k">if</span> <span class="nx">@array</span> <span class="k">instanceof</span> <span class="nx">Value</span> <span class="o">and</span> <span class="nx">@array</span><span class="p">.</span><span class="nx">isArray</span><span class="p">()</span>
|
<span class="k">if</span> <span class="nx">@array</span> <span class="k">instanceof</span> <span class="nx">Value</span> <span class="o">and</span> <span class="nx">@array</span><span class="p">.</span><span class="nx">isArray</span><span class="p">()</span>
|
||||||
<span class="k">for</span> <span class="nx">obj</span> <span class="k">in</span> <span class="nx">@array</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">objects</span> <span class="k">when</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">Splat</span>
|
<span class="k">for</span> <span class="nx">obj</span> <span class="k">in</span> <span class="nx">@array</span><span class="p">.</span><span class="nx">base</span><span class="p">.</span><span class="nx">objects</span> <span class="k">when</span> <span class="nx">obj</span> <span class="k">instanceof</span> <span class="nx">Splat</span>
|
||||||
<span class="nv">hasSplat = </span><span class="kc">yes</span>
|
<span class="nv">hasSplat = </span><span class="kc">yes</span>
|
||||||
<span class="k">break</span></pre></div> </td> </tr> <tr id="section-118"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-118">¶</a> </div> <p><code>compileOrTest</code> only if we have an array literal with no splats</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">return</span> <span class="nx">@compileOrTest</span> <span class="nx">o</span> <span class="nx">unless</span> <span class="nx">hasSplat</span>
|
<span class="k">break</span></pre></div> </td> </tr> <tr id="section-128"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-128">¶</a> </div> <p><code>compileOrTest</code> only if we have an array literal with no splats</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">return</span> <span class="nx">@compileOrTest</span> <span class="nx">o</span> <span class="nx">unless</span> <span class="nx">hasSplat</span>
|
||||||
<span class="nx">@compileLoopTest</span> <span class="nx">o</span>
|
<span class="nx">@compileLoopTest</span> <span class="nx">o</span>
|
||||||
|
|
||||||
<span class="nv">compileOrTest: </span><span class="nf">(o) -></span>
|
<span class="nv">compileOrTest: </span><span class="nf">(o) -></span>
|
||||||
|
@ -1123,7 +1226,7 @@ true
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><</span> <span class="nx">LEVEL_LIST</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span>
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><</span> <span class="nx">LEVEL_LIST</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span>
|
||||||
|
|
||||||
<span class="nv">toString: </span><span class="nf">(idt) -></span>
|
<span class="nv">toString: </span><span class="nf">(idt) -></span>
|
||||||
<span class="k">super</span> <span class="nx">idt</span><span class="p">,</span> <span class="nx">@constructor</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">@negated</span> <span class="k">then</span> <span class="s1">'!'</span> <span class="k">else</span> <span class="s1">''</span></pre></div> </td> </tr> <tr id="section-119"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-119">¶</a> </div> <h3>Try</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-120"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-120">¶</a> </div> <p>A classic <em>try/catch/finally</em> block.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Try = </span><span class="k">class</span> <span class="nx">Try</span> <span class="k">extends</span> <span class="nx">Base</span>
|
<span class="k">super</span> <span class="nx">idt</span><span class="p">,</span> <span class="nx">@constructor</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">@negated</span> <span class="k">then</span> <span class="s1">'!'</span> <span class="k">else</span> <span class="s1">''</span></pre></div> </td> </tr> <tr id="section-129"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-129">¶</a> </div> <h3>Try</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-130"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-130">¶</a> </div> <p>A classic <em>try/catch/finally</em> block.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Try = </span><span class="k">class</span> <span class="nx">Try</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(@attempt, @error, @recovery, @ensure) -></span>
|
<span class="nv">constructor: </span><span class="nf">(@attempt, @error, @recovery, @ensure) -></span>
|
||||||
|
|
||||||
<span class="nv">children: </span><span class="p">[</span><span class="s1">'attempt'</span><span class="p">,</span> <span class="s1">'recovery'</span><span class="p">,</span> <span class="s1">'ensure'</span><span class="p">]</span>
|
<span class="nv">children: </span><span class="p">[</span><span class="s1">'attempt'</span><span class="p">,</span> <span class="s1">'recovery'</span><span class="p">,</span> <span class="s1">'ensure'</span><span class="p">]</span>
|
||||||
|
@ -1135,32 +1238,34 @@ true
|
||||||
<span class="nv">makeReturn: </span><span class="nf">(res) -></span>
|
<span class="nv">makeReturn: </span><span class="nf">(res) -></span>
|
||||||
<span class="vi">@attempt = </span><span class="nx">@attempt</span> <span class="p">.</span><span class="nx">makeReturn</span> <span class="nx">res</span> <span class="k">if</span> <span class="nx">@attempt</span>
|
<span class="vi">@attempt = </span><span class="nx">@attempt</span> <span class="p">.</span><span class="nx">makeReturn</span> <span class="nx">res</span> <span class="k">if</span> <span class="nx">@attempt</span>
|
||||||
<span class="vi">@recovery = </span><span class="nx">@recovery</span><span class="p">.</span><span class="nx">makeReturn</span> <span class="nx">res</span> <span class="k">if</span> <span class="nx">@recovery</span>
|
<span class="vi">@recovery = </span><span class="nx">@recovery</span><span class="p">.</span><span class="nx">makeReturn</span> <span class="nx">res</span> <span class="k">if</span> <span class="nx">@recovery</span>
|
||||||
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-121"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-121">¶</a> </div> <p>Compilation is more or less as you would expect -- the <em>finally</em> clause
|
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-131"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-131">¶</a> </div> <p>Compilation is more or less as you would expect -- the <em>finally</em> clause
|
||||||
is optional, the <em>catch</em> is not.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
is optional, the <em>catch</em> is not.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
||||||
<span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+=</span> <span class="nx">TAB</span>
|
<span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+=</span> <span class="nx">TAB</span>
|
||||||
<span class="nv">errorPart = </span><span class="k">if</span> <span class="nx">@error</span> <span class="k">then</span> <span class="s2">" (#{ @error.compile o }) "</span> <span class="k">else</span> <span class="s1">' '</span>
|
<span class="nv">errorPart = </span><span class="k">if</span> <span class="nx">@error</span> <span class="k">then</span> <span class="s2">" (#{ @error.compile o }) "</span> <span class="k">else</span> <span class="s1">' '</span>
|
||||||
<span class="nv">tryPart = </span><span class="nx">@attempt</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_TOP</span>
|
<span class="nv">tryPart = </span><span class="nx">@attempt</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_TOP</span>
|
||||||
|
|
||||||
<span class="nv">catchPart = </span><span class="k">if</span> <span class="nx">@recovery</span>
|
<span class="nv">catchPart = </span><span class="k">if</span> <span class="nx">@recovery</span>
|
||||||
|
<span class="k">if</span> <span class="nx">@error</span><span class="p">.</span><span class="nx">value</span> <span class="k">in</span> <span class="nx">STRICT_PROSCRIBED</span>
|
||||||
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s2">"catch variable may not be \"#{@error.value}\""</span>
|
||||||
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">add</span> <span class="nx">@error</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span> <span class="s1">'param'</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">check</span> <span class="nx">@error</span><span class="p">.</span><span class="nx">value</span>
|
<span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">add</span> <span class="nx">@error</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span> <span class="s1">'param'</span> <span class="nx">unless</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">check</span> <span class="nx">@error</span><span class="p">.</span><span class="nx">value</span>
|
||||||
<span class="s2">" catch#{errorPart}{\n#{ @recovery.compile o, LEVEL_TOP }\n#{@tab}}"</span>
|
<span class="s2">" catch#{errorPart}{\n#{ @recovery.compile o, LEVEL_TOP }\n#{@tab}}"</span>
|
||||||
<span class="k">else</span> <span class="nx">unless</span> <span class="nx">@ensure</span> <span class="o">or</span> <span class="nx">@recovery</span>
|
<span class="k">else</span> <span class="nx">unless</span> <span class="nx">@ensure</span> <span class="o">or</span> <span class="nx">@recovery</span>
|
||||||
<span class="s1">' catch (_error) {}'</span>
|
<span class="s1">' catch (_error) {}'</span>
|
||||||
|
|
||||||
<span class="nv">ensurePart = </span><span class="k">if</span> <span class="nx">@ensure</span> <span class="k">then</span> <span class="s2">" finally {\n#{ @ensure.compile o, LEVEL_TOP }\n#{@tab}}"</span> <span class="k">else</span> <span class="s1">''</span>
|
<span class="nv">ensurePart = </span><span class="k">if</span> <span class="nx">@ensure</span> <span class="k">then</span> <span class="s2">" finally {\n#{ @ensure.compile o, LEVEL_TOP }\n#{@tab}}"</span> <span class="k">else</span> <span class="s1">''</span>
|
||||||
|
|
||||||
<span class="s2">"""#{@tab}try {</span>
|
<span class="s2">"""#{@tab}try {</span>
|
||||||
<span class="s2"> #{tryPart}</span>
|
<span class="s2"> #{tryPart}</span>
|
||||||
<span class="s2"> #{@tab}}#{ catchPart or '' }#{ensurePart}"""</span></pre></div> </td> </tr> <tr id="section-122"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-122">¶</a> </div> <h3>Throw</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-123"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-123">¶</a> </div> <p>Simple node to throw an exception.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Throw = </span><span class="k">class</span> <span class="nx">Throw</span> <span class="k">extends</span> <span class="nx">Base</span>
|
<span class="s2"> #{@tab}}#{ catchPart or '' }#{ensurePart}"""</span></pre></div> </td> </tr> <tr id="section-132"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-132">¶</a> </div> <h3>Throw</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-133"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-133">¶</a> </div> <p>Simple node to throw an exception.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Throw = </span><span class="k">class</span> <span class="nx">Throw</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(@expression) -></span>
|
<span class="nv">constructor: </span><span class="nf">(@expression) -></span>
|
||||||
|
|
||||||
<span class="nv">children: </span><span class="p">[</span><span class="s1">'expression'</span><span class="p">]</span>
|
<span class="nv">children: </span><span class="p">[</span><span class="s1">'expression'</span><span class="p">]</span>
|
||||||
|
|
||||||
<span class="nv">isStatement: </span><span class="nx">YES</span>
|
<span class="nv">isStatement: </span><span class="nx">YES</span>
|
||||||
<span class="nv">jumps: </span> <span class="nx">NO</span></pre></div> </td> </tr> <tr id="section-124"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-124">¶</a> </div> <p>A <strong>Throw</strong> is already a return, of sorts...</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">makeReturn: </span><span class="nx">THIS</span>
|
<span class="nv">jumps: </span> <span class="nx">NO</span></pre></div> </td> </tr> <tr id="section-134"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-134">¶</a> </div> <p>A <strong>Throw</strong> is already a return, of sorts...</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">makeReturn: </span><span class="nx">THIS</span>
|
||||||
|
|
||||||
<span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
<span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
||||||
<span class="nx">@tab</span> <span class="o">+</span> <span class="s2">"throw #{ @expression.compile o };"</span></pre></div> </td> </tr> <tr id="section-125"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-125">¶</a> </div> <h3>Existence</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-126"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-126">¶</a> </div> <p>Checks a variable for existence -- not <em>null</em> and not <em>undefined</em>. This is
|
<span class="nx">@tab</span> <span class="o">+</span> <span class="s2">"throw #{ @expression.compile o };"</span></pre></div> </td> </tr> <tr id="section-135"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-135">¶</a> </div> <h3>Existence</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-136"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-136">¶</a> </div> <p>Checks a variable for existence -- not <em>null</em> and not <em>undefined</em>. This is
|
||||||
similar to <code>.nil?</code> in Ruby, and avoids having to consult a JavaScript truth
|
similar to <code>.nil?</code> in Ruby, and avoids having to consult a JavaScript truth
|
||||||
table.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Existence = </span><span class="k">class</span> <span class="nx">Existence</span> <span class="k">extends</span> <span class="nx">Base</span>
|
table.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Existence = </span><span class="k">class</span> <span class="nx">Existence</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(@expression) -></span>
|
<span class="nv">constructor: </span><span class="nf">(@expression) -></span>
|
||||||
|
@ -1175,8 +1280,8 @@ table.</p> </td> <td class="code"> <div cl
|
||||||
<span class="k">if</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">check</span> <span class="nx">code</span>
|
<span class="k">if</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">o</span><span class="p">.</span><span class="nx">scope</span><span class="p">.</span><span class="nx">check</span> <span class="nx">code</span>
|
||||||
<span class="p">[</span><span class="nx">cmp</span><span class="p">,</span> <span class="nx">cnj</span><span class="p">]</span> <span class="o">=</span> <span class="k">if</span> <span class="nx">@negated</span> <span class="k">then</span> <span class="p">[</span><span class="s1">'==='</span><span class="p">,</span> <span class="s1">'||'</span><span class="p">]</span> <span class="k">else</span> <span class="p">[</span><span class="s1">'!=='</span><span class="p">,</span> <span class="s1">'&&'</span><span class="p">]</span>
|
<span class="p">[</span><span class="nx">cmp</span><span class="p">,</span> <span class="nx">cnj</span><span class="p">]</span> <span class="o">=</span> <span class="k">if</span> <span class="nx">@negated</span> <span class="k">then</span> <span class="p">[</span><span class="s1">'==='</span><span class="p">,</span> <span class="s1">'||'</span><span class="p">]</span> <span class="k">else</span> <span class="p">[</span><span class="s1">'!=='</span><span class="p">,</span> <span class="s1">'&&'</span><span class="p">]</span>
|
||||||
<span class="nv">code = </span><span class="s2">"typeof #{code} #{cmp} \"undefined\" #{cnj} #{code} #{cmp} null"</span>
|
<span class="nv">code = </span><span class="s2">"typeof #{code} #{cmp} \"undefined\" #{cnj} #{code} #{cmp} null"</span>
|
||||||
<span class="k">else</span></pre></div> </td> </tr> <tr id="section-127"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-127">¶</a> </div> <p>do not use strict equality here; it will break existing code</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">code = </span><span class="s2">"#{code} #{if @negated then '==' else '!='} null"</span>
|
<span class="k">else</span></pre></div> </td> </tr> <tr id="section-137"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-137">¶</a> </div> <p>do not use strict equality here; it will break existing code</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">code = </span><span class="s2">"#{code} #{if @negated then '==' else '!='} null"</span>
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><=</span> <span class="nx">LEVEL_COND</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span></pre></div> </td> </tr> <tr id="section-128"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-128">¶</a> </div> <h3>Parens</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-129"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-129">¶</a> </div> <p>An extra set of parentheses, specified explicitly in the source. At one time
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><=</span> <span class="nx">LEVEL_COND</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span></pre></div> </td> </tr> <tr id="section-138"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-138">¶</a> </div> <h3>Parens</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-139"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-139">¶</a> </div> <p>An extra set of parentheses, specified explicitly in the source. At one time
|
||||||
we tried to clean up the results by detecting and removing redundant
|
we tried to clean up the results by detecting and removing redundant
|
||||||
parentheses, but no longer -- you can put in as many as you please.</p>
|
parentheses, but no longer -- you can put in as many as you please.</p>
|
||||||
|
|
||||||
|
@ -1196,7 +1301,7 @@ parentheses, but no longer -- you can put in as many as you please.</p>
|
||||||
<span class="nv">code = </span><span class="nx">expr</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_PAREN</span>
|
<span class="nv">code = </span><span class="nx">expr</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_PAREN</span>
|
||||||
<span class="nv">bare = </span><span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><</span> <span class="nx">LEVEL_OP</span> <span class="o">and</span> <span class="p">(</span><span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">Op</span> <span class="o">or</span> <span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">Call</span> <span class="o">or</span>
|
<span class="nv">bare = </span><span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o"><</span> <span class="nx">LEVEL_OP</span> <span class="o">and</span> <span class="p">(</span><span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">Op</span> <span class="o">or</span> <span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">Call</span> <span class="o">or</span>
|
||||||
<span class="p">(</span><span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">For</span> <span class="o">and</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">returns</span><span class="p">))</span>
|
<span class="p">(</span><span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">For</span> <span class="o">and</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">returns</span><span class="p">))</span>
|
||||||
<span class="k">if</span> <span class="nx">bare</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span></pre></div> </td> </tr> <tr id="section-130"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-130">¶</a> </div> <h3>For</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-131"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-131">¶</a> </div> <p>CoffeeScript's replacement for the <em>for</em> loop is our array and object
|
<span class="k">if</span> <span class="nx">bare</span> <span class="k">then</span> <span class="nx">code</span> <span class="k">else</span> <span class="s2">"(#{code})"</span></pre></div> </td> </tr> <tr id="section-140"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-140">¶</a> </div> <h3>For</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-141"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-141">¶</a> </div> <p>CoffeeScript's replacement for the <em>for</em> loop is our array and object
|
||||||
comprehensions, that compile into <em>for</em> loops here. They also act as an
|
comprehensions, that compile into <em>for</em> loops here. They also act as an
|
||||||
expression, able to return the result of each filtered iteration.</p>
|
expression, able to return the result of each filtered iteration.</p>
|
||||||
|
|
||||||
|
@ -1216,7 +1321,7 @@ you can map and filter in a single pass.</p> </td> <td c
|
||||||
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s1">'cannot pattern match over range loops'</span> <span class="k">if</span> <span class="nx">@range</span> <span class="o">and</span> <span class="nx">@pattern</span>
|
<span class="k">throw</span> <span class="nx">SyntaxError</span> <span class="s1">'cannot pattern match over range loops'</span> <span class="k">if</span> <span class="nx">@range</span> <span class="o">and</span> <span class="nx">@pattern</span>
|
||||||
<span class="vi">@returns = </span><span class="kc">false</span>
|
<span class="vi">@returns = </span><span class="kc">false</span>
|
||||||
|
|
||||||
<span class="nv">children: </span><span class="p">[</span><span class="s1">'body'</span><span class="p">,</span> <span class="s1">'source'</span><span class="p">,</span> <span class="s1">'guard'</span><span class="p">,</span> <span class="s1">'step'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-132"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-132">¶</a> </div> <p>Welcome to the hairiest method in all of CoffeeScript. Handles the inner
|
<span class="nv">children: </span><span class="p">[</span><span class="s1">'body'</span><span class="p">,</span> <span class="s1">'source'</span><span class="p">,</span> <span class="s1">'guard'</span><span class="p">,</span> <span class="s1">'step'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-142"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-142">¶</a> </div> <p>Welcome to the hairiest method in all of CoffeeScript. Handles the inner
|
||||||
loop, filtering, stepping, and result saving for array, object, and range
|
loop, filtering, stepping, and result saving for array, object, and range
|
||||||
comprehensions. Some of the generated code can be shared in common, and
|
comprehensions. Some of the generated code can be shared in common, and
|
||||||
some cannot.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
some cannot.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileNode: </span><span class="nf">(o) -></span>
|
||||||
|
@ -1230,25 +1335,28 @@ some cannot.</p> </td> <td class="code"> <
|
||||||
<span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nv">immediate: </span><span class="kc">yes</span><span class="p">)</span> <span class="k">if</span> <span class="nx">name</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@pattern</span>
|
<span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nv">immediate: </span><span class="kc">yes</span><span class="p">)</span> <span class="k">if</span> <span class="nx">name</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@pattern</span>
|
||||||
<span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nv">immediate: </span><span class="kc">yes</span><span class="p">)</span> <span class="k">if</span> <span class="nx">index</span>
|
<span class="nx">scope</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nv">immediate: </span><span class="kc">yes</span><span class="p">)</span> <span class="k">if</span> <span class="nx">index</span>
|
||||||
<span class="nv">rvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'results'</span> <span class="k">if</span> <span class="nx">@returns</span>
|
<span class="nv">rvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'results'</span> <span class="k">if</span> <span class="nx">@returns</span>
|
||||||
<span class="nv">ivar = </span><span class="p">(</span><span class="k">if</span> <span class="nx">@range</span> <span class="k">then</span> <span class="nx">name</span> <span class="k">else</span> <span class="nx">index</span><span class="p">)</span> <span class="o">or</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'i'</span></pre></div> </td> </tr> <tr id="section-133"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-133">¶</a> </div> <p>the <code>_by</code> variable is created twice in <code>Range</code>s if we don't prevent it from being declared here</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">stepvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s2">"step"</span> <span class="k">if</span> <span class="nx">@step</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@range</span>
|
<span class="nv">ivar = </span><span class="p">(</span><span class="nx">@object</span> <span class="o">and</span> <span class="nx">index</span><span class="p">)</span> <span class="o">or</span> <span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'i'</span>
|
||||||
|
<span class="nv">kvar = </span><span class="p">(</span><span class="nx">@range</span> <span class="o">and</span> <span class="nx">name</span><span class="p">)</span> <span class="o">or</span> <span class="nx">index</span> <span class="o">or</span> <span class="nx">ivar</span>
|
||||||
|
<span class="nv">kvarAssign = </span><span class="k">if</span> <span class="nx">kvar</span> <span class="o">isnt</span> <span class="nx">ivar</span> <span class="k">then</span> <span class="s2">"#{kvar} = "</span> <span class="k">else</span> <span class="s2">""</span></pre></div> </td> </tr> <tr id="section-143"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-143">¶</a> </div> <p>the <code>_by</code> variable is created twice in <code>Range</code>s if we don't prevent it from being declared here</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">stepvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s2">"step"</span> <span class="k">if</span> <span class="nx">@step</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@range</span>
|
||||||
<span class="nv">name = </span><span class="nx">ivar</span> <span class="k">if</span> <span class="nx">@pattern</span>
|
<span class="nv">name = </span><span class="nx">ivar</span> <span class="k">if</span> <span class="nx">@pattern</span>
|
||||||
<span class="nv">varPart = </span><span class="s1">''</span>
|
<span class="nv">varPart = </span><span class="s1">''</span>
|
||||||
<span class="nv">guardPart = </span><span class="s1">''</span>
|
<span class="nv">guardPart = </span><span class="s1">''</span>
|
||||||
<span class="nv">defPart = </span><span class="s1">''</span>
|
<span class="nv">defPart = </span><span class="s1">''</span>
|
||||||
<span class="nv">idt1 = </span><span class="nx">@tab</span> <span class="o">+</span> <span class="nx">TAB</span>
|
<span class="nv">idt1 = </span><span class="nx">@tab</span> <span class="o">+</span> <span class="nx">TAB</span>
|
||||||
<span class="k">if</span> <span class="nx">@range</span>
|
<span class="k">if</span> <span class="nx">@range</span>
|
||||||
<span class="nv">forPart = </span><span class="nx">source</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="p">{</span><span class="nv">index: </span><span class="nx">ivar</span><span class="p">,</span> <span class="nx">@step</span><span class="p">})</span>
|
<span class="nv">forPart = </span><span class="nx">source</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="p">{</span><span class="nv">index: </span><span class="nx">ivar</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">@step</span><span class="p">})</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nv">svar = </span><span class="nx">@source</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
<span class="nv">svar = </span><span class="nx">@source</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">name</span> <span class="o">or</span> <span class="nx">@own</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span> <span class="nx">svar</span>
|
<span class="k">if</span> <span class="p">(</span><span class="nx">name</span> <span class="o">or</span> <span class="nx">@own</span><span class="p">)</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">IDENTIFIER</span><span class="p">.</span><span class="nx">test</span> <span class="nx">svar</span>
|
||||||
<span class="nv">defPart = </span><span class="s2">"#{@tab}#{ref = scope.freeVariable 'ref'} = #{svar};\n"</span>
|
<span class="nv">defPart = </span><span class="s2">"#{@tab}#{ref = scope.freeVariable 'ref'} = #{svar};\n"</span>
|
||||||
<span class="nv">svar = </span><span class="nx">ref</span>
|
<span class="nv">svar = </span><span class="nx">ref</span>
|
||||||
<span class="k">if</span> <span class="nx">name</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@pattern</span>
|
<span class="k">if</span> <span class="nx">name</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">@pattern</span>
|
||||||
<span class="nv">namePart = </span><span class="s2">"#{name} = #{svar}[#{ivar}]"</span>
|
<span class="nv">namePart = </span><span class="s2">"#{name} = #{svar}[#{kvar}]"</span>
|
||||||
<span class="nx">unless</span> <span class="nx">@object</span>
|
<span class="nx">unless</span> <span class="nx">@object</span>
|
||||||
<span class="nv">lvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'len'</span>
|
<span class="nv">lvar = </span><span class="nx">scope</span><span class="p">.</span><span class="nx">freeVariable</span> <span class="s1">'len'</span>
|
||||||
<span class="nv">forVarPart = </span><span class="s2">"#{ivar} = 0, #{lvar} = #{svar}.length"</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">@step</span> <span class="k">then</span> <span class="s2">", #{stepvar} = #{@step.compile(o, LEVEL_OP)}"</span> <span class="k">else</span> <span class="s1">''</span>
|
<span class="nv">forVarPart = </span><span class="s2">"#{kvarAssign}#{ivar} = 0, #{lvar} = #{svar}.length"</span>
|
||||||
<span class="nv">stepPart = </span><span class="k">if</span> <span class="nx">@step</span> <span class="k">then</span> <span class="s2">"#{ivar} += #{stepvar}"</span> <span class="k">else</span> <span class="s2">"#{ivar}++"</span>
|
<span class="nx">forVarPart</span> <span class="o">+=</span> <span class="s2">", #{stepvar} = #{@step.compile o, LEVEL_OP}"</span> <span class="k">if</span> <span class="nx">@step</span>
|
||||||
|
<span class="nv">stepPart = </span><span class="s2">"#{kvarAssign}#{if @step then "</span><span class="c1">#{ivar} += #{stepvar}" else (if kvar isnt ivar then "++#{ivar}" else "#{ivar}++")}"</span>
|
||||||
<span class="nv">forPart = </span><span class="s2">"#{forVarPart}; #{ivar} < #{lvar}; #{stepPart}"</span>
|
<span class="nv">forPart = </span><span class="s2">"#{forVarPart}; #{ivar} < #{lvar}; #{stepPart}"</span>
|
||||||
<span class="k">if</span> <span class="nx">@returns</span>
|
<span class="k">if</span> <span class="nx">@returns</span>
|
||||||
<span class="nv">resultPart = </span><span class="s2">"#{@tab}#{rvar} = [];\n"</span>
|
<span class="nv">resultPart = </span><span class="s2">"#{@tab}#{rvar} = [];\n"</span>
|
||||||
|
@ -1260,12 +1368,12 @@ some cannot.</p> </td> <td class="code"> <
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nv">body = </span><span class="nx">Block</span><span class="p">.</span><span class="nx">wrap</span> <span class="p">[</span><span class="k">new</span> <span class="nx">If</span> <span class="nx">@guard</span><span class="p">,</span> <span class="nx">body</span><span class="p">]</span> <span class="k">if</span> <span class="nx">@guard</span>
|
<span class="nv">body = </span><span class="nx">Block</span><span class="p">.</span><span class="nx">wrap</span> <span class="p">[</span><span class="k">new</span> <span class="nx">If</span> <span class="nx">@guard</span><span class="p">,</span> <span class="nx">body</span><span class="p">]</span> <span class="k">if</span> <span class="nx">@guard</span>
|
||||||
<span class="k">if</span> <span class="nx">@pattern</span>
|
<span class="k">if</span> <span class="nx">@pattern</span>
|
||||||
<span class="nx">body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="k">new</span> <span class="nx">Assign</span> <span class="nx">@name</span><span class="p">,</span> <span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"#{svar}[#{ivar}]"</span>
|
<span class="nx">body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">unshift</span> <span class="k">new</span> <span class="nx">Assign</span> <span class="nx">@name</span><span class="p">,</span> <span class="k">new</span> <span class="nx">Literal</span> <span class="s2">"#{svar}[#{kvar}]"</span>
|
||||||
<span class="nx">defPart</span> <span class="o">+=</span> <span class="nx">@pluckDirectCall</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">body</span>
|
<span class="nx">defPart</span> <span class="o">+=</span> <span class="nx">@pluckDirectCall</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">body</span>
|
||||||
<span class="nv">varPart = </span><span class="s2">"\n#{idt1}#{namePart};"</span> <span class="k">if</span> <span class="nx">namePart</span>
|
<span class="nv">varPart = </span><span class="s2">"\n#{idt1}#{namePart};"</span> <span class="k">if</span> <span class="nx">namePart</span>
|
||||||
<span class="k">if</span> <span class="nx">@object</span>
|
<span class="k">if</span> <span class="nx">@object</span>
|
||||||
<span class="nv">forPart = </span><span class="s2">"#{ivar} in #{svar}"</span>
|
<span class="nv">forPart = </span><span class="s2">"#{kvar} in #{svar}"</span>
|
||||||
<span class="nv">guardPart = </span><span class="s2">"\n#{idt1}if (!#{utility 'hasProp'}.call(#{svar}, #{ivar})) continue;"</span> <span class="k">if</span> <span class="nx">@own</span>
|
<span class="nv">guardPart = </span><span class="s2">"\n#{idt1}if (!#{utility 'hasProp'}.call(#{svar}, #{kvar})) continue;"</span> <span class="k">if</span> <span class="nx">@own</span>
|
||||||
<span class="nv">body = </span><span class="nx">body</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nv">indent: </span><span class="nx">idt1</span><span class="p">),</span> <span class="nx">LEVEL_TOP</span>
|
<span class="nv">body = </span><span class="nx">body</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">merge</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nv">indent: </span><span class="nx">idt1</span><span class="p">),</span> <span class="nx">LEVEL_TOP</span>
|
||||||
<span class="nv">body = </span><span class="s1">'\n'</span> <span class="o">+</span> <span class="nx">body</span> <span class="o">+</span> <span class="s1">'\n'</span> <span class="k">if</span> <span class="nx">body</span>
|
<span class="nv">body = </span><span class="s1">'\n'</span> <span class="o">+</span> <span class="nx">body</span> <span class="o">+</span> <span class="s1">'\n'</span> <span class="k">if</span> <span class="nx">body</span>
|
||||||
<span class="s2">"""</span>
|
<span class="s2">"""</span>
|
||||||
|
@ -1290,7 +1398,7 @@ some cannot.</p> </td> <td class="code"> <
|
||||||
<span class="p">[</span><span class="nx">val</span><span class="p">.</span><span class="nx">base</span><span class="p">,</span> <span class="nx">base</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">base</span><span class="p">,</span> <span class="nx">val</span><span class="p">]</span>
|
<span class="p">[</span><span class="nx">val</span><span class="p">.</span><span class="nx">base</span><span class="p">,</span> <span class="nx">base</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">base</span><span class="p">,</span> <span class="nx">val</span><span class="p">]</span>
|
||||||
<span class="nx">body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Call</span> <span class="nx">base</span><span class="p">,</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">args</span>
|
<span class="nx">body</span><span class="p">.</span><span class="nx">expressions</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Call</span> <span class="nx">base</span><span class="p">,</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">args</span>
|
||||||
<span class="nx">defs</span> <span class="o">+=</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="k">new</span> <span class="nx">Assign</span><span class="p">(</span><span class="nx">ref</span><span class="p">,</span> <span class="nx">fn</span><span class="p">).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_TOP</span><span class="p">)</span> <span class="o">+</span> <span class="s1">';\n'</span>
|
<span class="nx">defs</span> <span class="o">+=</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="k">new</span> <span class="nx">Assign</span><span class="p">(</span><span class="nx">ref</span><span class="p">,</span> <span class="nx">fn</span><span class="p">).</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_TOP</span><span class="p">)</span> <span class="o">+</span> <span class="s1">';\n'</span>
|
||||||
<span class="nx">defs</span></pre></div> </td> </tr> <tr id="section-134"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-134">¶</a> </div> <h3>Switch</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-135"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-135">¶</a> </div> <p>A JavaScript <em>switch</em> statement. Converts into a returnable expression on-demand.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Switch = </span><span class="k">class</span> <span class="nx">Switch</span> <span class="k">extends</span> <span class="nx">Base</span>
|
<span class="nx">defs</span></pre></div> </td> </tr> <tr id="section-144"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-144">¶</a> </div> <h3>Switch</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-145"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-145">¶</a> </div> <p>A JavaScript <em>switch</em> statement. Converts into a returnable expression on-demand.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Switch = </span><span class="k">class</span> <span class="nx">Switch</span> <span class="k">extends</span> <span class="nx">Base</span>
|
||||||
<span class="nv">constructor: </span><span class="nf">(@subject, @cases, @otherwise) -></span>
|
<span class="nv">constructor: </span><span class="nf">(@subject, @cases, @otherwise) -></span>
|
||||||
|
|
||||||
<span class="nv">children: </span><span class="p">[</span><span class="s1">'subject'</span><span class="p">,</span> <span class="s1">'cases'</span><span class="p">,</span> <span class="s1">'otherwise'</span><span class="p">]</span>
|
<span class="nv">children: </span><span class="p">[</span><span class="s1">'subject'</span><span class="p">,</span> <span class="s1">'cases'</span><span class="p">,</span> <span class="s1">'otherwise'</span><span class="p">]</span>
|
||||||
|
@ -1322,7 +1430,7 @@ some cannot.</p> </td> <td class="code"> <
|
||||||
<span class="k">continue</span> <span class="k">if</span> <span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">Return</span> <span class="o">or</span> <span class="p">(</span><span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">jumps</span><span class="p">()</span> <span class="o">and</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">value</span> <span class="o">isnt</span> <span class="s1">'debugger'</span><span class="p">)</span>
|
<span class="k">continue</span> <span class="k">if</span> <span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">Return</span> <span class="o">or</span> <span class="p">(</span><span class="nx">expr</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">jumps</span><span class="p">()</span> <span class="o">and</span> <span class="nx">expr</span><span class="p">.</span><span class="nx">value</span> <span class="o">isnt</span> <span class="s1">'debugger'</span><span class="p">)</span>
|
||||||
<span class="nx">code</span> <span class="o">+=</span> <span class="nx">idt2</span> <span class="o">+</span> <span class="s1">'break;\n'</span>
|
<span class="nx">code</span> <span class="o">+=</span> <span class="nx">idt2</span> <span class="o">+</span> <span class="s1">'break;\n'</span>
|
||||||
<span class="nx">code</span> <span class="o">+=</span> <span class="nx">idt1</span> <span class="o">+</span> <span class="s2">"default:\n#{ @otherwise.compile o, LEVEL_TOP }\n"</span> <span class="k">if</span> <span class="nx">@otherwise</span> <span class="o">and</span> <span class="nx">@otherwise</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">length</span>
|
<span class="nx">code</span> <span class="o">+=</span> <span class="nx">idt1</span> <span class="o">+</span> <span class="s2">"default:\n#{ @otherwise.compile o, LEVEL_TOP }\n"</span> <span class="k">if</span> <span class="nx">@otherwise</span> <span class="o">and</span> <span class="nx">@otherwise</span><span class="p">.</span><span class="nx">expressions</span><span class="p">.</span><span class="nx">length</span>
|
||||||
<span class="nx">code</span> <span class="o">+</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="s1">'}'</span></pre></div> </td> </tr> <tr id="section-136"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-136">¶</a> </div> <h3>If</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-137"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-137">¶</a> </div> <p><em>If/else</em> statements. Acts as an expression by pushing down requested returns
|
<span class="nx">code</span> <span class="o">+</span> <span class="nx">@tab</span> <span class="o">+</span> <span class="s1">'}'</span></pre></div> </td> </tr> <tr id="section-146"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-146">¶</a> </div> <h3>If</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-147"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-147">¶</a> </div> <p><em>If/else</em> statements. Acts as an expression by pushing down requested returns
|
||||||
to the last line of each clause.</p>
|
to the last line of each clause.</p>
|
||||||
|
|
||||||
<p>Single-expression <strong>Ifs</strong> are compiled into conditional operators if possible,
|
<p>Single-expression <strong>Ifs</strong> are compiled into conditional operators if possible,
|
||||||
|
@ -1336,13 +1444,13 @@ because ternaries are already proper expressions, and don't need conversion.</p>
|
||||||
<span class="nv">children: </span><span class="p">[</span><span class="s1">'condition'</span><span class="p">,</span> <span class="s1">'body'</span><span class="p">,</span> <span class="s1">'elseBody'</span><span class="p">]</span>
|
<span class="nv">children: </span><span class="p">[</span><span class="s1">'condition'</span><span class="p">,</span> <span class="s1">'body'</span><span class="p">,</span> <span class="s1">'elseBody'</span><span class="p">]</span>
|
||||||
|
|
||||||
<span class="nv">bodyNode: </span> <span class="o">-></span> <span class="nx">@body</span><span class="o">?</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">()</span>
|
<span class="nv">bodyNode: </span> <span class="o">-></span> <span class="nx">@body</span><span class="o">?</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">()</span>
|
||||||
<span class="nv">elseBodyNode: </span><span class="o">-></span> <span class="nx">@elseBody</span><span class="o">?</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-138"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-138">¶</a> </div> <p>Rewrite a chain of <strong>Ifs</strong> to add a default case as the final <em>else</em>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addElse: </span><span class="nf">(elseBody) -></span>
|
<span class="nv">elseBodyNode: </span><span class="o">-></span> <span class="nx">@elseBody</span><span class="o">?</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-148"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-148">¶</a> </div> <p>Rewrite a chain of <strong>Ifs</strong> to add a default case as the final <em>else</em>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addElse: </span><span class="nf">(elseBody) -></span>
|
||||||
<span class="k">if</span> <span class="nx">@isChain</span>
|
<span class="k">if</span> <span class="nx">@isChain</span>
|
||||||
<span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">addElse</span> <span class="nx">elseBody</span>
|
<span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">addElse</span> <span class="nx">elseBody</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="vi">@isChain = </span><span class="nx">elseBody</span> <span class="k">instanceof</span> <span class="nx">If</span>
|
<span class="vi">@isChain = </span><span class="nx">elseBody</span> <span class="k">instanceof</span> <span class="nx">If</span>
|
||||||
<span class="vi">@elseBody = </span><span class="nx">@ensureBlock</span> <span class="nx">elseBody</span>
|
<span class="vi">@elseBody = </span><span class="nx">@ensureBlock</span> <span class="nx">elseBody</span>
|
||||||
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-139"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-139">¶</a> </div> <p>The <strong>If</strong> only compiles into a statement if either of its bodies needs
|
<span class="k">this</span></pre></div> </td> </tr> <tr id="section-149"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-149">¶</a> </div> <p>The <strong>If</strong> only compiles into a statement if either of its bodies needs
|
||||||
to be a statement. Otherwise a conditional operator is safe.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">isStatement: </span><span class="nf">(o) -></span>
|
to be a statement. Otherwise a conditional operator is safe.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">isStatement: </span><span class="nf">(o) -></span>
|
||||||
<span class="nx">o</span><span class="o">?</span><span class="p">.</span><span class="nx">level</span> <span class="o">is</span> <span class="nx">LEVEL_TOP</span> <span class="o">or</span>
|
<span class="nx">o</span><span class="o">?</span><span class="p">.</span><span class="nx">level</span> <span class="o">is</span> <span class="nx">LEVEL_TOP</span> <span class="o">or</span>
|
||||||
<span class="nx">@bodyNode</span><span class="p">().</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">or</span> <span class="nx">@elseBodyNode</span><span class="p">()</span><span class="o">?</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
|
<span class="nx">@bodyNode</span><span class="p">().</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span> <span class="o">or</span> <span class="nx">@elseBodyNode</span><span class="p">()</span><span class="o">?</span><span class="p">.</span><span class="nx">isStatement</span><span class="p">(</span><span class="nx">o</span><span class="p">)</span>
|
||||||
|
@ -1359,7 +1467,7 @@ to be a statement. Otherwise a conditional operator is safe.</p> </t
|
||||||
<span class="k">this</span>
|
<span class="k">this</span>
|
||||||
|
|
||||||
<span class="nv">ensureBlock: </span><span class="nf">(node) -></span>
|
<span class="nv">ensureBlock: </span><span class="nf">(node) -></span>
|
||||||
<span class="k">if</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Block</span> <span class="k">then</span> <span class="nx">node</span> <span class="k">else</span> <span class="k">new</span> <span class="nx">Block</span> <span class="p">[</span><span class="nx">node</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-140"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-140">¶</a> </div> <p>Compile the <code>If</code> as a regular <em>if-else</em> statement. Flattened chains
|
<span class="k">if</span> <span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Block</span> <span class="k">then</span> <span class="nx">node</span> <span class="k">else</span> <span class="k">new</span> <span class="nx">Block</span> <span class="p">[</span><span class="nx">node</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-150"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-150">¶</a> </div> <p>Compile the <code>If</code> as a regular <em>if-else</em> statement. Flattened chains
|
||||||
force inner <em>else</em> bodies into statement form.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileStatement: </span><span class="nf">(o) -></span>
|
force inner <em>else</em> bodies into statement form.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileStatement: </span><span class="nf">(o) -></span>
|
||||||
<span class="nv">child = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">'chainChild'</span>
|
<span class="nv">child = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">'chainChild'</span>
|
||||||
<span class="nv">exeq = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">'isExistentialEquals'</span>
|
<span class="nv">exeq = </span><span class="nx">del</span> <span class="nx">o</span><span class="p">,</span> <span class="s1">'isExistentialEquals'</span>
|
||||||
|
@ -1370,17 +1478,7 @@ force inner <em>else</em> bodies into statement form.</p> </td>
|
||||||
<span class="nv">cond = </span><span class="nx">@condition</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_PAREN</span>
|
<span class="nv">cond = </span><span class="nx">@condition</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_PAREN</span>
|
||||||
<span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+=</span> <span class="nx">TAB</span>
|
<span class="nx">o</span><span class="p">.</span><span class="nx">indent</span> <span class="o">+=</span> <span class="nx">TAB</span>
|
||||||
<span class="nv">body = </span><span class="nx">@ensureBlock</span><span class="p">(</span><span class="nx">@body</span><span class="p">)</span>
|
<span class="nv">body = </span><span class="nx">@ensureBlock</span><span class="p">(</span><span class="nx">@body</span><span class="p">)</span>
|
||||||
<span class="nv">bodyc = </span><span class="nx">body</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span>
|
<span class="nv">ifPart = </span><span class="s2">"if (#{cond}) {\n#{body.compile(o)}\n#{@tab}}"</span>
|
||||||
<span class="k">if</span> <span class="p">(</span>
|
|
||||||
<span class="mi">1</span> <span class="o">is</span> <span class="nx">body</span><span class="p">.</span><span class="nx">expressions</span><span class="o">?</span><span class="p">.</span><span class="nx">length</span> <span class="o">and</span>
|
|
||||||
<span class="o">!</span><span class="nx">@elseBody</span> <span class="o">and</span> <span class="o">!</span><span class="nx">child</span> <span class="o">and</span>
|
|
||||||
<span class="nx">bodyc</span> <span class="o">and</span> <span class="nx">cond</span> <span class="o">and</span>
|
|
||||||
<span class="o">-</span><span class="mi">1</span> <span class="o">is</span> <span class="p">(</span><span class="nx">bodyc</span><span class="p">.</span><span class="nx">indexOf</span> <span class="s1">'\n'</span><span class="p">)</span> <span class="o">and</span>
|
|
||||||
<span class="mi">80</span> <span class="o">></span> <span class="nx">cond</span><span class="p">.</span><span class="nx">length</span> <span class="o">+</span> <span class="nx">bodyc</span><span class="p">.</span><span class="nx">length</span>
|
|
||||||
<span class="p">)</span>
|
|
||||||
<span class="k">return</span> <span class="s2">"#{@tab}if (#{cond}) #{bodyc.replace /^\s+/, ''}"</span>
|
|
||||||
<span class="nv">bodyc = </span><span class="s2">"\n#{bodyc}\n#{@tab}"</span> <span class="k">if</span> <span class="nx">bodyc</span>
|
|
||||||
<span class="nv">ifPart = </span><span class="s2">"if (#{cond}) {#{bodyc}}"</span>
|
|
||||||
<span class="nv">ifPart = </span><span class="nx">@tab</span> <span class="o">+</span> <span class="nx">ifPart</span> <span class="nx">unless</span> <span class="nx">child</span>
|
<span class="nv">ifPart = </span><span class="nx">@tab</span> <span class="o">+</span> <span class="nx">ifPart</span> <span class="nx">unless</span> <span class="nx">child</span>
|
||||||
<span class="k">return</span> <span class="nx">ifPart</span> <span class="nx">unless</span> <span class="nx">@elseBody</span>
|
<span class="k">return</span> <span class="nx">ifPart</span> <span class="nx">unless</span> <span class="nx">@elseBody</span>
|
||||||
<span class="nx">ifPart</span> <span class="o">+</span> <span class="s1">' else '</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">@isChain</span>
|
<span class="nx">ifPart</span> <span class="o">+</span> <span class="s1">' else '</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">@isChain</span>
|
||||||
|
@ -1388,7 +1486,7 @@ force inner <em>else</em> bodies into statement form.</p> </td>
|
||||||
<span class="nv">o.chainChild = </span><span class="kc">yes</span>
|
<span class="nv">o.chainChild = </span><span class="kc">yes</span>
|
||||||
<span class="nx">@elseBody</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_TOP</span>
|
<span class="nx">@elseBody</span><span class="p">.</span><span class="nx">unwrap</span><span class="p">().</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_TOP</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="s2">"{\n#{ @elseBody.compile o, LEVEL_TOP }\n#{@tab}}"</span></pre></div> </td> </tr> <tr id="section-141"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-141">¶</a> </div> <p>Compile the <code>If</code> as a conditional operator.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileExpression: </span><span class="nf">(o) -></span>
|
<span class="s2">"{\n#{ @elseBody.compile o, LEVEL_TOP }\n#{@tab}}"</span></pre></div> </td> </tr> <tr id="section-151"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-151">¶</a> </div> <p>Compile the <code>If</code> as a conditional operator.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">compileExpression: </span><span class="nf">(o) -></span>
|
||||||
<span class="nv">cond = </span><span class="nx">@condition</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_COND</span>
|
<span class="nv">cond = </span><span class="nx">@condition</span><span class="p">.</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_COND</span>
|
||||||
<span class="nv">body = </span><span class="nx">@bodyNode</span><span class="p">().</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
<span class="nv">body = </span><span class="nx">@bodyNode</span><span class="p">().</span><span class="nx">compile</span> <span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span>
|
||||||
<span class="nv">alt = </span><span class="k">if</span> <span class="nx">@elseBodyNode</span><span class="p">()</span> <span class="k">then</span> <span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span><span class="p">)</span> <span class="k">else</span> <span class="s1">'void 0'</span>
|
<span class="nv">alt = </span><span class="k">if</span> <span class="nx">@elseBodyNode</span><span class="p">()</span> <span class="k">then</span> <span class="nx">@elseBodyNode</span><span class="p">().</span><span class="nx">compile</span><span class="p">(</span><span class="nx">o</span><span class="p">,</span> <span class="nx">LEVEL_LIST</span><span class="p">)</span> <span class="k">else</span> <span class="s1">'void 0'</span>
|
||||||
|
@ -1396,10 +1494,10 @@ force inner <em>else</em> bodies into statement form.</p> </td>
|
||||||
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">>=</span> <span class="nx">LEVEL_COND</span> <span class="k">then</span> <span class="s2">"(#{code})"</span> <span class="k">else</span> <span class="nx">code</span>
|
<span class="k">if</span> <span class="nx">o</span><span class="p">.</span><span class="nx">level</span> <span class="o">>=</span> <span class="nx">LEVEL_COND</span> <span class="k">then</span> <span class="s2">"(#{code})"</span> <span class="k">else</span> <span class="nx">code</span>
|
||||||
|
|
||||||
<span class="nv">unfoldSoak: </span><span class="o">-></span>
|
<span class="nv">unfoldSoak: </span><span class="o">-></span>
|
||||||
<span class="nx">@soak</span> <span class="o">and</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-142"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-142">¶</a> </div> <h2>Faux-Nodes</h2>
|
<span class="nx">@soak</span> <span class="o">and</span> <span class="k">this</span></pre></div> </td> </tr> <tr id="section-152"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-152">¶</a> </div> <h2>Faux-Nodes</h2>
|
||||||
|
|
||||||
<p>Faux-nodes are never created by the grammar, but are used during code
|
<p>Faux-nodes are never created by the grammar, but are used during code
|
||||||
generation to generate other combinations of nodes.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-143"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-143">¶</a> </div> <h3>Closure</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-144"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-144">¶</a> </div> <p>A faux-node used to wrap an expressions body in a closure.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">Closure =</span></pre></div> </td> </tr> <tr id="section-145"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-145">¶</a> </div> <p>Wrap the expressions body, unless it contains a pure statement,
|
generation to generate other combinations of nodes.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-153"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-153">¶</a> </div> <h3>Closure</h3> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-154"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-154">¶</a> </div> <p>A faux-node used to wrap an expressions body in a closure.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">Closure =</span></pre></div> </td> </tr> <tr id="section-155"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-155">¶</a> </div> <p>Wrap the expressions body, unless it contains a pure statement,
|
||||||
in which case, no dice. If the body mentions <code>this</code> or <code>arguments</code>,
|
in which case, no dice. If the body mentions <code>this</code> or <code>arguments</code>,
|
||||||
then make sure that the closure wrapper preserves the original values.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">wrap: </span><span class="nf">(expressions, statement, noReturn) -></span>
|
then make sure that the closure wrapper preserves the original values.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">wrap: </span><span class="nf">(expressions, statement, noReturn) -></span>
|
||||||
<span class="k">return</span> <span class="nx">expressions</span> <span class="k">if</span> <span class="nx">expressions</span><span class="p">.</span><span class="nx">jumps</span><span class="p">()</span>
|
<span class="k">return</span> <span class="nx">expressions</span> <span class="k">if</span> <span class="nx">expressions</span><span class="p">.</span><span class="nx">jumps</span><span class="p">()</span>
|
||||||
|
@ -1416,28 +1514,28 @@ then make sure that the closure wrapper preserves the original values.</p>
|
||||||
|
|
||||||
<span class="nv">literalArgs: </span><span class="nf">(node) -></span>
|
<span class="nv">literalArgs: </span><span class="nf">(node) -></span>
|
||||||
<span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">node</span><span class="p">.</span><span class="nx">value</span> <span class="o">is</span> <span class="s1">'arguments'</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">node</span><span class="p">.</span><span class="nx">asKey</span>
|
<span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">node</span><span class="p">.</span><span class="nx">value</span> <span class="o">is</span> <span class="s1">'arguments'</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">node</span><span class="p">.</span><span class="nx">asKey</span>
|
||||||
|
|
||||||
<span class="nv">literalThis: </span><span class="nf">(node) -></span>
|
<span class="nv">literalThis: </span><span class="nf">(node) -></span>
|
||||||
<span class="p">(</span><span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">node</span><span class="p">.</span><span class="nx">value</span> <span class="o">is</span> <span class="s1">'this'</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">node</span><span class="p">.</span><span class="nx">asKey</span><span class="p">)</span> <span class="o">or</span>
|
<span class="p">(</span><span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Literal</span> <span class="o">and</span> <span class="nx">node</span><span class="p">.</span><span class="nx">value</span> <span class="o">is</span> <span class="s1">'this'</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">node</span><span class="p">.</span><span class="nx">asKey</span><span class="p">)</span> <span class="o">or</span>
|
||||||
<span class="p">(</span><span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Code</span> <span class="o">and</span> <span class="nx">node</span><span class="p">.</span><span class="nx">bound</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-146"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-146">¶</a> </div> <p>Unfold a node's child if soak, then tuck the node under created <code>If</code></p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">unfoldSoak = </span><span class="nf">(o, parent, name) -></span>
|
<span class="p">(</span><span class="nx">node</span> <span class="k">instanceof</span> <span class="nx">Code</span> <span class="o">and</span> <span class="nx">node</span><span class="p">.</span><span class="nx">bound</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-156"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-156">¶</a> </div> <p>Unfold a node's child if soak, then tuck the node under created <code>If</code></p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">unfoldSoak = </span><span class="nf">(o, parent, name) -></span>
|
||||||
<span class="k">return</span> <span class="nx">unless</span> <span class="nv">ifn = </span><span class="nx">parent</span><span class="p">[</span><span class="nx">name</span><span class="p">].</span><span class="nx">unfoldSoak</span> <span class="nx">o</span>
|
<span class="k">return</span> <span class="nx">unless</span> <span class="nv">ifn = </span><span class="nx">parent</span><span class="p">[</span><span class="nx">name</span><span class="p">].</span><span class="nx">unfoldSoak</span> <span class="nx">o</span>
|
||||||
<span class="nx">parent</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">ifn</span><span class="p">.</span><span class="nx">body</span>
|
<span class="nx">parent</span><span class="p">[</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">ifn</span><span class="p">.</span><span class="nx">body</span>
|
||||||
<span class="nv">ifn.body = </span><span class="k">new</span> <span class="nx">Value</span> <span class="nx">parent</span>
|
<span class="nv">ifn.body = </span><span class="k">new</span> <span class="nx">Value</span> <span class="nx">parent</span>
|
||||||
<span class="nx">ifn</span></pre></div> </td> </tr> <tr id="section-147"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-147">¶</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nv">UTILITIES =</span></pre></div> </td> </tr> <tr id="section-148"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-148">¶</a> </div> <p>Correctly set up a prototype chain for inheritance, including a reference
|
<span class="nx">ifn</span></pre></div> </td> </tr> <tr id="section-157"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-157">¶</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nv">UTILITIES =</span></pre></div> </td> </tr> <tr id="section-158"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-158">¶</a> </div> <p>Correctly set up a prototype chain for inheritance, including a reference
|
||||||
to the superclass for <code>super()</code> calls, and copies of any static properties.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">extends</span><span class="o">:</span> <span class="o">-></span> <span class="s2">"""</span>
|
to the superclass for <code>super()</code> calls, and copies of any static properties.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">extends</span><span class="o">:</span> <span class="o">-></span> <span class="s2">"""</span>
|
||||||
<span class="s2"> function(child, parent) { for (var key in parent) { if (#{utility 'hasProp'}.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }</span>
|
<span class="s2"> function(child, parent) { for (var key in parent) { if (#{utility 'hasProp'}.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }</span>
|
||||||
<span class="s2"> """</span></pre></div> </td> </tr> <tr id="section-149"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-149">¶</a> </div> <p>Create a function bound to the current value of "this".</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">bind: </span><span class="o">-></span> <span class="s1">'''</span>
|
<span class="s2"> """</span></pre></div> </td> </tr> <tr id="section-159"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-159">¶</a> </div> <p>Create a function bound to the current value of "this".</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">bind: </span><span class="o">-></span> <span class="s1">'''</span>
|
||||||
<span class="s1"> function(fn, me){ return function(){ return fn.apply(me, arguments); }; }</span>
|
<span class="s1"> function(fn, me){ return function(){ return fn.apply(me, arguments); }; }</span>
|
||||||
<span class="s1"> '''</span></pre></div> </td> </tr> <tr id="section-150"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-150">¶</a> </div> <p>Discover if an item is in an array.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">indexOf: </span><span class="o">-></span> <span class="s2">"""</span>
|
<span class="s1"> '''</span></pre></div> </td> </tr> <tr id="section-160"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-160">¶</a> </div> <p>Discover if an item is in an array.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">indexOf: </span><span class="o">-></span> <span class="s2">"""</span>
|
||||||
<span class="s2"> Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }</span>
|
<span class="s2"> [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }</span>
|
||||||
<span class="s2"> """</span></pre></div> </td> </tr> <tr id="section-151"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-151">¶</a> </div> <p>Shortcuts to speed up the lookup time for native functions.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">hasProp: </span><span class="o">-></span> <span class="s1">'Object.prototype.hasOwnProperty'</span>
|
<span class="s2"> """</span></pre></div> </td> </tr> <tr id="section-161"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-161">¶</a> </div> <p>Shortcuts to speed up the lookup time for native functions.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">hasProp: </span><span class="o">-></span> <span class="s1">'{}.hasOwnProperty'</span>
|
||||||
<span class="nv">slice : </span><span class="o">-></span> <span class="s1">'Array.prototype.slice'</span></pre></div> </td> </tr> <tr id="section-152"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-152">¶</a> </div> <p>Levels indicate a node's position in the AST. Useful for knowing if
|
<span class="nv">slice : </span><span class="o">-></span> <span class="s1">'[].slice'</span></pre></div> </td> </tr> <tr id="section-162"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-162">¶</a> </div> <p>Levels indicate a node's position in the AST. Useful for knowing if
|
||||||
parens are necessary or superfluous.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LEVEL_TOP = </span><span class="mi">1</span> <span class="c1"># ...;</span>
|
parens are necessary or superfluous.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LEVEL_TOP = </span><span class="mi">1</span> <span class="c1"># ...;</span>
|
||||||
<span class="nv">LEVEL_PAREN = </span><span class="mi">2</span> <span class="c1"># (...)</span>
|
<span class="nv">LEVEL_PAREN = </span><span class="mi">2</span> <span class="c1"># (...)</span>
|
||||||
<span class="nv">LEVEL_LIST = </span><span class="mi">3</span> <span class="c1"># [...]</span>
|
<span class="nv">LEVEL_LIST = </span><span class="mi">3</span> <span class="c1"># [...]</span>
|
||||||
<span class="nv">LEVEL_COND = </span><span class="mi">4</span> <span class="c1"># ... ? x : y</span>
|
<span class="nv">LEVEL_COND = </span><span class="mi">4</span> <span class="c1"># ... ? x : y</span>
|
||||||
<span class="nv">LEVEL_OP = </span><span class="mi">5</span> <span class="c1"># !...</span>
|
<span class="nv">LEVEL_OP = </span><span class="mi">5</span> <span class="c1"># !...</span>
|
||||||
<span class="nv">LEVEL_ACCESS = </span><span class="mi">6</span> <span class="c1"># ...[0]</span></pre></div> </td> </tr> <tr id="section-153"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-153">¶</a> </div> <p>Tabs are two spaces for pretty printing.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">TAB = </span><span class="s1">' '</span>
|
<span class="nv">LEVEL_ACCESS = </span><span class="mi">6</span> <span class="c1"># ...[0]</span></pre></div> </td> </tr> <tr id="section-163"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-163">¶</a> </div> <p>Tabs are two spaces for pretty printing.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">TAB = </span><span class="s1">' '</span>
|
||||||
|
|
||||||
<span class="nv">IDENTIFIER_STR = </span><span class="s2">"[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*"</span>
|
<span class="nv">IDENTIFIER_STR = </span><span class="s2">"[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*"</span>
|
||||||
<span class="nv">IDENTIFIER = </span><span class="err">/// ^ #{IDENTIFIER_STR} $ ///</span>
|
<span class="nv">IDENTIFIER = </span><span class="err">/// ^ #{IDENTIFIER_STR} $ ///</span>
|
||||||
|
@ -1460,7 +1558,7 @@ parens are necessary or superfluous.</p> </td> <td class
|
||||||
|
|
||||||
|
|
||||||
<span class="s2">#DIVIDER</span>
|
<span class="s2">#DIVIDER</span>
|
||||||
<span class="s2">IS_STRING = /^['"</span><span class="p">]</span><span class="o">/</span></pre></div> </td> </tr> <tr id="section-154"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-154">¶</a> </div> <p>Is a literal value a string?</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-155"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-155">¶</a> </div> <h2>Utility Functions</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nv">utility = </span><span class="nf">(name) -></span>
|
<span class="s2">IS_STRING = /^['"</span><span class="p">]</span><span class="o">/</span></pre></div> </td> </tr> <tr id="section-164"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-164">¶</a> </div> <p>Is a literal value a string?</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-165"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-165">¶</a> </div> <h2>Utility Functions</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nv">utility = </span><span class="nf">(name) -></span>
|
||||||
<span class="nv">ref = </span><span class="s2">"__#{name}"</span>
|
<span class="nv">ref = </span><span class="s2">"__#{name}"</span>
|
||||||
<span class="nx">Scope</span><span class="p">.</span><span class="nx">root</span><span class="p">.</span><span class="nx">assign</span> <span class="nx">ref</span><span class="p">,</span> <span class="nx">UTILITIES</span><span class="p">[</span><span class="nx">name</span><span class="p">]()</span>
|
<span class="nx">Scope</span><span class="p">.</span><span class="nx">root</span><span class="p">.</span><span class="nx">assign</span> <span class="nx">ref</span><span class="p">,</span> <span class="nx">UTILITIES</span><span class="p">[</span><span class="nx">name</span><span class="p">]()</span>
|
||||||
<span class="nx">ref</span>
|
<span class="nx">ref</span>
|
||||||
|
@ -1469,4 +1567,4 @@ parens are necessary or superfluous.</p> </td> <td class
|
||||||
<span class="nv">code = </span><span class="nx">code</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\n/g</span><span class="p">,</span> <span class="s1">'$&'</span> <span class="o">+</span> <span class="nx">tab</span>
|
<span class="nv">code = </span><span class="nx">code</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\n/g</span><span class="p">,</span> <span class="s1">'$&'</span> <span class="o">+</span> <span class="nx">tab</span>
|
||||||
<span class="nx">code</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\s+$/</span><span class="p">,</span> <span class="s1">''</span>
|
<span class="nx">code</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/\s+$/</span><span class="p">,</span> <span class="s1">''</span>
|
||||||
|
|
||||||
</pre></div> </td> </tr> <tr id="section-156"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-156">¶</a> </div> <p>Helper for ensuring that utility functions are assigned at the top level.</p> </td> <td class="code"> <div class="highlight"><pre>undefined</pre></div> </td> </tr> </tbody> </table> </div> </body> </html>
|
</pre></div> </td> </tr> <tr id="section-166"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-166">¶</a> </div> <p>Helper for ensuring that utility functions are assigned at the top level.</p> </td> <td class="code"> <div class="highlight"><pre>undefined</pre></div> </td> </tr> </tbody> </table> </div> </body> </html>
|
|
@ -13,34 +13,40 @@ option) list, and all subsequent arguments are left unparsed.</p> </
|
||||||
|
|
||||||
<p>Along with an an optional banner for the usage help.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">constructor: </span><span class="nf">(rules, @banner) -></span>
|
<p>Along with an an optional banner for the usage help.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">constructor: </span><span class="nf">(rules, @banner) -></span>
|
||||||
<span class="vi">@rules = </span><span class="nx">buildRules</span> <span class="nx">rules</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Parse the list of arguments, populating an <code>options</code> object with all of the
|
<span class="vi">@rules = </span><span class="nx">buildRules</span> <span class="nx">rules</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Parse the list of arguments, populating an <code>options</code> object with all of the
|
||||||
specified options, and return it. <code>options.arguments</code> will be an array
|
specified options, and return it. Options after the first non-option
|
||||||
containing the remaining non-option arguments. <code>options.literals</code> will be
|
argument are treated as arguments. <code>options.arguments</code> will be an array
|
||||||
an array of options that are meant to be passed through directly to the
|
containing the remaining arguments. This is a simpler API than many option
|
||||||
executing script. This is a simpler API than many option parsers that allow
|
parsers that allow you to attach callback actions for every flag. Instead,
|
||||||
you to attach callback actions for every flag. Instead, you're responsible
|
you're responsible for interpreting the options object.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">parse: </span><span class="nf">(args) -></span>
|
||||||
for interpreting the options object.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">parse: </span><span class="nf">(args) -></span>
|
<span class="nv">options = arguments: </span><span class="p">[]</span>
|
||||||
<span class="nv">options = arguments: </span><span class="p">[],</span> <span class="nv">literals: </span><span class="p">[]</span>
|
<span class="nv">skippingArgument = </span><span class="kc">no</span>
|
||||||
<span class="nv">originalArgs = </span><span class="nx">args</span>
|
<span class="nv">originalArgs = </span><span class="nx">args</span>
|
||||||
<span class="nv">args = </span><span class="nx">normalizeArguments</span> <span class="nx">args</span>
|
<span class="nv">args = </span><span class="nx">normalizeArguments</span> <span class="nx">args</span>
|
||||||
<span class="k">for</span> <span class="nx">arg</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">args</span>
|
<span class="k">for</span> <span class="nx">arg</span><span class="p">,</span> <span class="nx">i</span> <span class="k">in</span> <span class="nx">args</span>
|
||||||
|
<span class="k">if</span> <span class="nx">skippingArgument</span>
|
||||||
|
<span class="nv">skippingArgument = </span><span class="kc">no</span>
|
||||||
|
<span class="k">continue</span>
|
||||||
<span class="k">if</span> <span class="nx">arg</span> <span class="o">is</span> <span class="s1">'--'</span>
|
<span class="k">if</span> <span class="nx">arg</span> <span class="o">is</span> <span class="s1">'--'</span>
|
||||||
<span class="nv">pos = </span><span class="nx">originalArgs</span><span class="p">.</span><span class="nx">indexOf</span> <span class="s1">'--'</span>
|
<span class="nv">pos = </span><span class="nx">originalArgs</span><span class="p">.</span><span class="nx">indexOf</span> <span class="s1">'--'</span>
|
||||||
<span class="nv">options.arguments = </span><span class="p">[</span><span class="nx">originalArgs</span><span class="p">[</span><span class="mi">1</span> <span class="o">+</span> <span class="nx">pos</span><span class="p">]]</span>
|
<span class="nv">options.arguments = </span><span class="nx">options</span><span class="p">.</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">concat</span> <span class="nx">originalArgs</span><span class="p">[(</span><span class="nx">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)..]</span>
|
||||||
<span class="nv">options.literals = </span><span class="nx">originalArgs</span><span class="p">[(</span><span class="mi">2</span> <span class="o">+</span> <span class="nx">pos</span><span class="p">)..]</span>
|
|
||||||
<span class="k">break</span>
|
<span class="k">break</span>
|
||||||
<span class="nv">isOption = </span><span class="o">!!</span><span class="p">(</span><span class="nx">arg</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">LONG_FLAG</span><span class="p">)</span> <span class="o">or</span> <span class="nx">arg</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">SHORT_FLAG</span><span class="p">))</span>
|
<span class="nv">isOption = </span><span class="o">!!</span><span class="p">(</span><span class="nx">arg</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">LONG_FLAG</span><span class="p">)</span> <span class="o">or</span> <span class="nx">arg</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">SHORT_FLAG</span><span class="p">))</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>the CS option parser is a little odd; options after the first
|
||||||
<span class="nv">matchedRule = </span><span class="kc">no</span>
|
non-option argument are treated as non-option arguments themselves</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">seenNonOptionArg = </span><span class="nx">options</span><span class="p">.</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">0</span>
|
||||||
<span class="k">for</span> <span class="nx">rule</span> <span class="k">in</span> <span class="nx">@rules</span>
|
<span class="nx">unless</span> <span class="nx">seenNonOptionArg</span>
|
||||||
<span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="o">is</span> <span class="nx">arg</span> <span class="o">or</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">longFlag</span> <span class="o">is</span> <span class="nx">arg</span>
|
<span class="nv">matchedRule = </span><span class="kc">no</span>
|
||||||
<span class="nv">value = </span><span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">hasArgument</span> <span class="k">then</span> <span class="nx">args</span><span class="p">[</span><span class="nx">i</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">]</span> <span class="k">else</span> <span class="kc">true</span>
|
<span class="k">for</span> <span class="nx">rule</span> <span class="k">in</span> <span class="nx">@rules</span>
|
||||||
<span class="nx">options</span><span class="p">[</span><span class="nx">rule</span><span class="p">.</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">isList</span> <span class="k">then</span> <span class="p">(</span><span class="nx">options</span><span class="p">[</span><span class="nx">rule</span><span class="p">.</span><span class="nx">name</span><span class="p">]</span> <span class="o">or</span> <span class="p">[]).</span><span class="nx">concat</span> <span class="nx">value</span> <span class="k">else</span> <span class="nx">value</span>
|
<span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="o">is</span> <span class="nx">arg</span> <span class="o">or</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">longFlag</span> <span class="o">is</span> <span class="nx">arg</span>
|
||||||
<span class="nv">matchedRule = </span><span class="kc">yes</span>
|
<span class="nv">value = </span><span class="kc">true</span>
|
||||||
<span class="k">break</span>
|
<span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">hasArgument</span>
|
||||||
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s2">"unrecognized option: #{arg}"</span> <span class="k">if</span> <span class="nx">isOption</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">matchedRule</span>
|
<span class="nv">skippingArgument = </span><span class="kc">yes</span>
|
||||||
<span class="k">if</span> <span class="o">not</span> <span class="nx">isOption</span>
|
<span class="nv">value = </span><span class="nx">args</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
|
||||||
<span class="nv">options.arguments = </span><span class="nx">originalArgs</span><span class="p">[(</span><span class="nx">originalArgs</span><span class="p">.</span><span class="nx">indexOf</span> <span class="nx">arg</span><span class="p">)..]</span>
|
<span class="nx">options</span><span class="p">[</span><span class="nx">rule</span><span class="p">.</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">isList</span> <span class="k">then</span> <span class="p">(</span><span class="nx">options</span><span class="p">[</span><span class="nx">rule</span><span class="p">.</span><span class="nx">name</span><span class="p">]</span> <span class="o">or</span> <span class="p">[]).</span><span class="nx">concat</span> <span class="nx">value</span> <span class="k">else</span> <span class="nx">value</span>
|
||||||
<span class="k">break</span>
|
<span class="nv">matchedRule = </span><span class="kc">yes</span>
|
||||||
<span class="nx">options</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>Return the help text for this <strong>OptionParser</strong>, listing and describing all
|
<span class="k">break</span>
|
||||||
|
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span> <span class="s2">"unrecognized option: #{arg}"</span> <span class="k">if</span> <span class="nx">isOption</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">matchedRule</span>
|
||||||
|
<span class="k">if</span> <span class="nx">seenNonOptionArg</span> <span class="o">or</span> <span class="o">not</span> <span class="nx">isOption</span>
|
||||||
|
<span class="nx">options</span><span class="p">.</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">push</span> <span class="nx">arg</span>
|
||||||
|
<span class="nx">options</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>Return the help text for this <strong>OptionParser</strong>, listing and describing all
|
||||||
of the valid options, for <code>--help</code> and such.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">help: </span><span class="o">-></span>
|
of the valid options, for <code>--help</code> and such.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">help: </span><span class="o">-></span>
|
||||||
<span class="nv">lines = </span><span class="p">[]</span>
|
<span class="nv">lines = </span><span class="p">[]</span>
|
||||||
<span class="nx">lines</span><span class="p">.</span><span class="nx">unshift</span> <span class="s2">"#{@banner}\n"</span> <span class="k">if</span> <span class="nx">@banner</span>
|
<span class="nx">lines</span><span class="p">.</span><span class="nx">unshift</span> <span class="s2">"#{@banner}\n"</span> <span class="k">if</span> <span class="nx">@banner</span>
|
||||||
|
@ -49,14 +55,14 @@ of the valid options, for <code>--help</code> and such.</p> </td>
|
||||||
<span class="nv">spaces = </span><span class="k">if</span> <span class="nx">spaces</span> <span class="o">></span> <span class="mi">0</span> <span class="k">then</span> <span class="nb">Array</span><span class="p">(</span><span class="nx">spaces</span> <span class="o">+</span> <span class="mi">1</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span> <span class="k">else</span> <span class="s1">''</span>
|
<span class="nv">spaces = </span><span class="k">if</span> <span class="nx">spaces</span> <span class="o">></span> <span class="mi">0</span> <span class="k">then</span> <span class="nb">Array</span><span class="p">(</span><span class="nx">spaces</span> <span class="o">+</span> <span class="mi">1</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span> <span class="k">else</span> <span class="s1">''</span>
|
||||||
<span class="nv">letPart = </span><span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="k">then</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="o">+</span> <span class="s1">', '</span> <span class="k">else</span> <span class="s1">' '</span>
|
<span class="nv">letPart = </span><span class="k">if</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="k">then</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">shortFlag</span> <span class="o">+</span> <span class="s1">', '</span> <span class="k">else</span> <span class="s1">' '</span>
|
||||||
<span class="nx">lines</span><span class="p">.</span><span class="nx">push</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">letPart</span> <span class="o">+</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">longFlag</span> <span class="o">+</span> <span class="nx">spaces</span> <span class="o">+</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">description</span>
|
<span class="nx">lines</span><span class="p">.</span><span class="nx">push</span> <span class="s1">' '</span> <span class="o">+</span> <span class="nx">letPart</span> <span class="o">+</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">longFlag</span> <span class="o">+</span> <span class="nx">spaces</span> <span class="o">+</span> <span class="nx">rule</span><span class="p">.</span><span class="nx">description</span>
|
||||||
<span class="s2">"\n#{ lines.join('\n') }\n"</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <h2>Helpers</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>Regex matchers for option flags.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LONG_FLAG = </span><span class="sr">/^(--\w[\w\-]+)/</span>
|
<span class="s2">"\n#{ lines.join('\n') }\n"</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <h2>Helpers</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <p>Regex matchers for option flags.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LONG_FLAG = </span><span class="sr">/^(--\w[\w\-]*)/</span>
|
||||||
<span class="nv">SHORT_FLAG = </span><span class="sr">/^(-\w)/</span>
|
<span class="nv">SHORT_FLAG = </span><span class="sr">/^(-\w)$/</span>
|
||||||
<span class="nv">MULTI_FLAG = </span><span class="sr">/^-(\w{2,})/</span>
|
<span class="nv">MULTI_FLAG = </span><span class="sr">/^-(\w{2,})/</span>
|
||||||
<span class="nv">OPTIONAL = </span><span class="sr">/\[(\w+(\*?))\]/</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <p>Build and return the list of option rules. If the optional <em>short-flag</em> is
|
<span class="nv">OPTIONAL = </span><span class="sr">/\[(\w+(\*?))\]/</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>Build and return the list of option rules. If the optional <em>short-flag</em> is
|
||||||
unspecified, leave it out by padding with <code>null</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">buildRules = </span><span class="nf">(rules) -></span>
|
unspecified, leave it out by padding with <code>null</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">buildRules = </span><span class="nf">(rules) -></span>
|
||||||
<span class="k">for</span> <span class="nx">tuple</span> <span class="k">in</span> <span class="nx">rules</span>
|
<span class="k">for</span> <span class="nx">tuple</span> <span class="k">in</span> <span class="nx">rules</span>
|
||||||
<span class="nx">tuple</span><span class="p">.</span><span class="nx">unshift</span> <span class="kc">null</span> <span class="k">if</span> <span class="nx">tuple</span><span class="p">.</span><span class="nx">length</span> <span class="o"><</span> <span class="mi">3</span>
|
<span class="nx">tuple</span><span class="p">.</span><span class="nx">unshift</span> <span class="kc">null</span> <span class="k">if</span> <span class="nx">tuple</span><span class="p">.</span><span class="nx">length</span> <span class="o"><</span> <span class="mi">3</span>
|
||||||
<span class="nx">buildRule</span> <span class="nx">tuple</span><span class="p">...</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>Build a rule from a <code>-o</code> short flag, a <code>--output [DIR]</code> long flag, and the
|
<span class="nx">buildRule</span> <span class="nx">tuple</span><span class="p">...</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Build a rule from a <code>-o</code> short flag, a <code>--output [DIR]</code> long flag, and the
|
||||||
description of what the option does.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">buildRule = </span><span class="nf">(shortFlag, longFlag, description, options = {}) -></span>
|
description of what the option does.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">buildRule = </span><span class="nf">(shortFlag, longFlag, description, options = {}) -></span>
|
||||||
<span class="nv">match = </span><span class="nx">longFlag</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">OPTIONAL</span><span class="p">)</span>
|
<span class="nv">match = </span><span class="nx">longFlag</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">OPTIONAL</span><span class="p">)</span>
|
||||||
<span class="nv">longFlag = </span><span class="nx">longFlag</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">LONG_FLAG</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
|
<span class="nv">longFlag = </span><span class="nx">longFlag</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">LONG_FLAG</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
|
||||||
|
@ -67,9 +73,9 @@ description of what the option does.</p> </td> <td class
|
||||||
<span class="nv">description: </span> <span class="nx">description</span>
|
<span class="nv">description: </span> <span class="nx">description</span>
|
||||||
<span class="nv">hasArgument: </span> <span class="o">!!</span><span class="p">(</span><span class="nx">match</span> <span class="o">and</span> <span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
<span class="nv">hasArgument: </span> <span class="o">!!</span><span class="p">(</span><span class="nx">match</span> <span class="o">and</span> <span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
||||||
<span class="nv">isList: </span> <span class="o">!!</span><span class="p">(</span><span class="nx">match</span> <span class="o">and</span> <span class="nx">match</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
<span class="nv">isList: </span> <span class="o">!!</span><span class="p">(</span><span class="nx">match</span> <span class="o">and</span> <span class="nx">match</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
|
||||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Normalize arguments by expanding merged flags into multiple flags. This allows
|
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Normalize arguments by expanding merged flags into multiple flags. This allows
|
||||||
you to have <code>-wl</code> be the same as <code>--watch --lint</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">normalizeArguments = </span><span class="nf">(args) -></span>
|
you to have <code>-wl</code> be the same as <code>--watch --lint</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">normalizeArguments = </span><span class="nf">(args) -></span>
|
||||||
<span class="nv">args = </span><span class="nx">args</span><span class="p">.</span><span class="nx">slice</span> <span class="mi">0</span>
|
<span class="nv">args = </span><span class="nx">args</span><span class="p">[..]</span>
|
||||||
<span class="nv">result = </span><span class="p">[]</span>
|
<span class="nv">result = </span><span class="p">[]</span>
|
||||||
<span class="k">for</span> <span class="nx">arg</span> <span class="k">in</span> <span class="nx">args</span>
|
<span class="k">for</span> <span class="nx">arg</span> <span class="k">in</span> <span class="nx">args</span>
|
||||||
<span class="k">if</span> <span class="nv">match = </span><span class="nx">arg</span><span class="p">.</span><span class="nx">match</span> <span class="nx">MULTI_FLAG</span>
|
<span class="k">if</span> <span class="nv">match = </span><span class="nx">arg</span><span class="p">.</span><span class="nx">match</span> <span class="nx">MULTI_FLAG</span>
|
||||||
|
|
|
@ -3,19 +3,45 @@ and evaluates it. Good for simple tests, or poking around the <strong>Node.js</s
|
||||||
Using it looks like this:</p>
|
Using it looks like this:</p>
|
||||||
|
|
||||||
<pre><code>coffee> console.log "#{num} bottles of beer" for num in [99..1]
|
<pre><code>coffee> console.log "#{num} bottles of beer" for num in [99..1]
|
||||||
</code></pre> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <p>Require the <strong>coffee-script</strong> module to get access to the compiler.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript = </span><span class="nx">require</span> <span class="s1">'./coffee-script'</span>
|
</code></pre> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <p>Start by opening up <code>stdin</code> and <code>stdout</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">stdin = </span><span class="nx">process</span><span class="p">.</span><span class="nx">openStdin</span><span class="p">()</span>
|
||||||
|
<span class="nv">stdout = </span><span class="nx">process</span><span class="p">.</span><span class="nx">stdout</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Require the <strong>coffee-script</strong> module to get access to the compiler.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">CoffeeScript = </span><span class="nx">require</span> <span class="s1">'./coffee-script'</span>
|
||||||
<span class="nv">readline = </span><span class="nx">require</span> <span class="s1">'readline'</span>
|
<span class="nv">readline = </span><span class="nx">require</span> <span class="s1">'readline'</span>
|
||||||
<span class="p">{</span><span class="nx">inspect</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'util'</span>
|
<span class="p">{</span><span class="nx">inspect</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'util'</span>
|
||||||
<span class="p">{</span><span class="nx">Script</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'vm'</span>
|
<span class="p">{</span><span class="nx">Script</span><span class="p">}</span> <span class="o">=</span> <span class="nx">require</span> <span class="s1">'vm'</span>
|
||||||
<span class="nv">Module = </span><span class="nx">require</span> <span class="s1">'module'</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>REPL Setup</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>Config</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">REPL_PROMPT = </span><span class="s1">'coffee> '</span>
|
<span class="nv">Module = </span><span class="nx">require</span> <span class="s1">'module'</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>REPL Setup</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>Config</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">REPL_PROMPT = </span><span class="s1">'coffee> '</span>
|
||||||
|
<span class="nv">REPL_PROMPT_MULTILINE = </span><span class="s1">'------> '</span>
|
||||||
<span class="nv">REPL_PROMPT_CONTINUATION = </span><span class="s1">'......> '</span>
|
<span class="nv">REPL_PROMPT_CONTINUATION = </span><span class="s1">'......> '</span>
|
||||||
<span class="nv">enableColours = </span><span class="kc">no</span>
|
<span class="nv">enableColours = </span><span class="kc">no</span>
|
||||||
<span class="nx">unless</span> <span class="nx">process</span><span class="p">.</span><span class="nx">platform</span> <span class="o">is</span> <span class="s1">'win32'</span>
|
<span class="nx">unless</span> <span class="nx">process</span><span class="p">.</span><span class="nx">platform</span> <span class="o">is</span> <span class="s1">'win32'</span>
|
||||||
<span class="nv">enableColours = </span><span class="o">not</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">NODE_DISABLE_COLORS</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>Start by opening up <code>stdin</code> and <code>stdout</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">stdin = </span><span class="nx">process</span><span class="p">.</span><span class="nx">openStdin</span><span class="p">()</span>
|
<span class="nv">enableColours = </span><span class="o">not</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">NODE_DISABLE_COLORS</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>Log an error.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">error = </span><span class="nf">(err) -></span>
|
||||||
<span class="nv">stdout = </span><span class="nx">process</span><span class="p">.</span><span class="nx">stdout</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>Log an error.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">error = </span><span class="nf">(err) -></span>
|
<span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="p">(</span><span class="nx">err</span><span class="p">.</span><span class="nx">stack</span> <span class="o">or</span> <span class="nx">err</span><span class="p">.</span><span class="nx">toString</span><span class="p">())</span> <span class="o">+</span> <span class="s1">'\n'</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <h1>Autocompletion</h1> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>Regexes to match complete-able bits of text.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">ACCESSOR = </span><span class="sr">/\s*([\w\.]+)(?:\.(\w*))$/</span>
|
||||||
<span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="p">(</span><span class="nx">err</span><span class="p">.</span><span class="nx">stack</span> <span class="o">or</span> <span class="nx">err</span><span class="p">.</span><span class="nx">toString</span><span class="p">())</span> <span class="o">+</span> <span class="s1">'\n'</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <p>The current backlog of multi-line code.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">backlog = </span><span class="s1">''</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>The main REPL function. <strong>run</strong> is called every time a line of code is entered.
|
<span class="nv">SIMPLEVAR = </span><span class="sr">/(\w+)$/i</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Returns a list of completions, and the completed text.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">autocomplete = </span><span class="nf">(text) -></span>
|
||||||
|
<span class="nx">completeAttribute</span><span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="o">or</span> <span class="nx">completeVariable</span><span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="o">or</span> <span class="p">[[],</span> <span class="nx">text</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Attempt to autocomplete a chained dotted attribute: <code>one.two.three</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">completeAttribute = </span><span class="nf">(text) -></span>
|
||||||
|
<span class="k">if</span> <span class="nv">match = </span><span class="nx">text</span><span class="p">.</span><span class="nx">match</span> <span class="nx">ACCESSOR</span>
|
||||||
|
<span class="p">[</span><span class="nx">all</span><span class="p">,</span> <span class="nx">obj</span><span class="p">,</span> <span class="nx">prefix</span><span class="p">]</span> <span class="o">=</span> <span class="nx">match</span>
|
||||||
|
<span class="k">try</span>
|
||||||
|
<span class="nv">val = </span><span class="nx">Script</span><span class="p">.</span><span class="nx">runInThisContext</span> <span class="nx">obj</span>
|
||||||
|
<span class="k">catch</span> <span class="nx">error</span>
|
||||||
|
<span class="k">return</span>
|
||||||
|
<span class="nv">completions = </span><span class="nx">getCompletions</span> <span class="nx">prefix</span><span class="p">,</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">getOwnPropertyNames</span> <span class="nb">Object</span> <span class="nx">val</span>
|
||||||
|
<span class="p">[</span><span class="nx">completions</span><span class="p">,</span> <span class="nx">prefix</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>Attempt to autocomplete an in-scope free variable: <code>one</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">completeVariable = </span><span class="nf">(text) -></span>
|
||||||
|
<span class="nv">free = </span><span class="nx">text</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">SIMPLEVAR</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
||||||
|
<span class="nv">free = </span><span class="s2">""</span> <span class="k">if</span> <span class="nx">text</span> <span class="o">is</span> <span class="s2">""</span>
|
||||||
|
<span class="k">if</span> <span class="nx">free</span><span class="o">?</span>
|
||||||
|
<span class="nv">vars = </span><span class="nx">Script</span><span class="p">.</span><span class="nx">runInThisContext</span> <span class="s1">'Object.getOwnPropertyNames(Object(this))'</span>
|
||||||
|
<span class="nv">keywords = </span><span class="p">(</span><span class="nx">r</span> <span class="k">for</span> <span class="nx">r</span> <span class="k">in</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">RESERVED</span> <span class="k">when</span> <span class="nx">r</span><span class="p">[..</span><span class="mi">1</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">'__'</span><span class="p">)</span>
|
||||||
|
<span class="nv">possibilities = </span><span class="nx">vars</span><span class="p">.</span><span class="nx">concat</span> <span class="nx">keywords</span>
|
||||||
|
<span class="nv">completions = </span><span class="nx">getCompletions</span> <span class="nx">free</span><span class="p">,</span> <span class="nx">possibilities</span>
|
||||||
|
<span class="p">[</span><span class="nx">completions</span><span class="p">,</span> <span class="nx">free</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>Return elements of candidates for which <code>prefix</code> is a prefix.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">getCompletions = </span><span class="nf">(prefix, candidates) -></span>
|
||||||
|
<span class="p">(</span><span class="nx">el</span> <span class="k">for</span> <span class="nx">el</span> <span class="k">in</span> <span class="nx">candidates</span> <span class="k">when</span> <span class="nx">el</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">prefix</span><span class="p">)</span> <span class="o">is</span> <span class="mi">0</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>Make sure that uncaught exceptions don't kill the REPL.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">process</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'uncaughtException'</span><span class="p">,</span> <span class="nx">error</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>The current backlog of multi-line code.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">backlog = </span><span class="s1">''</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <p>The main REPL function. <strong>run</strong> is called every time a line of code is entered.
|
||||||
Attempt to evaluate the command. If there's an exception, print it out instead
|
Attempt to evaluate the command. If there's an exception, print it out instead
|
||||||
of exiting.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">run = </span><span class="nf">(buffer) -></span>
|
of exiting.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">run = </span><span class="nf">(buffer) -></span>
|
||||||
|
<span class="nv">buffer = </span><span class="nx">buffer</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/[\r\n]+$/</span><span class="p">,</span> <span class="s2">""</span>
|
||||||
|
<span class="k">if</span> <span class="nx">multilineMode</span>
|
||||||
|
<span class="nx">backlog</span> <span class="o">+=</span> <span class="s2">"#{buffer}\n"</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">setPrompt</span> <span class="nx">REPL_PROMPT_CONTINUATION</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">()</span>
|
||||||
|
<span class="k">return</span>
|
||||||
<span class="k">if</span> <span class="o">!</span><span class="nx">buffer</span><span class="p">.</span><span class="nx">toString</span><span class="p">().</span><span class="nx">trim</span><span class="p">()</span> <span class="o">and</span> <span class="o">!</span><span class="nx">backlog</span>
|
<span class="k">if</span> <span class="o">!</span><span class="nx">buffer</span><span class="p">.</span><span class="nx">toString</span><span class="p">().</span><span class="nx">trim</span><span class="p">()</span> <span class="o">and</span> <span class="o">!</span><span class="nx">backlog</span>
|
||||||
<span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">()</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">()</span>
|
||||||
<span class="k">return</span>
|
<span class="k">return</span>
|
||||||
|
@ -29,51 +55,70 @@ of exiting.</p> </td> <td class="code"> <d
|
||||||
<span class="nv">backlog = </span><span class="s1">''</span>
|
<span class="nv">backlog = </span><span class="s1">''</span>
|
||||||
<span class="k">try</span>
|
<span class="k">try</span>
|
||||||
<span class="nv">_ = </span><span class="nx">global</span><span class="p">.</span><span class="nx">_</span>
|
<span class="nv">_ = </span><span class="nx">global</span><span class="p">.</span><span class="nx">_</span>
|
||||||
<span class="nv">returnValue = </span><span class="nx">CoffeeScript</span><span class="p">.</span><span class="nb">eval</span> <span class="s2">"_=(#{code}\n)"</span><span class="p">,</span> <span class="p">{</span>
|
<span class="nv">returnValue = </span><span class="nx">CoffeeScript</span><span class="p">.</span><span class="nb">eval</span> <span class="s2">"_=(undefined\n;#{code}\n)"</span><span class="p">,</span> <span class="p">{</span>
|
||||||
<span class="nv">filename: </span><span class="s1">'repl'</span>
|
<span class="nv">filename: </span><span class="s1">'repl'</span>
|
||||||
<span class="nv">modulename: </span><span class="s1">'repl'</span>
|
<span class="nv">modulename: </span><span class="s1">'repl'</span>
|
||||||
<span class="p">}</span>
|
<span class="p">}</span>
|
||||||
<span class="k">if</span> <span class="nx">returnValue</span> <span class="o">is</span> <span class="kc">undefined</span>
|
<span class="k">if</span> <span class="nx">returnValue</span> <span class="o">is</span> <span class="kc">undefined</span>
|
||||||
<span class="nv">global._ = </span><span class="nx">_</span>
|
<span class="nv">global._ = </span><span class="nx">_</span>
|
||||||
<span class="nx">process</span><span class="p">.</span><span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="nx">inspect</span><span class="p">(</span><span class="nx">returnValue</span><span class="p">,</span> <span class="kc">no</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">enableColours</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'\n'</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">write</span> <span class="s2">"#{inspect returnValue, no, 2, enableColours}\n"</span>
|
||||||
<span class="k">catch</span> <span class="nx">err</span>
|
<span class="k">catch</span> <span class="nx">err</span>
|
||||||
<span class="nx">error</span> <span class="nx">err</span>
|
<span class="nx">error</span> <span class="nx">err</span>
|
||||||
<span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <h1>Autocompletion</h1> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Regexes to match complete-able bits of text.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">ACCESSOR = </span><span class="sr">/\s*([\w\.]+)(?:\.(\w*))$/</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">()</span>
|
||||||
<span class="nv">SIMPLEVAR = </span><span class="sr">/\s*(\w*)$/i</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>Returns a list of completions, and the completed text.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">autocomplete = </span><span class="nf">(text) -></span>
|
|
||||||
<span class="nx">completeAttribute</span><span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="o">or</span> <span class="nx">completeVariable</span><span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="o">or</span> <span class="p">[[],</span> <span class="nx">text</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>Attempt to autocomplete a chained dotted attribute: <code>one.two.three</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">completeAttribute = </span><span class="nf">(text) -></span>
|
<span class="k">if</span> <span class="nx">stdin</span><span class="p">.</span><span class="nx">readable</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <p>handle piped input</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">pipedInput = </span><span class="s1">''</span>
|
||||||
<span class="k">if</span> <span class="nv">match = </span><span class="nx">text</span><span class="p">.</span><span class="nx">match</span> <span class="nx">ACCESSOR</span>
|
<span class="nv">repl =</span>
|
||||||
<span class="p">[</span><span class="nx">all</span><span class="p">,</span> <span class="nx">obj</span><span class="p">,</span> <span class="nx">prefix</span><span class="p">]</span> <span class="o">=</span> <span class="nx">match</span>
|
<span class="nv">prompt: </span><span class="o">-></span> <span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="nx">@_prompt</span>
|
||||||
<span class="k">try</span>
|
<span class="nv">setPrompt: </span><span class="nf">(p) -></span> <span class="vi">@_prompt = </span><span class="nx">p</span>
|
||||||
<span class="nv">val = </span><span class="nx">Script</span><span class="p">.</span><span class="nx">runInThisContext</span> <span class="nx">obj</span>
|
<span class="nv">input: </span><span class="nx">stdin</span>
|
||||||
<span class="k">catch</span> <span class="nx">error</span>
|
<span class="nv">output: </span><span class="nx">stdout</span>
|
||||||
<span class="k">return</span>
|
<span class="kc">on</span><span class="o">:</span> <span class="o">-></span>
|
||||||
<span class="nv">completions = </span><span class="nx">getCompletions</span> <span class="nx">prefix</span><span class="p">,</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">getOwnPropertyNames</span> <span class="nx">val</span>
|
<span class="nx">stdin</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'data'</span><span class="p">,</span> <span class="nf">(chunk) -></span>
|
||||||
<span class="p">[</span><span class="nx">completions</span><span class="p">,</span> <span class="nx">prefix</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>Attempt to autocomplete an in-scope free variable: <code>one</code>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">completeVariable = </span><span class="nf">(text) -></span>
|
<span class="nx">pipedInput</span> <span class="o">+=</span> <span class="nx">chunk</span>
|
||||||
<span class="nv">free = </span><span class="p">(</span><span class="nx">text</span><span class="p">.</span><span class="nx">match</span> <span class="nx">SIMPLEVAR</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
<span class="nx">stdin</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'end'</span><span class="p">,</span> <span class="o">-></span>
|
||||||
<span class="k">if</span> <span class="nx">free</span><span class="o">?</span>
|
<span class="k">for</span> <span class="nx">line</span> <span class="k">in</span> <span class="nx">pipedInput</span><span class="p">.</span><span class="nx">trim</span><span class="p">().</span><span class="nx">split</span> <span class="s2">"\n"</span>
|
||||||
<span class="nv">vars = </span><span class="nx">Script</span><span class="p">.</span><span class="nx">runInThisContext</span> <span class="s1">'Object.getOwnPropertyNames(this)'</span>
|
<span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="s2">"#{line}\n"</span>
|
||||||
<span class="nv">keywords = </span><span class="p">(</span><span class="nx">r</span> <span class="k">for</span> <span class="nx">r</span> <span class="k">in</span> <span class="nx">CoffeeScript</span><span class="p">.</span><span class="nx">RESERVED</span> <span class="k">when</span> <span class="nx">r</span><span class="p">[</span><span class="mi">0</span><span class="p">..</span><span class="mi">1</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">'__'</span><span class="p">)</span>
|
<span class="nx">run</span> <span class="nx">line</span>
|
||||||
<span class="nv">possibilities = </span><span class="nx">vars</span><span class="p">.</span><span class="nx">concat</span> <span class="nx">keywords</span>
|
<span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="s1">'\n'</span>
|
||||||
<span class="nv">completions = </span><span class="nx">getCompletions</span> <span class="nx">free</span><span class="p">,</span> <span class="nx">possibilities</span>
|
<span class="nx">process</span><span class="p">.</span><span class="nx">exit</span> <span class="mi">0</span>
|
||||||
<span class="p">[</span><span class="nx">completions</span><span class="p">,</span> <span class="nx">free</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Return elements of candidates for which <code>prefix</code> is a prefix.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">getCompletions = </span><span class="nf">(prefix, candidates) -></span>
|
<span class="k">else</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">¶</a> </div> <p>Create the REPL by listening to <strong>stdin</strong>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span> <span class="nx">readline</span><span class="p">.</span><span class="nx">createInterface</span><span class="p">.</span><span class="nx">length</span> <span class="o"><</span> <span class="mi">3</span>
|
||||||
<span class="p">(</span><span class="nx">el</span> <span class="k">for</span> <span class="nx">el</span> <span class="k">in</span> <span class="nx">candidates</span> <span class="k">when</span> <span class="nx">el</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">prefix</span><span class="p">)</span> <span class="o">is</span> <span class="mi">0</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <p>Make sure that uncaught exceptions don't kill the REPL.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">process</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'uncaughtException'</span><span class="p">,</span> <span class="nx">error</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <p>Create the REPL by listening to <strong>stdin</strong>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">if</span> <span class="nx">readline</span><span class="p">.</span><span class="nx">createInterface</span><span class="p">.</span><span class="nx">length</span> <span class="o"><</span> <span class="mi">3</span>
|
<span class="nv">repl = </span><span class="nx">readline</span><span class="p">.</span><span class="nx">createInterface</span> <span class="nx">stdin</span><span class="p">,</span> <span class="nx">autocomplete</span>
|
||||||
<span class="nv">repl = </span><span class="nx">readline</span><span class="p">.</span><span class="nx">createInterface</span> <span class="nx">stdin</span><span class="p">,</span> <span class="nx">autocomplete</span>
|
<span class="nx">stdin</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'data'</span><span class="p">,</span> <span class="nf">(buffer) -></span> <span class="nx">repl</span><span class="p">.</span><span class="nx">write</span> <span class="nx">buffer</span>
|
||||||
<span class="nx">stdin</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'data'</span><span class="p">,</span> <span class="nf">(buffer) -></span> <span class="nx">repl</span><span class="p">.</span><span class="nx">write</span> <span class="nx">buffer</span>
|
<span class="k">else</span>
|
||||||
<span class="k">else</span>
|
<span class="nv">repl = </span><span class="nx">readline</span><span class="p">.</span><span class="nx">createInterface</span> <span class="nx">stdin</span><span class="p">,</span> <span class="nx">stdout</span><span class="p">,</span> <span class="nx">autocomplete</span>
|
||||||
<span class="nv">repl = </span><span class="nx">readline</span><span class="p">.</span><span class="nx">createInterface</span> <span class="nx">stdin</span><span class="p">,</span> <span class="nx">stdout</span><span class="p">,</span> <span class="nx">autocomplete</span>
|
|
||||||
|
<span class="nv">multilineMode = </span><span class="kc">off</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>Handle multi-line mode switch</p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">repl</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'keypress'</span><span class="p">,</span> <span class="nf">(char, key) -></span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-19">¶</a> </div> <p>test for Ctrl-v</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">return</span> <span class="nx">unless</span> <span class="nx">key</span> <span class="o">and</span> <span class="nx">key</span><span class="p">.</span><span class="nx">ctrl</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">key</span><span class="p">.</span><span class="nx">meta</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">key</span><span class="p">.</span><span class="nx">shift</span> <span class="o">and</span> <span class="nx">key</span><span class="p">.</span><span class="nx">name</span> <span class="o">is</span> <span class="s1">'v'</span>
|
||||||
|
<span class="nv">cursorPos = </span><span class="nx">repl</span><span class="p">.</span><span class="nx">cursor</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">cursorTo</span> <span class="mi">0</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">clearLine</span> <span class="mi">1</span>
|
||||||
|
<span class="nv">multilineMode = </span><span class="o">not</span> <span class="nx">multilineMode</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">_line</span><span class="p">()</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">multilineMode</span> <span class="o">and</span> <span class="nx">backlog</span>
|
||||||
|
<span class="nv">backlog = </span><span class="s1">''</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">setPrompt</span> <span class="p">(</span><span class="nv">newPrompt = </span><span class="k">if</span> <span class="nx">multilineMode</span> <span class="k">then</span> <span class="nx">REPL_PROMPT_MULTILINE</span> <span class="k">else</span> <span class="nx">REPL_PROMPT</span><span class="p">)</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">()</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">cursorTo</span> <span class="nx">newPrompt</span><span class="p">.</span><span class="nx">length</span> <span class="o">+</span> <span class="p">(</span><span class="nv">repl.cursor = </span><span class="nx">cursorPos</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-20">¶</a> </div> <p>Handle Ctrl-d press at end of last line in multiline mode</p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">repl</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'keypress'</span><span class="p">,</span> <span class="nf">(char, key) -></span>
|
||||||
|
<span class="k">return</span> <span class="nx">unless</span> <span class="nx">multilineMode</span> <span class="o">and</span> <span class="nx">repl</span><span class="p">.</span><span class="nx">line</span></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-21">¶</a> </div> <p>test for Ctrl-d</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">return</span> <span class="nx">unless</span> <span class="nx">key</span> <span class="o">and</span> <span class="nx">key</span><span class="p">.</span><span class="nx">ctrl</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">key</span><span class="p">.</span><span class="nx">meta</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">key</span><span class="p">.</span><span class="nx">shift</span> <span class="o">and</span> <span class="nx">key</span><span class="p">.</span><span class="nx">name</span> <span class="o">is</span> <span class="s1">'d'</span>
|
||||||
|
<span class="nv">multilineMode = </span><span class="kc">off</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">_line</span><span class="p">()</span>
|
||||||
|
|
||||||
<span class="nx">repl</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'attemptClose'</span><span class="p">,</span> <span class="o">-></span>
|
<span class="nx">repl</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'attemptClose'</span><span class="p">,</span> <span class="o">-></span>
|
||||||
|
<span class="k">if</span> <span class="nx">multilineMode</span>
|
||||||
|
<span class="nv">multilineMode = </span><span class="kc">off</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">cursorTo</span> <span class="mi">0</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">clearLine</span> <span class="mi">1</span>
|
||||||
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">_onLine</span> <span class="nx">repl</span><span class="p">.</span><span class="nx">line</span>
|
||||||
|
<span class="k">return</span>
|
||||||
<span class="k">if</span> <span class="nx">backlog</span>
|
<span class="k">if</span> <span class="nx">backlog</span>
|
||||||
<span class="nv">backlog = </span><span class="s1">''</span>
|
<span class="nv">backlog = </span><span class="s1">''</span>
|
||||||
<span class="nx">process</span><span class="p">.</span><span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="s1">'\n'</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">write</span> <span class="s1">'\n'</span>
|
||||||
<span class="nx">repl</span><span class="p">.</span><span class="nx">setPrompt</span> <span class="nx">REPL_PROMPT</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">setPrompt</span> <span class="nx">REPL_PROMPT</span>
|
||||||
<span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">()</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">prompt</span><span class="p">()</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="nx">repl</span><span class="p">.</span><span class="nx">close</span><span class="p">()</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">close</span><span class="p">()</span>
|
||||||
|
|
||||||
<span class="nx">repl</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'close'</span><span class="p">,</span> <span class="o">-></span>
|
<span class="nx">repl</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'close'</span><span class="p">,</span> <span class="o">-></span>
|
||||||
<span class="nx">process</span><span class="p">.</span><span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span> <span class="s1">'\n'</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">output</span><span class="p">.</span><span class="nx">write</span> <span class="s1">'\n'</span>
|
||||||
<span class="nx">stdin</span><span class="p">.</span><span class="nx">destroy</span><span class="p">()</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="nx">input</span><span class="p">.</span><span class="nx">destroy</span><span class="p">()</span>
|
||||||
|
|
||||||
<span class="nx">repl</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'line'</span><span class="p">,</span> <span class="nx">run</span>
|
<span class="nx">repl</span><span class="p">.</span><span class="kc">on</span> <span class="s1">'line'</span><span class="p">,</span> <span class="nx">run</span>
|
||||||
|
|
||||||
|
|
|
@ -50,52 +50,51 @@ this, remove their trailing newlines.</p> </td> <td clas
|
||||||
<span class="mi">0</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>The lexer has tagged the opening parenthesis of a method call. Match it with
|
<span class="mi">0</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>The lexer has tagged the opening parenthesis of a method call. Match it with
|
||||||
its paired close. We have the mis-nested outdent case included here for
|
its paired close. We have the mis-nested outdent case included here for
|
||||||
calls that close on the same line, just before their outdent.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">closeOpenCalls: </span><span class="o">-></span>
|
calls that close on the same line, just before their outdent.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">closeOpenCalls: </span><span class="o">-></span>
|
||||||
|
|
||||||
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">')'</span><span class="p">,</span> <span class="s1">'CALL_END'</span><span class="p">]</span> <span class="o">or</span>
|
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">')'</span><span class="p">,</span> <span class="s1">'CALL_END'</span><span class="p">]</span> <span class="o">or</span>
|
||||||
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'OUTDENT'</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">')'</span>
|
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'OUTDENT'</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">')'</span>
|
||||||
|
|
||||||
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="nx">@tokens</span><span class="p">[</span><span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'OUTDENT'</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span> <span class="nx">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'CALL_END'</span>
|
<span class="nx">@tokens</span><span class="p">[</span><span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'OUTDENT'</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span> <span class="nx">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'CALL_END'</span>
|
||||||
|
|
||||||
<span class="nx">@scanTokens</span> <span class="nf">(token, i) -></span>
|
<span class="nx">@scanTokens</span> <span class="nf">(token, i) -></span>
|
||||||
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'CALL_START'</span>
|
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'CALL_START'</span>
|
||||||
<span class="mi">1</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>The lexer has tagged the opening parenthesis of an indexing operation call.
|
<span class="mi">1</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>The lexer has tagged the opening parenthesis of an indexing operation call.
|
||||||
Match it with its paired close.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">closeOpenIndexes: </span><span class="o">-></span>
|
Match it with its paired close.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">closeOpenIndexes: </span><span class="o">-></span>
|
||||||
|
|
||||||
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">']'</span><span class="p">,</span> <span class="s1">'INDEX_END'</span><span class="p">]</span>
|
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">']'</span><span class="p">,</span> <span class="s1">'INDEX_END'</span><span class="p">]</span>
|
||||||
|
|
||||||
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'INDEX_END'</span>
|
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'INDEX_END'</span>
|
||||||
|
|
||||||
<span class="nx">@scanTokens</span> <span class="nf">(token, i) -></span>
|
<span class="nx">@scanTokens</span> <span class="nf">(token, i) -></span>
|
||||||
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'INDEX_START'</span>
|
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span> <span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'INDEX_START'</span>
|
||||||
<span class="mi">1</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Object literals may be written with implicit braces, for simple cases.
|
<span class="mi">1</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Object literals may be written with implicit braces, for simple cases.
|
||||||
Insert the missing braces here, so that the parser doesn't have to.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addImplicitBraces: </span><span class="o">-></span>
|
Insert the missing braces here, so that the parser doesn't have to.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addImplicitBraces: </span><span class="o">-></span>
|
||||||
|
|
||||||
<span class="nv">stack = </span><span class="p">[]</span>
|
<span class="nv">stack = </span><span class="p">[]</span>
|
||||||
<span class="nv">start = </span><span class="kc">null</span>
|
<span class="nv">start = </span><span class="kc">null</span>
|
||||||
<span class="nv">startsLine = </span><span class="kc">null</span>
|
<span class="nv">startsLine = </span><span class="kc">null</span>
|
||||||
<span class="nv">sameLine = </span><span class="kc">yes</span>
|
<span class="nv">sameLine = </span><span class="kc">yes</span>
|
||||||
<span class="nv">startIndent = </span><span class="mi">0</span>
|
<span class="nv">startIndent = </span><span class="mi">0</span>
|
||||||
|
|
||||||
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="p">[</span><span class="nx">one</span><span class="p">,</span> <span class="nx">two</span><span class="p">,</span> <span class="nx">three</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">..</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">3</span><span class="p">]</span>
|
<span class="p">[</span><span class="nx">one</span><span class="p">,</span> <span class="nx">two</span><span class="p">,</span> <span class="nx">three</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">..</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">3</span><span class="p">]</span>
|
||||||
<span class="k">return</span> <span class="kc">no</span> <span class="k">if</span> <span class="s1">'HERECOMMENT'</span> <span class="o">is</span> <span class="nx">one</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
<span class="k">return</span> <span class="kc">no</span> <span class="k">if</span> <span class="s1">'HERECOMMENT'</span> <span class="o">is</span> <span class="nx">one</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="nx">tag</span><span class="p">]</span> <span class="o">=</span> <span class="nx">token</span>
|
<span class="p">[</span><span class="nx">tag</span><span class="p">]</span> <span class="o">=</span> <span class="nx">token</span>
|
||||||
<span class="nv">sameLine = </span><span class="kc">no</span> <span class="k">if</span> <span class="nx">tag</span> <span class="k">in</span> <span class="nx">LINEBREAKS</span>
|
<span class="nv">sameLine = </span><span class="kc">no</span> <span class="k">if</span> <span class="nx">tag</span> <span class="k">in</span> <span class="nx">LINEBREAKS</span>
|
||||||
<span class="p">((</span><span class="nx">tag</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">]</span> <span class="o">or</span> <span class="p">(</span><span class="nx">tag</span> <span class="k">in</span> <span class="nx">IMPLICIT_END</span> <span class="o">and</span> <span class="nx">sameLine</span><span class="p">))</span> <span class="o">and</span>
|
<span class="p">((</span><span class="nx">tag</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">]</span> <span class="o">or</span> <span class="p">(</span><span class="nx">tag</span> <span class="k">in</span> <span class="nx">IMPLICIT_END</span> <span class="o">and</span> <span class="nx">sameLine</span><span class="p">))</span> <span class="o">and</span>
|
||||||
<span class="p">((</span><span class="o">!</span><span class="nx">startsLine</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">isnt</span> <span class="s1">','</span><span class="p">)</span> <span class="o">or</span>
|
<span class="p">((</span><span class="o">!</span><span class="nx">startsLine</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">isnt</span> <span class="s1">','</span><span class="p">)</span> <span class="o">or</span>
|
||||||
<span class="o">not</span> <span class="p">(</span><span class="nx">two</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">':'</span> <span class="o">or</span> <span class="nx">one</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'@'</span> <span class="o">and</span> <span class="nx">three</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">':'</span><span class="p">)))</span> <span class="o">or</span>
|
<span class="o">not</span> <span class="p">(</span><span class="nx">two</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">':'</span> <span class="o">or</span> <span class="nx">one</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'@'</span> <span class="o">and</span> <span class="nx">three</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">':'</span><span class="p">)))</span> <span class="o">or</span>
|
||||||
<span class="p">(</span><span class="nx">tag</span> <span class="o">is</span> <span class="s1">','</span> <span class="o">and</span> <span class="nx">one</span> <span class="o">and</span>
|
<span class="p">(</span><span class="nx">tag</span> <span class="o">is</span> <span class="s1">','</span> <span class="o">and</span> <span class="nx">one</span> <span class="o">and</span>
|
||||||
<span class="nx">one</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">not</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'IDENTIFIER'</span><span class="p">,</span> <span class="s1">'NUMBER'</span><span class="p">,</span> <span class="s1">'STRING'</span><span class="p">,</span> <span class="s1">'@'</span><span class="p">,</span> <span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">])</span>
|
<span class="nx">one</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">not</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'IDENTIFIER'</span><span class="p">,</span> <span class="s1">'NUMBER'</span><span class="p">,</span> <span class="s1">'STRING'</span><span class="p">,</span> <span class="s1">'@'</span><span class="p">,</span> <span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">])</span>
|
||||||
|
|
||||||
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="nv">tok = </span><span class="p">[</span><span class="s1">'}'</span><span class="p">,</span> <span class="s1">'}'</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
|
<span class="nv">tok = </span><span class="nx">@generate</span> <span class="s1">'}'</span><span class="p">,</span> <span class="s1">'}'</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
|
||||||
<span class="nv">tok.generated = </span><span class="kc">yes</span>
|
|
||||||
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">tok</span>
|
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">tok</span>
|
||||||
|
|
||||||
<span class="nx">@scanTokens</span> <span class="nf">(token, i, tokens) -></span>
|
<span class="nx">@scanTokens</span> <span class="nf">(token, i, tokens) -></span>
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nv">tag = </span><span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="k">in</span> <span class="nx">EXPRESSION_START</span>
|
<span class="k">if</span> <span class="p">(</span><span class="nv">tag = </span><span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="k">in</span> <span class="nx">EXPRESSION_START</span>
|
||||||
<span class="nx">stack</span><span class="p">.</span><span class="nx">push</span> <span class="p">[(</span><span class="k">if</span> <span class="nx">tag</span> <span class="o">is</span> <span class="s1">'INDENT'</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'{'</span> <span class="k">then</span> <span class="s1">'{'</span> <span class="k">else</span> <span class="nx">tag</span><span class="p">),</span> <span class="nx">i</span><span class="p">]</span>
|
<span class="nx">stack</span><span class="p">.</span><span class="nx">push</span> <span class="p">[(</span><span class="k">if</span> <span class="nx">tag</span> <span class="o">is</span> <span class="s1">'INDENT'</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'{'</span> <span class="k">then</span> <span class="s1">'{'</span> <span class="k">else</span> <span class="nx">tag</span><span class="p">),</span> <span class="nx">i</span><span class="p">]</span>
|
||||||
|
@ -113,16 +112,15 @@ Insert the missing braces here, so that the parser doesn't have to.</p>
|
||||||
<span class="nv">startsLine = </span><span class="o">not</span> <span class="nx">prevTag</span> <span class="o">or</span> <span class="p">(</span><span class="nx">prevTag</span> <span class="k">in</span> <span class="nx">LINEBREAKS</span><span class="p">)</span>
|
<span class="nv">startsLine = </span><span class="o">not</span> <span class="nx">prevTag</span> <span class="o">or</span> <span class="p">(</span><span class="nx">prevTag</span> <span class="k">in</span> <span class="nx">LINEBREAKS</span><span class="p">)</span>
|
||||||
<span class="nv">value = </span><span class="k">new</span> <span class="nb">String</span><span class="p">(</span><span class="s1">'{'</span><span class="p">)</span>
|
<span class="nv">value = </span><span class="k">new</span> <span class="nb">String</span><span class="p">(</span><span class="s1">'{'</span><span class="p">)</span>
|
||||||
<span class="nv">value.generated = </span><span class="kc">yes</span>
|
<span class="nv">value.generated = </span><span class="kc">yes</span>
|
||||||
<span class="nv">tok = </span><span class="p">[</span><span class="s1">'{'</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
|
<span class="nv">tok = </span><span class="nx">@generate</span> <span class="s1">'{'</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
|
||||||
<span class="nv">tok.generated = </span><span class="kc">yes</span>
|
|
||||||
<span class="nx">tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">idx</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">tok</span>
|
<span class="nx">tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">idx</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">tok</span>
|
||||||
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
|
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
|
||||||
<span class="mi">2</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>Methods may be optionally called without parentheses, for simple cases.
|
<span class="mi">2</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>Methods may be optionally called without parentheses, for simple cases.
|
||||||
Insert the implicit parentheses here, so that the parser doesn't have to
|
Insert the implicit parentheses here, so that the parser doesn't have to
|
||||||
deal with them.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addImplicitParentheses: </span><span class="o">-></span>
|
deal with them.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addImplicitParentheses: </span><span class="o">-></span>
|
||||||
|
|
||||||
<span class="nv">noCall = seenSingle = seenControl = </span><span class="kc">no</span>
|
<span class="nv">noCall = seenSingle = seenControl = </span><span class="kc">no</span>
|
||||||
|
|
||||||
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="p">[</span><span class="nx">tag</span><span class="p">]</span> <span class="o">=</span> <span class="nx">token</span>
|
<span class="p">[</span><span class="nx">tag</span><span class="p">]</span> <span class="o">=</span> <span class="nx">token</span>
|
||||||
<span class="k">return</span> <span class="kc">yes</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">seenSingle</span> <span class="o">and</span> <span class="nx">token</span><span class="p">.</span><span class="nx">fromThen</span>
|
<span class="k">return</span> <span class="kc">yes</span> <span class="k">if</span> <span class="o">not</span> <span class="nx">seenSingle</span> <span class="o">and</span> <span class="nx">token</span><span class="p">.</span><span class="nx">fromThen</span>
|
||||||
|
@ -134,13 +132,13 @@ deal with them.</p> </td> <td class="code">
|
||||||
<span class="p">(</span><span class="nx">tag</span> <span class="o">isnt</span> <span class="s1">'INDENT'</span> <span class="o">or</span>
|
<span class="p">(</span><span class="nx">tag</span> <span class="o">isnt</span> <span class="s1">'INDENT'</span> <span class="o">or</span>
|
||||||
<span class="p">(</span><span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">not</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'CLASS'</span><span class="p">,</span> <span class="s1">'EXTENDS'</span><span class="p">]</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">not</span> <span class="k">in</span> <span class="nx">IMPLICIT_BLOCK</span> <span class="o">and</span>
|
<span class="p">(</span><span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span> <span class="o">not</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'CLASS'</span><span class="p">,</span> <span class="s1">'EXTENDS'</span><span class="p">]</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">not</span> <span class="k">in</span> <span class="nx">IMPLICIT_BLOCK</span> <span class="o">and</span>
|
||||||
<span class="o">not</span> <span class="p">((</span><span class="nv">post = </span><span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span> <span class="o">and</span> <span class="nx">post</span><span class="p">.</span><span class="nx">generated</span> <span class="o">and</span> <span class="nx">post</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'{'</span><span class="p">)))</span>
|
<span class="o">not</span> <span class="p">((</span><span class="nv">post = </span><span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span> <span class="o">and</span> <span class="nx">post</span><span class="p">.</span><span class="nx">generated</span> <span class="o">and</span> <span class="nx">post</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'{'</span><span class="p">)))</span>
|
||||||
|
|
||||||
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="s1">'CALL_END'</span><span class="p">,</span> <span class="s1">')'</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
|
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">@generate</span> <span class="s1">'CALL_END'</span><span class="p">,</span> <span class="s1">')'</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
|
||||||
|
|
||||||
<span class="nx">@scanTokens</span> <span class="nf">(token, i, tokens) -></span>
|
<span class="nx">@scanTokens</span> <span class="nf">(token, i, tokens) -></span>
|
||||||
<span class="nv">tag = </span><span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
<span class="nv">tag = </span><span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
<span class="nv">noCall = </span><span class="kc">yes</span> <span class="k">if</span> <span class="nx">tag</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'CLASS'</span><span class="p">,</span> <span class="s1">'IF'</span><span class="p">]</span>
|
<span class="nv">noCall = </span><span class="kc">yes</span> <span class="k">if</span> <span class="nx">tag</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'CLASS'</span><span class="p">,</span> <span class="s1">'IF'</span><span class="p">,</span> <span class="s1">'FOR'</span><span class="p">,</span> <span class="s1">'WHILE'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="nx">prev</span><span class="p">,</span> <span class="nx">current</span><span class="p">,</span> <span class="nx">next</span><span class="p">]</span> <span class="o">=</span> <span class="nx">tokens</span><span class="p">[</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">..</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
|
<span class="p">[</span><span class="nx">prev</span><span class="p">,</span> <span class="nx">current</span><span class="p">,</span> <span class="nx">next</span><span class="p">]</span> <span class="o">=</span> <span class="nx">tokens</span><span class="p">[</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">..</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
|
||||||
<span class="nv">callObject = </span><span class="o">not</span> <span class="nx">noCall</span> <span class="o">and</span> <span class="nx">tag</span> <span class="o">is</span> <span class="s1">'INDENT'</span> <span class="o">and</span>
|
<span class="nv">callObject = </span><span class="o">not</span> <span class="nx">noCall</span> <span class="o">and</span> <span class="nx">tag</span> <span class="o">is</span> <span class="s1">'INDENT'</span> <span class="o">and</span>
|
||||||
<span class="nx">next</span> <span class="o">and</span> <span class="nx">next</span><span class="p">.</span><span class="nx">generated</span> <span class="o">and</span> <span class="nx">next</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'{'</span> <span class="o">and</span>
|
<span class="nx">next</span> <span class="o">and</span> <span class="nx">next</span><span class="p">.</span><span class="nx">generated</span> <span class="o">and</span> <span class="nx">next</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'{'</span> <span class="o">and</span>
|
||||||
|
@ -153,23 +151,23 @@ deal with them.</p> </td> <td class="code">
|
||||||
<span class="k">return</span> <span class="mi">1</span> <span class="nx">unless</span> <span class="nx">callObject</span> <span class="o">or</span>
|
<span class="k">return</span> <span class="mi">1</span> <span class="nx">unless</span> <span class="nx">callObject</span> <span class="o">or</span>
|
||||||
<span class="nx">prev</span><span class="o">?</span><span class="p">.</span><span class="nx">spaced</span> <span class="o">and</span> <span class="p">(</span><span class="nx">prev</span><span class="p">.</span><span class="nx">call</span> <span class="o">or</span> <span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="nx">IMPLICIT_FUNC</span><span class="p">)</span> <span class="o">and</span>
|
<span class="nx">prev</span><span class="o">?</span><span class="p">.</span><span class="nx">spaced</span> <span class="o">and</span> <span class="p">(</span><span class="nx">prev</span><span class="p">.</span><span class="nx">call</span> <span class="o">or</span> <span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="nx">IMPLICIT_FUNC</span><span class="p">)</span> <span class="o">and</span>
|
||||||
<span class="p">(</span><span class="nx">tag</span> <span class="k">in</span> <span class="nx">IMPLICIT_CALL</span> <span class="o">or</span> <span class="o">not</span> <span class="p">(</span><span class="nx">token</span><span class="p">.</span><span class="nx">spaced</span> <span class="o">or</span> <span class="nx">token</span><span class="p">.</span><span class="nx">newLine</span><span class="p">)</span> <span class="o">and</span> <span class="nx">tag</span> <span class="k">in</span> <span class="nx">IMPLICIT_UNSPACED_CALL</span><span class="p">)</span>
|
<span class="p">(</span><span class="nx">tag</span> <span class="k">in</span> <span class="nx">IMPLICIT_CALL</span> <span class="o">or</span> <span class="o">not</span> <span class="p">(</span><span class="nx">token</span><span class="p">.</span><span class="nx">spaced</span> <span class="o">or</span> <span class="nx">token</span><span class="p">.</span><span class="nx">newLine</span><span class="p">)</span> <span class="o">and</span> <span class="nx">tag</span> <span class="k">in</span> <span class="nx">IMPLICIT_UNSPACED_CALL</span><span class="p">)</span>
|
||||||
<span class="nx">tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="s1">'CALL_START'</span><span class="p">,</span> <span class="s1">'('</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
|
<span class="nx">tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">@generate</span> <span class="s1">'CALL_START'</span><span class="p">,</span> <span class="s1">'('</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
|
||||||
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
|
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
|
||||||
<span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'FUNC_EXIST'</span> <span class="k">if</span> <span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'?'</span>
|
<span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'FUNC_EXIST'</span> <span class="k">if</span> <span class="nx">prev</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'?'</span>
|
||||||
<span class="mi">2</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>Because our grammar is LALR(1), it can't handle some single-line
|
<span class="mi">2</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>Because our grammar is LALR(1), it can't handle some single-line
|
||||||
expressions that lack ending delimiters. The <strong>Rewriter</strong> adds the implicit
|
expressions that lack ending delimiters. The <strong>Rewriter</strong> adds the implicit
|
||||||
blocks, so it doesn't need to. ')' can close a single-line block,
|
blocks, so it doesn't need to. ')' can close a single-line block,
|
||||||
but we need to make sure it's balanced.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addImplicitIndentation: </span><span class="o">-></span>
|
but we need to make sure it's balanced.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">addImplicitIndentation: </span><span class="o">-></span>
|
||||||
|
|
||||||
<span class="nv">starter = indent = outdent = </span><span class="kc">null</span>
|
<span class="nv">starter = indent = outdent = </span><span class="kc">null</span>
|
||||||
|
|
||||||
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="nx">token</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">';'</span> <span class="o">and</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="nx">SINGLE_CLOSERS</span> <span class="o">and</span>
|
<span class="nx">token</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">';'</span> <span class="o">and</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="nx">SINGLE_CLOSERS</span> <span class="o">and</span>
|
||||||
<span class="o">not</span> <span class="p">(</span><span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'ELSE'</span> <span class="o">and</span> <span class="nx">starter</span> <span class="o">not</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'IF'</span><span class="p">,</span> <span class="s1">'THEN'</span><span class="p">])</span>
|
<span class="o">not</span> <span class="p">(</span><span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'ELSE'</span> <span class="o">and</span> <span class="nx">starter</span> <span class="o">not</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'IF'</span><span class="p">,</span> <span class="s1">'THEN'</span><span class="p">])</span>
|
||||||
|
|
||||||
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="p">(</span><span class="k">if</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">','</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span> <span class="nx">i</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">outdent</span>
|
<span class="nx">@tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="p">(</span><span class="k">if</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">','</span> <span class="k">then</span> <span class="nx">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span> <span class="nx">i</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">outdent</span>
|
||||||
|
|
||||||
<span class="nx">@scanTokens</span> <span class="nf">(token, i, tokens) -></span>
|
<span class="nx">@scanTokens</span> <span class="nf">(token, i, tokens) -></span>
|
||||||
<span class="p">[</span><span class="nx">tag</span><span class="p">]</span> <span class="o">=</span> <span class="nx">token</span>
|
<span class="p">[</span><span class="nx">tag</span><span class="p">]</span> <span class="o">=</span> <span class="nx">token</span>
|
||||||
<span class="k">if</span> <span class="nx">tag</span> <span class="o">is</span> <span class="s1">'TERMINATOR'</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'THEN'</span>
|
<span class="k">if</span> <span class="nx">tag</span> <span class="o">is</span> <span class="s1">'TERMINATOR'</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'THEN'</span>
|
||||||
|
@ -184,31 +182,36 @@ but we need to make sure it's balanced.</p> </td> <td cl
|
||||||
<span class="k">if</span> <span class="nx">tag</span> <span class="k">in</span> <span class="nx">SINGLE_LINERS</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">isnt</span> <span class="s1">'INDENT'</span> <span class="o">and</span>
|
<span class="k">if</span> <span class="nx">tag</span> <span class="k">in</span> <span class="nx">SINGLE_LINERS</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">isnt</span> <span class="s1">'INDENT'</span> <span class="o">and</span>
|
||||||
<span class="o">not</span> <span class="p">(</span><span class="nx">tag</span> <span class="o">is</span> <span class="s1">'ELSE'</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'IF'</span><span class="p">)</span>
|
<span class="o">not</span> <span class="p">(</span><span class="nx">tag</span> <span class="o">is</span> <span class="s1">'ELSE'</span> <span class="o">and</span> <span class="nx">@tag</span><span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">is</span> <span class="s1">'IF'</span><span class="p">)</span>
|
||||||
<span class="nv">starter = </span><span class="nx">tag</span>
|
<span class="nv">starter = </span><span class="nx">tag</span>
|
||||||
<span class="p">[</span><span class="nx">indent</span><span class="p">,</span> <span class="nx">outdent</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@indentation</span> <span class="nx">token</span>
|
<span class="p">[</span><span class="nx">indent</span><span class="p">,</span> <span class="nx">outdent</span><span class="p">]</span> <span class="o">=</span> <span class="nx">@indentation</span> <span class="nx">token</span><span class="p">,</span> <span class="kc">yes</span>
|
||||||
<span class="nv">indent.fromThen = </span><span class="kc">true</span> <span class="k">if</span> <span class="nx">starter</span> <span class="o">is</span> <span class="s1">'THEN'</span>
|
<span class="nv">indent.fromThen = </span><span class="kc">true</span> <span class="k">if</span> <span class="nx">starter</span> <span class="o">is</span> <span class="s1">'THEN'</span>
|
||||||
<span class="nv">indent.generated = outdent.generated = </span><span class="kc">true</span>
|
|
||||||
<span class="nx">tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">indent</span>
|
<span class="nx">tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">indent</span>
|
||||||
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
|
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
|
||||||
<span class="nx">tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">1</span> <span class="k">if</span> <span class="nx">tag</span> <span class="o">is</span> <span class="s1">'THEN'</span>
|
<span class="nx">tokens</span><span class="p">.</span><span class="nx">splice</span> <span class="nx">i</span><span class="p">,</span> <span class="mi">1</span> <span class="k">if</span> <span class="nx">tag</span> <span class="o">is</span> <span class="s1">'THEN'</span>
|
||||||
<span class="k">return</span> <span class="mi">1</span>
|
<span class="k">return</span> <span class="mi">1</span>
|
||||||
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>Tag postfix conditionals as such, so that we can parse them with a
|
<span class="k">return</span> <span class="mi">1</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>Tag postfix conditionals as such, so that we can parse them with a
|
||||||
different precedence.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">tagPostfixConditionals: </span><span class="o">-></span>
|
different precedence.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">tagPostfixConditionals: </span><span class="o">-></span>
|
||||||
|
|
||||||
<span class="nv">original = </span><span class="kc">null</span>
|
<span class="nv">original = </span><span class="kc">null</span>
|
||||||
|
|
||||||
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
<span class="nv">condition = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'INDENT'</span><span class="p">]</span>
|
<span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">in</span> <span class="p">[</span><span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'INDENT'</span><span class="p">]</span>
|
||||||
|
|
||||||
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
<span class="nv">action = </span><span class="nf">(token, i) -></span>
|
||||||
<span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">'INDENT'</span> <span class="o">or</span> <span class="p">(</span><span class="nx">token</span><span class="p">.</span><span class="nx">generated</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">token</span><span class="p">.</span><span class="nx">fromThen</span><span class="p">)</span>
|
<span class="k">if</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">isnt</span> <span class="s1">'INDENT'</span> <span class="o">or</span> <span class="p">(</span><span class="nx">token</span><span class="p">.</span><span class="nx">generated</span> <span class="o">and</span> <span class="o">not</span> <span class="nx">token</span><span class="p">.</span><span class="nx">fromThen</span><span class="p">)</span>
|
||||||
<span class="nx">original</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'POST_'</span> <span class="o">+</span> <span class="nx">original</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
<span class="nx">original</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'POST_'</span> <span class="o">+</span> <span class="nx">original</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
|
|
||||||
<span class="nx">@scanTokens</span> <span class="nf">(token, i) -></span>
|
<span class="nx">@scanTokens</span> <span class="nf">(token, i) -></span>
|
||||||
<span class="k">return</span> <span class="mi">1</span> <span class="nx">unless</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'IF'</span>
|
<span class="k">return</span> <span class="mi">1</span> <span class="nx">unless</span> <span class="nx">token</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">is</span> <span class="s1">'IF'</span>
|
||||||
<span class="nv">original = </span><span class="nx">token</span>
|
<span class="nv">original = </span><span class="nx">token</span>
|
||||||
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
|
<span class="nx">@detectEnd</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">condition</span><span class="p">,</span> <span class="nx">action</span>
|
||||||
<span class="mi">1</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Generate the indentation tokens, based on another token on the same line.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">indentation: </span><span class="nf">(token) -></span>
|
<span class="mi">1</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Generate the indentation tokens, based on another token on the same line.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">indentation: </span><span class="nf">(token, implicit = no) -></span>
|
||||||
<span class="p">[[</span><span class="s1">'INDENT'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]],</span> <span class="p">[</span><span class="s1">'OUTDENT'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]]</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <p>Look up a tag by token index.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">tag: </span><span class="nf">(i) -></span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">¶</a> </div> <p>List of the token pairs that must be balanced.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">BALANCED_PAIRS = </span><span class="p">[</span>
|
<span class="nv">indent = </span><span class="p">[</span><span class="s1">'INDENT'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
|
||||||
|
<span class="nv">outdent = </span><span class="p">[</span><span class="s1">'OUTDENT'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="nx">token</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
|
||||||
|
<span class="nv">indent.generated = outdent.generated = </span><span class="kc">yes</span> <span class="k">if</span> <span class="nx">implicit</span>
|
||||||
|
<span class="p">[</span><span class="nx">indent</span><span class="p">,</span> <span class="nx">outdent</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <p>Create a generated token: one that exists due to a use of implicit syntax.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">generate: </span><span class="nf">(tag, value, line) -></span>
|
||||||
|
<span class="nv">tok = </span><span class="p">[</span><span class="nx">tag</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">line</span><span class="p">]</span>
|
||||||
|
<span class="nv">tok.generated = </span><span class="kc">yes</span>
|
||||||
|
<span class="nx">tok</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <p>Look up a tag by token index.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">tag: </span><span class="nf">(i) -></span> <span class="nx">@tokens</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="o">?</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">¶</a> </div> <h2>Constants</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>List of the token pairs that must be balanced.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">BALANCED_PAIRS = </span><span class="p">[</span>
|
||||||
<span class="p">[</span><span class="s1">'('</span><span class="p">,</span> <span class="s1">')'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'('</span><span class="p">,</span> <span class="s1">')'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'['</span><span class="p">,</span> <span class="s1">']'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'['</span><span class="p">,</span> <span class="s1">']'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'{'</span><span class="p">,</span> <span class="s1">'}'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'{'</span><span class="p">,</span> <span class="s1">'}'</span><span class="p">]</span>
|
||||||
|
@ -216,20 +219,20 @@ different precedence.</p> </td> <td class="code">
|
||||||
<span class="p">[</span><span class="s1">'CALL_START'</span><span class="p">,</span> <span class="s1">'CALL_END'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'CALL_START'</span><span class="p">,</span> <span class="s1">'CALL_END'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'PARAM_START'</span><span class="p">,</span> <span class="s1">'PARAM_END'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'PARAM_START'</span><span class="p">,</span> <span class="s1">'PARAM_END'</span><span class="p">]</span>
|
||||||
<span class="p">[</span><span class="s1">'INDEX_START'</span><span class="p">,</span> <span class="s1">'INDEX_END'</span><span class="p">]</span>
|
<span class="p">[</span><span class="s1">'INDEX_START'</span><span class="p">,</span> <span class="s1">'INDEX_END'</span><span class="p">]</span>
|
||||||
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>The inverse mappings of <code>BALANCED_PAIRS</code> we're trying to fix up, so we can
|
<span class="p">]</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-19">¶</a> </div> <p>The inverse mappings of <code>BALANCED_PAIRS</code> we're trying to fix up, so we can
|
||||||
look things up from either end.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.INVERSES = INVERSES = </span><span class="p">{}</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-19">¶</a> </div> <p>The tokens that signal the start/end of a balanced pair.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_START = </span><span class="p">[]</span>
|
look things up from either end.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.INVERSES = INVERSES = </span><span class="p">{}</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-20">¶</a> </div> <p>The tokens that signal the start/end of a balanced pair.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_START = </span><span class="p">[]</span>
|
||||||
<span class="nv">EXPRESSION_END = </span><span class="p">[]</span>
|
<span class="nv">EXPRESSION_END = </span><span class="p">[]</span>
|
||||||
|
|
||||||
<span class="k">for</span> <span class="p">[</span><span class="nx">left</span><span class="p">,</span> <span class="nx">rite</span><span class="p">]</span> <span class="k">in</span> <span class="nx">BALANCED_PAIRS</span>
|
<span class="k">for</span> <span class="p">[</span><span class="nx">left</span><span class="p">,</span> <span class="nx">rite</span><span class="p">]</span> <span class="k">in</span> <span class="nx">BALANCED_PAIRS</span>
|
||||||
<span class="nx">EXPRESSION_START</span><span class="p">.</span><span class="nx">push</span> <span class="nx">INVERSES</span><span class="p">[</span><span class="nx">rite</span><span class="p">]</span> <span class="o">=</span> <span class="nx">left</span>
|
<span class="nx">EXPRESSION_START</span><span class="p">.</span><span class="nx">push</span> <span class="nx">INVERSES</span><span class="p">[</span><span class="nx">rite</span><span class="p">]</span> <span class="o">=</span> <span class="nx">left</span>
|
||||||
<span class="nx">EXPRESSION_END</span> <span class="p">.</span><span class="nx">push</span> <span class="nx">INVERSES</span><span class="p">[</span><span class="nx">left</span><span class="p">]</span> <span class="o">=</span> <span class="nx">rite</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-20">¶</a> </div> <p>Tokens that indicate the close of a clause of an expression.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_CLOSE = </span><span class="p">[</span><span class="s1">'CATCH'</span><span class="p">,</span> <span class="s1">'WHEN'</span><span class="p">,</span> <span class="s1">'ELSE'</span><span class="p">,</span> <span class="s1">'FINALLY'</span><span class="p">].</span><span class="nx">concat</span> <span class="nx">EXPRESSION_END</span></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-21">¶</a> </div> <p>Tokens that, if followed by an <code>IMPLICIT_CALL</code>, indicate a function invocation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_FUNC = </span><span class="p">[</span><span class="s1">'IDENTIFIER'</span><span class="p">,</span> <span class="s1">'SUPER'</span><span class="p">,</span> <span class="s1">')'</span><span class="p">,</span> <span class="s1">'CALL_END'</span><span class="p">,</span> <span class="s1">']'</span><span class="p">,</span> <span class="s1">'INDEX_END'</span><span class="p">,</span> <span class="s1">'@'</span><span class="p">,</span> <span class="s1">'THIS'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-22">¶</a> </div> <p>If preceded by an <code>IMPLICIT_FUNC</code>, indicates a function invocation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_CALL = </span><span class="p">[</span>
|
<span class="nx">EXPRESSION_END</span> <span class="p">.</span><span class="nx">push</span> <span class="nx">INVERSES</span><span class="p">[</span><span class="nx">left</span><span class="p">]</span> <span class="o">=</span> <span class="nx">rite</span></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-21">¶</a> </div> <p>Tokens that indicate the close of a clause of an expression.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">EXPRESSION_CLOSE = </span><span class="p">[</span><span class="s1">'CATCH'</span><span class="p">,</span> <span class="s1">'WHEN'</span><span class="p">,</span> <span class="s1">'ELSE'</span><span class="p">,</span> <span class="s1">'FINALLY'</span><span class="p">].</span><span class="nx">concat</span> <span class="nx">EXPRESSION_END</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-22">¶</a> </div> <p>Tokens that, if followed by an <code>IMPLICIT_CALL</code>, indicate a function invocation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_FUNC = </span><span class="p">[</span><span class="s1">'IDENTIFIER'</span><span class="p">,</span> <span class="s1">'SUPER'</span><span class="p">,</span> <span class="s1">')'</span><span class="p">,</span> <span class="s1">'CALL_END'</span><span class="p">,</span> <span class="s1">']'</span><span class="p">,</span> <span class="s1">'INDEX_END'</span><span class="p">,</span> <span class="s1">'@'</span><span class="p">,</span> <span class="s1">'THIS'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-23">¶</a> </div> <p>If preceded by an <code>IMPLICIT_FUNC</code>, indicates a function invocation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_CALL = </span><span class="p">[</span>
|
||||||
<span class="s1">'IDENTIFIER'</span><span class="p">,</span> <span class="s1">'NUMBER'</span><span class="p">,</span> <span class="s1">'STRING'</span><span class="p">,</span> <span class="s1">'JS'</span><span class="p">,</span> <span class="s1">'REGEX'</span><span class="p">,</span> <span class="s1">'NEW'</span><span class="p">,</span> <span class="s1">'PARAM_START'</span><span class="p">,</span> <span class="s1">'CLASS'</span>
|
<span class="s1">'IDENTIFIER'</span><span class="p">,</span> <span class="s1">'NUMBER'</span><span class="p">,</span> <span class="s1">'STRING'</span><span class="p">,</span> <span class="s1">'JS'</span><span class="p">,</span> <span class="s1">'REGEX'</span><span class="p">,</span> <span class="s1">'NEW'</span><span class="p">,</span> <span class="s1">'PARAM_START'</span><span class="p">,</span> <span class="s1">'CLASS'</span>
|
||||||
<span class="s1">'IF'</span><span class="p">,</span> <span class="s1">'TRY'</span><span class="p">,</span> <span class="s1">'SWITCH'</span><span class="p">,</span> <span class="s1">'THIS'</span><span class="p">,</span> <span class="s1">'BOOL'</span><span class="p">,</span> <span class="s1">'UNARY'</span><span class="p">,</span> <span class="s1">'SUPER'</span>
|
<span class="s1">'IF'</span><span class="p">,</span> <span class="s1">'TRY'</span><span class="p">,</span> <span class="s1">'SWITCH'</span><span class="p">,</span> <span class="s1">'THIS'</span><span class="p">,</span> <span class="s1">'BOOL'</span><span class="p">,</span> <span class="s1">'UNARY'</span><span class="p">,</span> <span class="s1">'SUPER'</span>
|
||||||
<span class="s1">'@'</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="s1">'=>'</span><span class="p">,</span> <span class="s1">'['</span><span class="p">,</span> <span class="s1">'('</span><span class="p">,</span> <span class="s1">'{'</span><span class="p">,</span> <span class="s1">'--'</span><span class="p">,</span> <span class="s1">'++'</span>
|
<span class="s1">'@'</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="s1">'=>'</span><span class="p">,</span> <span class="s1">'['</span><span class="p">,</span> <span class="s1">'('</span><span class="p">,</span> <span class="s1">'{'</span><span class="p">,</span> <span class="s1">'--'</span><span class="p">,</span> <span class="s1">'++'</span>
|
||||||
<span class="p">]</span>
|
<span class="p">]</span>
|
||||||
|
|
||||||
<span class="nv">IMPLICIT_UNSPACED_CALL = </span><span class="p">[</span><span class="s1">'+'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-23">¶</a> </div> <p>Tokens indicating that the implicit call must enclose a block of expressions.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_BLOCK = </span><span class="p">[</span><span class="s1">'->'</span><span class="p">,</span> <span class="s1">'=>'</span><span class="p">,</span> <span class="s1">'{'</span><span class="p">,</span> <span class="s1">'['</span><span class="p">,</span> <span class="s1">','</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-24">¶</a> </div> <p>Tokens that always mark the end of an implicit call for single-liners.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_END = </span><span class="p">[</span><span class="s1">'POST_IF'</span><span class="p">,</span> <span class="s1">'FOR'</span><span class="p">,</span> <span class="s1">'WHILE'</span><span class="p">,</span> <span class="s1">'UNTIL'</span><span class="p">,</span> <span class="s1">'WHEN'</span><span class="p">,</span> <span class="s1">'BY'</span><span class="p">,</span> <span class="s1">'LOOP'</span><span class="p">,</span> <span class="s1">'TERMINATOR'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-25">¶</a> </div> <p>Single-line flavors of block expressions that have unclosed endings.
|
<span class="nv">IMPLICIT_UNSPACED_CALL = </span><span class="p">[</span><span class="s1">'+'</span><span class="p">,</span> <span class="s1">'-'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-24">¶</a> </div> <p>Tokens indicating that the implicit call must enclose a block of expressions.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_BLOCK = </span><span class="p">[</span><span class="s1">'->'</span><span class="p">,</span> <span class="s1">'=>'</span><span class="p">,</span> <span class="s1">'{'</span><span class="p">,</span> <span class="s1">'['</span><span class="p">,</span> <span class="s1">','</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-25">¶</a> </div> <p>Tokens that always mark the end of an implicit call for single-liners.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">IMPLICIT_END = </span><span class="p">[</span><span class="s1">'POST_IF'</span><span class="p">,</span> <span class="s1">'FOR'</span><span class="p">,</span> <span class="s1">'WHILE'</span><span class="p">,</span> <span class="s1">'UNTIL'</span><span class="p">,</span> <span class="s1">'WHEN'</span><span class="p">,</span> <span class="s1">'BY'</span><span class="p">,</span> <span class="s1">'LOOP'</span><span class="p">,</span> <span class="s1">'TERMINATOR'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-26">¶</a> </div> <p>Single-line flavors of block expressions that have unclosed endings.
|
||||||
The grammar can't disambiguate them, so we insert the implicit indentation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">SINGLE_LINERS = </span><span class="p">[</span><span class="s1">'ELSE'</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="s1">'=>'</span><span class="p">,</span> <span class="s1">'TRY'</span><span class="p">,</span> <span class="s1">'FINALLY'</span><span class="p">,</span> <span class="s1">'THEN'</span><span class="p">]</span>
|
The grammar can't disambiguate them, so we insert the implicit indentation.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">SINGLE_LINERS = </span><span class="p">[</span><span class="s1">'ELSE'</span><span class="p">,</span> <span class="s1">'->'</span><span class="p">,</span> <span class="s1">'=>'</span><span class="p">,</span> <span class="s1">'TRY'</span><span class="p">,</span> <span class="s1">'FINALLY'</span><span class="p">,</span> <span class="s1">'THEN'</span><span class="p">]</span>
|
||||||
<span class="nv">SINGLE_CLOSERS = </span><span class="p">[</span><span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'CATCH'</span><span class="p">,</span> <span class="s1">'FINALLY'</span><span class="p">,</span> <span class="s1">'ELSE'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">,</span> <span class="s1">'LEADING_WHEN'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-26">¶</a> </div> <p>Tokens that end a line.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LINEBREAKS = </span><span class="p">[</span><span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'INDENT'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">]</span>
|
<span class="nv">SINGLE_CLOSERS = </span><span class="p">[</span><span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'CATCH'</span><span class="p">,</span> <span class="s1">'FINALLY'</span><span class="p">,</span> <span class="s1">'ELSE'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">,</span> <span class="s1">'LEADING_WHEN'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-27">¶</a> </div> <p>Tokens that end a line.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">LINEBREAKS = </span><span class="p">[</span><span class="s1">'TERMINATOR'</span><span class="p">,</span> <span class="s1">'INDENT'</span><span class="p">,</span> <span class="s1">'OUTDENT'</span><span class="p">]</span>
|
||||||
|
|
||||||
</pre></div> </td> </tr> </tbody> </table> </div> </body> </html>
|
</pre></div> </td> </tr> </tbody> </table> </div> </body> </html>
|
|
@ -29,7 +29,7 @@ walks up to the root scope.</p> </td> <td class="code">
|
||||||
<span class="k">return</span> <span class="nx">found</span> <span class="k">if</span> <span class="nx">found</span> <span class="o">or</span> <span class="nx">immediate</span>
|
<span class="k">return</span> <span class="nx">found</span> <span class="k">if</span> <span class="nx">found</span> <span class="o">or</span> <span class="nx">immediate</span>
|
||||||
<span class="o">!!</span><span class="nx">@parent</span><span class="o">?</span><span class="p">.</span><span class="nx">check</span> <span class="nx">name</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Generate a temporary variable name at the given index.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">temporary: </span><span class="nf">(name, index) -></span>
|
<span class="o">!!</span><span class="nx">@parent</span><span class="o">?</span><span class="p">.</span><span class="nx">check</span> <span class="nx">name</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Generate a temporary variable name at the given index.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">temporary: </span><span class="nf">(name, index) -></span>
|
||||||
<span class="k">if</span> <span class="nx">name</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">1</span>
|
<span class="k">if</span> <span class="nx">name</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">1</span>
|
||||||
<span class="s1">'_'</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">index</span> <span class="o">></span> <span class="mi">1</span> <span class="k">then</span> <span class="nx">index</span> <span class="k">else</span> <span class="s1">''</span>
|
<span class="s1">'_'</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="k">if</span> <span class="nx">index</span> <span class="o">></span> <span class="mi">1</span> <span class="k">then</span> <span class="nx">index</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span> <span class="s1">''</span>
|
||||||
<span class="k">else</span>
|
<span class="k">else</span>
|
||||||
<span class="s1">'_'</span> <span class="o">+</span> <span class="p">(</span><span class="nx">index</span> <span class="o">+</span> <span class="nb">parseInt</span> <span class="nx">name</span><span class="p">,</span> <span class="mi">36</span><span class="p">).</span><span class="nx">toString</span><span class="p">(</span><span class="mi">36</span><span class="p">).</span><span class="nx">replace</span> <span class="sr">/\d/g</span><span class="p">,</span> <span class="s1">'a'</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Gets the type of a variable.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">type: </span><span class="nf">(name) -></span>
|
<span class="s1">'_'</span> <span class="o">+</span> <span class="p">(</span><span class="nx">index</span> <span class="o">+</span> <span class="nb">parseInt</span> <span class="nx">name</span><span class="p">,</span> <span class="mi">36</span><span class="p">).</span><span class="nx">toString</span><span class="p">(</span><span class="mi">36</span><span class="p">).</span><span class="nx">replace</span> <span class="sr">/\d/g</span><span class="p">,</span> <span class="s1">'a'</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Gets the type of a variable.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">type: </span><span class="nf">(name) -></span>
|
||||||
<span class="k">return</span> <span class="nx">v</span><span class="p">.</span><span class="nx">type</span> <span class="k">for</span> <span class="nx">v</span> <span class="k">in</span> <span class="nx">@variables</span> <span class="k">when</span> <span class="nx">v</span><span class="p">.</span><span class="nx">name</span> <span class="o">is</span> <span class="nx">name</span>
|
<span class="k">return</span> <span class="nx">v</span><span class="p">.</span><span class="nx">type</span> <span class="k">for</span> <span class="nx">v</span> <span class="k">in</span> <span class="nx">@variables</span> <span class="k">when</span> <span class="nx">v</span><span class="p">.</span><span class="nx">name</span> <span class="o">is</span> <span class="nx">name</span>
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
return '' unless File.exists?("documentation/js/#{file}.js")
|
return '' unless File.exists?("documentation/js/#{file}.js")
|
||||||
cs = File.read("documentation/coffee/#{file}.coffee")
|
cs = File.read("documentation/coffee/#{file}.coffee")
|
||||||
js = File.read("documentation/js/#{file}.js")
|
js = File.read("documentation/js/#{file}.js")
|
||||||
|
js = js.sub(/^\/\/ generated.*?\n/i, '')
|
||||||
cshtml = Uv.parse(cs, 'xhtml', 'coffeescript', false, 'idle', false)
|
cshtml = Uv.parse(cs, 'xhtml', 'coffeescript', false, 'idle', false)
|
||||||
jshtml = Uv.parse(js, 'xhtml', 'javascript', false, 'idle', false)
|
jshtml = Uv.parse(js, 'xhtml', 'javascript', false, 'idle', false)
|
||||||
append = executable == true ? '' : "alert(#{executable});"
|
append = executable == true ? '' : "alert(#{executable});"
|
||||||
|
@ -128,13 +129,13 @@
|
||||||
seamlessly from CoffeeScript (and vice-versa). The compiled output is
|
seamlessly from CoffeeScript (and vice-versa). The compiled output is
|
||||||
readable and pretty-printed, passes through
|
readable and pretty-printed, passes through
|
||||||
<a href="http://www.javascriptlint.com/">JavaScript Lint</a>
|
<a href="http://www.javascriptlint.com/">JavaScript Lint</a>
|
||||||
without warnings, will work in every JavaScript implementation, and tends
|
without warnings, will work in every JavaScript runtime, and tends
|
||||||
to run as fast or faster than the equivalent handwritten JavaScript.
|
to run as fast or faster than the equivalent handwritten JavaScript.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<b>Latest Version:</b>
|
<b>Latest Version:</b>
|
||||||
<a href="http://github.com/jashkenas/coffee-script/tarball/1.2.0">1.2.0</a>
|
<a href="http://github.com/jashkenas/coffee-script/tarball/1.3.0">1.3.0</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>
|
<h2>
|
||||||
|
@ -188,12 +189,6 @@ npm install -g coffee-script</pre>
|
||||||
<pre>
|
<pre>
|
||||||
sudo bin/cake install</pre>
|
sudo bin/cake install</pre>
|
||||||
|
|
||||||
<p>
|
|
||||||
If installing on Ubuntu or Debian,
|
|
||||||
<a href="http://opinionatedprogrammer.com/2010/12/installing-coffeescript-on-debian-or-ubuntu/">be
|
|
||||||
careful not to use the existing out-of-date package</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>
|
<h2>
|
||||||
<span id="usage" class="bookmark"></span>
|
<span id="usage" class="bookmark"></span>
|
||||||
Usage
|
Usage
|
||||||
|
@ -348,7 +343,7 @@ Expressions
|
||||||
<tt>coffee -o lib/ -cw src/</tt>
|
<tt>coffee -o lib/ -cw src/</tt>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Start the CoffeeScript REPL:<br />
|
Start the CoffeeScript REPL (<tt>Ctrl-D</tt> to exit, <tt>Ctrl-V</tt>for multi-line):<br />
|
||||||
<tt>coffee</tt>
|
<tt>coffee</tt>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -1108,6 +1103,56 @@ Expressions
|
||||||
Change Log
|
Change Log
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<b class="header" style="margin-top: 20px;">
|
||||||
|
<a href="https://github.com/jashkenas/coffee-script/compare/1.2.0...1.3.0">1.3.0</a>
|
||||||
|
<span class="timestamp"> – <small>April 10, 2012</small></span>
|
||||||
|
</b>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
CoffeeScript now enforces all of JavaScript's <b>Strict Mode</b> early syntax
|
||||||
|
errors at compile time. This includes old-style octal literals,
|
||||||
|
duplicate property names in object literals, duplicate parameters in
|
||||||
|
a function definition, deleting naked variables, setting the value of
|
||||||
|
<tt>eval</tt> or <tt>arguments</tt>, and more.
|
||||||
|
See a full discussion at
|
||||||
|
<a href="https://github.com/jashkenas/coffee-script/issues/1547">#1547</a>.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
The REPL now has a handy new multi-line mode for entering large
|
||||||
|
blocks of code. It's useful when copy-and-pasting examples into the
|
||||||
|
REPL. Enter multi-line mode with <tt>Ctrl-V</tt>. You may also now
|
||||||
|
pipe input directly into the REPL.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
CoffeeScript now prints a <tt>Generated by CoffeeScript VERSION</tt>
|
||||||
|
header at the top of each compiled file.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Conditional assignment of previously undefined variables
|
||||||
|
<tt>a or= b</tt> is now considered a syntax error.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
A tweak to the semantics of <tt>do</tt>, which can now be used to
|
||||||
|
more easily simulate a namespace: <tt>do (x = 1, y = 2) -> ...</tt>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Loop indices are now mutable within a loop iteration, and immutable
|
||||||
|
between them.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Both endpoints of a slice are now allowed to be omitted for consistency,
|
||||||
|
effectively creating a shallow copy of the list.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Additional tweaks and improvments to <tt>coffee --watch</tt> under
|
||||||
|
Node's "new" file watching API. Watch will now beep by default
|
||||||
|
if you introduce a syntax error into a watched script. We also now
|
||||||
|
ignore hidden directories by default when watching recursively.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<b class="header" style="margin-top: 20px;">
|
<b class="header" style="margin-top: 20px;">
|
||||||
<a href="https://github.com/jashkenas/coffee-script/compare/1.1.3...1.2.0">1.2.0</a>
|
<a href="https://github.com/jashkenas/coffee-script/compare/1.1.3...1.2.0">1.2.0</a>
|
||||||
|
|
|
@ -1,13 +1,24 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var volume, winner;
|
var volume, winner;
|
||||||
|
|
||||||
if (ignition === true) launch();
|
if (ignition === true) {
|
||||||
|
launch();
|
||||||
|
}
|
||||||
|
|
||||||
if (band !== SpinalTap) volume = 10;
|
if (band !== SpinalTap) {
|
||||||
|
volume = 10;
|
||||||
|
}
|
||||||
|
|
||||||
if (answer !== false) letTheWildRumpusBegin();
|
if (answer !== false) {
|
||||||
|
letTheWildRumpusBegin();
|
||||||
|
}
|
||||||
|
|
||||||
if (car.speed < limit) accelerate();
|
if (car.speed < limit) {
|
||||||
|
accelerate();
|
||||||
|
}
|
||||||
|
|
||||||
if (pick === 47 || pick === 92 || pick === 13) winner = true;
|
if (pick === 47 || pick === 92 || pick === 13) {
|
||||||
|
winner = true;
|
||||||
|
}
|
||||||
|
|
||||||
print(inspect("My name is " + this.name));
|
print(inspect("My name is " + this.name));
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
var courses, dish, food, foods, i, _i, _j, _len, _len2, _len3, _ref;
|
// Generated by CoffeeScript 1.3.0
|
||||||
|
var courses, dish, food, foods, i, _i, _j, _k, _len, _len1, _len2, _ref;
|
||||||
|
|
||||||
_ref = ['toast', 'cheese', 'wine'];
|
_ref = ['toast', 'cheese', 'wine'];
|
||||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
@ -8,14 +9,16 @@ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
|
||||||
courses = ['greens', 'caviar', 'truffles', 'roast', 'cake'];
|
courses = ['greens', 'caviar', 'truffles', 'roast', 'cake'];
|
||||||
|
|
||||||
for (i = 0, _len2 = courses.length; i < _len2; i++) {
|
for (i = _j = 0, _len1 = courses.length; _j < _len1; i = ++_j) {
|
||||||
dish = courses[i];
|
dish = courses[i];
|
||||||
menu(i + 1, dish);
|
menu(i + 1, dish);
|
||||||
}
|
}
|
||||||
|
|
||||||
foods = ['broccoli', 'spinach', 'chocolate'];
|
foods = ['broccoli', 'spinach', 'chocolate'];
|
||||||
|
|
||||||
for (_j = 0, _len3 = foods.length; _j < _len3; _j++) {
|
for (_k = 0, _len2 = foods.length; _k < _len2; _k++) {
|
||||||
food = foods[_j];
|
food = foods[_k];
|
||||||
if (food !== 'chocolate') eat(food);
|
if (food !== 'chocolate') {
|
||||||
|
eat(food);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
/*
|
/*
|
||||||
CoffeeScript Compiler v1.2.0
|
CoffeeScript Compiler v1.3.0
|
||||||
Released under the MIT License
|
Released under the MIT License
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var fs;
|
var fs;
|
||||||
|
|
||||||
fs = require('fs');
|
fs = require('fs');
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var Animal, Horse, Snake, sam, tom,
|
var Animal, Horse, Snake, sam, tom,
|
||||||
__hasProp = Object.prototype.hasOwnProperty,
|
__hasProp = {}.hasOwnProperty,
|
||||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
|
||||||
|
|
||||||
Animal = (function() {
|
Animal = (function() {
|
||||||
|
|
||||||
|
Animal.name = 'Animal';
|
||||||
|
|
||||||
function Animal(name) {
|
function Animal(name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
@ -20,8 +23,10 @@ Snake = (function(_super) {
|
||||||
|
|
||||||
__extends(Snake, _super);
|
__extends(Snake, _super);
|
||||||
|
|
||||||
|
Snake.name = 'Snake';
|
||||||
|
|
||||||
function Snake() {
|
function Snake() {
|
||||||
Snake.__super__.constructor.apply(this, arguments);
|
return Snake.__super__.constructor.apply(this, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
Snake.prototype.move = function() {
|
Snake.prototype.move = function() {
|
||||||
|
@ -37,8 +42,10 @@ Horse = (function(_super) {
|
||||||
|
|
||||||
__extends(Horse, _super);
|
__extends(Horse, _super);
|
||||||
|
|
||||||
|
Horse.name = 'Horse';
|
||||||
|
|
||||||
function Horse() {
|
function Horse() {
|
||||||
Horse.__super__.constructor.apply(this, arguments);
|
return Horse.__super__.constructor.apply(this, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
Horse.prototype.move = function() {
|
Horse.prototype.move = function() {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var cholesterol, healthy;
|
var cholesterol, healthy;
|
||||||
|
|
||||||
cholesterol = 127;
|
cholesterol = 127;
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var date, mood;
|
var date, mood;
|
||||||
|
|
||||||
if (singing) mood = greatlyImproved;
|
if (singing) {
|
||||||
|
mood = greatlyImproved;
|
||||||
|
}
|
||||||
|
|
||||||
if (happy && knowsIt) {
|
if (happy && knowsIt) {
|
||||||
clapsHands();
|
clapsHands();
|
||||||
|
@ -10,5 +13,3 @@ if (happy && knowsIt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
date = friday ? sue : jill;
|
date = friday ? sue : jill;
|
||||||
|
|
||||||
options || (options = defaults);
|
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var fill;
|
var fill;
|
||||||
|
|
||||||
fill = function(container, liquid) {
|
fill = function(container, liquid) {
|
||||||
if (liquid == null) liquid = "coffee";
|
if (liquid == null) {
|
||||||
|
liquid = "coffee";
|
||||||
|
}
|
||||||
return "Filling the " + container + " with " + liquid + "...";
|
return "Filling the " + container + " with " + liquid + "...";
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var filename, _fn, _i, _len;
|
var filename, _fn, _i, _len;
|
||||||
|
|
||||||
_fn = function(filename) {
|
_fn = function(filename) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var hi;
|
var hi;
|
||||||
|
|
||||||
hi = function() {
|
hi = function() {
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
var footprints, solipsism;
|
// Generated by CoffeeScript 1.3.0
|
||||||
|
var footprints, solipsism, speed;
|
||||||
|
|
||||||
if ((typeof mind !== "undefined" && mind !== null) && !(typeof world !== "undefined" && world !== null)) {
|
if ((typeof mind !== "undefined" && mind !== null) && !(typeof world !== "undefined" && world !== null)) {
|
||||||
solipsism = true;
|
solipsism = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof speed === "undefined" || speed === null) speed = 75;
|
speed = 0;
|
||||||
|
|
||||||
|
if (speed == null) {
|
||||||
|
speed = 15;
|
||||||
|
}
|
||||||
|
|
||||||
footprints = typeof yeti !== "undefined" && yeti !== null ? yeti : "bear";
|
footprints = typeof yeti !== "undefined" && yeti !== null ? yeti : "bear";
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var eldest, grade;
|
var eldest, grade;
|
||||||
|
|
||||||
grade = function(student) {
|
grade = function(student) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var one, six, three, two;
|
var one, six, three, two;
|
||||||
|
|
||||||
six = (one = 1) + (two = 2) + (three = 3);
|
six = (one = 1) + (two = 2) + (three = 3);
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var globals, name;
|
var globals, name;
|
||||||
|
|
||||||
globals = ((function() {
|
globals = ((function() {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
|
|
||||||
alert((function() {
|
alert((function() {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var Account;
|
var Account;
|
||||||
|
|
||||||
Account = function(customer, cart) {
|
Account = function(customer, cart) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var cube, square;
|
var cube, square;
|
||||||
|
|
||||||
square = function(x) {
|
square = function(x) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var html;
|
var html;
|
||||||
|
|
||||||
html = "<strong>\n cup of coffeescript\n</strong>";
|
html = "<strong>\n cup of coffeescript\n</strong>";
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var OPERATOR;
|
var OPERATOR;
|
||||||
|
|
||||||
OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/;
|
OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var author, quote, sentence;
|
var author, quote, sentence;
|
||||||
|
|
||||||
author = "Wittgenstein";
|
author = "Wittgenstein";
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var city, forecast, temp, weatherReport, _ref;
|
var city, forecast, temp, weatherReport, _ref;
|
||||||
|
|
||||||
weatherReport = function(location) {
|
weatherReport = function(location) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var age, ages, child, yearsOld;
|
var age, ages, child, yearsOld;
|
||||||
|
|
||||||
yearsOld = {
|
yearsOld = {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
var city, futurists, name, street, _ref, _ref2;
|
// Generated by CoffeeScript 1.3.0
|
||||||
|
var city, futurists, name, street, _ref, _ref1;
|
||||||
|
|
||||||
futurists = {
|
futurists = {
|
||||||
sculptor: "Umberto Boccioni",
|
sculptor: "Umberto Boccioni",
|
||||||
|
@ -9,4 +10,4 @@ futurists = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_ref = futurists.poet, name = _ref.name, (_ref2 = _ref.address, street = _ref2[0], city = _ref2[1]);
|
_ref = futurists.poet, name = _ref.name, (_ref1 = _ref.address, street = _ref1[0], city = _ref1[1]);
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var bitlist, kids, singers, song;
|
var bitlist, kids, singers, song;
|
||||||
|
|
||||||
song = ["do", "re", "mi", "fa", "so"];
|
song = ["do", "re", "mi", "fa", "so"];
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
|
|
||||||
$('.account').attr({
|
$('.account').attr({
|
||||||
"class": 'active'
|
"class": 'active'
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var cubes, list, math, num, number, opposite, race, square,
|
var cubes, list, math, num, number, opposite, race, square,
|
||||||
__slice = Array.prototype.slice;
|
__slice = [].slice;
|
||||||
|
|
||||||
number = 42;
|
number = 42;
|
||||||
|
|
||||||
opposite = true;
|
opposite = true;
|
||||||
|
|
||||||
if (opposite) number = -42;
|
if (opposite) {
|
||||||
|
number = -42;
|
||||||
|
}
|
||||||
|
|
||||||
square = function(x) {
|
square = function(x) {
|
||||||
return x * x;
|
return x * x;
|
||||||
|
@ -27,7 +30,9 @@ race = function() {
|
||||||
return print(winner, runners);
|
return print(winner, runners);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (typeof elvis !== "undefined" && elvis !== null) alert("I knew it!");
|
if (typeof elvis !== "undefined" && elvis !== null) {
|
||||||
|
alert("I knew it!");
|
||||||
|
}
|
||||||
|
|
||||||
cubes = (function() {
|
cubes = (function() {
|
||||||
var _i, _len, _results;
|
var _i, _len, _results;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var theBait, theSwitch, _ref;
|
var theBait, theSwitch, _ref;
|
||||||
|
|
||||||
theBait = 1000;
|
theBait = 1000;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var close, contents, open, tag, _i, _ref,
|
var close, contents, open, tag, _i, _ref,
|
||||||
__slice = Array.prototype.slice;
|
__slice = [].slice;
|
||||||
|
|
||||||
tag = "<impossible>";
|
tag = "<impossible>";
|
||||||
|
|
||||||
|
|
1
documentation/js/prototypes.js
vendored
1
documentation/js/prototypes.js
vendored
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
|
|
||||||
String.prototype.dasherize = function() {
|
String.prototype.dasherize = function() {
|
||||||
return this.replace(/_/g, "-");
|
return this.replace(/_/g, "-");
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var countdown, num;
|
var countdown, num;
|
||||||
|
|
||||||
countdown = (function() {
|
countdown = (function() {
|
||||||
var _results;
|
var _i, _results;
|
||||||
_results = [];
|
_results = [];
|
||||||
for (num = 10; num >= 1; num--) {
|
for (num = _i = 10; _i >= 1; num = --_i) {
|
||||||
_results.push(num);
|
_results.push(num);
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var changeNumbers, inner, outer;
|
var changeNumbers, inner, outer;
|
||||||
|
|
||||||
outer = 1;
|
outer = 1;
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
var copy, middle, numbers;
|
// Generated by CoffeeScript 1.3.0
|
||||||
|
var copy, end, middle, numbers, start;
|
||||||
|
|
||||||
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
|
||||||
|
|
||||||
copy = numbers.slice(0, numbers.length);
|
start = numbers.slice(0, 3);
|
||||||
|
|
||||||
middle = copy.slice(3, 7);
|
middle = numbers.slice(3, 6);
|
||||||
|
|
||||||
|
end = numbers.slice(6);
|
||||||
|
|
||||||
|
copy = numbers.slice(0);
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var zip, _ref;
|
var zip, _ref;
|
||||||
|
|
||||||
zip = typeof lottery.drawWinner === "function" ? (_ref = lottery.drawWinner().address) != null ? _ref.zipcode : void 0 : void 0;
|
zip = typeof lottery.drawWinner === "function" ? (_ref = lottery.drawWinner().address) != null ? _ref.zipcode : void 0 : void 0;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var awardMedals, contenders, gold, rest, silver,
|
var awardMedals, contenders, gold, rest, silver,
|
||||||
__slice = Array.prototype.slice;
|
__slice = [].slice;
|
||||||
|
|
||||||
gold = silver = rest = "unknown";
|
gold = silver = rest = "unknown";
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var numbers, _ref;
|
var numbers, _ref;
|
||||||
|
|
||||||
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var mobyDick;
|
var mobyDick;
|
||||||
|
|
||||||
mobyDick = "Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world...";
|
mobyDick = "Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world...";
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
|
|
||||||
switch (day) {
|
switch (day) {
|
||||||
case "Mon":
|
case "Mon":
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
|
|
||||||
try {
|
try {
|
||||||
allHellBreaksLoose();
|
allHellBreaksLoose();
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// Generated by CoffeeScript 1.3.0
|
||||||
var lyrics, num;
|
var lyrics, num;
|
||||||
|
|
||||||
if (this.studyingEconomics) {
|
if (this.studyingEconomics) {
|
||||||
|
|
File diff suppressed because one or more lines are too long
246
index.html
246
index.html
|
@ -106,13 +106,13 @@
|
||||||
seamlessly from CoffeeScript (and vice-versa). The compiled output is
|
seamlessly from CoffeeScript (and vice-versa). The compiled output is
|
||||||
readable and pretty-printed, passes through
|
readable and pretty-printed, passes through
|
||||||
<a href="http://www.javascriptlint.com/">JavaScript Lint</a>
|
<a href="http://www.javascriptlint.com/">JavaScript Lint</a>
|
||||||
without warnings, will work in every JavaScript implementation, and tends
|
without warnings, will work in every JavaScript runtime, and tends
|
||||||
to run as fast or faster than the equivalent handwritten JavaScript.
|
to run as fast or faster than the equivalent handwritten JavaScript.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<b>Latest Version:</b>
|
<b>Latest Version:</b>
|
||||||
<a href="http://github.com/jashkenas/coffee-script/tarball/1.2.0">1.2.0</a>
|
<a href="http://github.com/jashkenas/coffee-script/tarball/1.3.0">1.3.0</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>
|
<h2>
|
||||||
|
@ -151,13 +151,15 @@ alert <span class="String"><span class="String">"</span>I knew it!<span cla
|
||||||
<span class="Comment"><span class="Comment">#</span> Array comprehensions:</span>
|
<span class="Comment"><span class="Comment">#</span> Array comprehensions:</span>
|
||||||
cubes <span class="Keyword">=</span> (math.cube num <span class="Keyword">for</span> num <span class="Keyword">in</span> list)
|
cubes <span class="Keyword">=</span> (math.cube num <span class="Keyword">for</span> num <span class="Keyword">in</span> list)
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> cubes, list, math, num, number, opposite, race, square,
|
</pre><pre class="idle"><span class="Storage">var</span> cubes, list, math, num, number, opposite, race, square,
|
||||||
__slice <span class="Keyword">=</span> <span class="LibraryClassType">Array</span>.<span class="LibraryConstant">prototype</span>.slice;
|
__slice <span class="Keyword">=</span> [].slice;
|
||||||
|
|
||||||
number <span class="Keyword">=</span> <span class="Number">42</span>;
|
number <span class="Keyword">=</span> <span class="Number">42</span>;
|
||||||
|
|
||||||
opposite <span class="Keyword">=</span> <span class="BuiltInConstant">true</span>;
|
opposite <span class="Keyword">=</span> <span class="BuiltInConstant">true</span>;
|
||||||
|
|
||||||
<span class="Keyword">if</span> (opposite) number <span class="Keyword">=</span> <span class="Keyword">-</span><span class="Number">42</span>;
|
<span class="Keyword">if</span> (opposite) {
|
||||||
|
number <span class="Keyword">=</span> <span class="Keyword">-</span><span class="Number">42</span>;
|
||||||
|
}
|
||||||
|
|
||||||
<span class="FunctionName">square</span> = <span class="Storage">function</span>(<span class="FunctionArgument">x</span>) {
|
<span class="FunctionName">square</span> = <span class="Storage">function</span>(<span class="FunctionArgument">x</span>) {
|
||||||
<span class="Keyword">return</span> x <span class="Keyword">*</span> x;
|
<span class="Keyword">return</span> x <span class="Keyword">*</span> x;
|
||||||
|
@ -179,7 +181,9 @@ math <span class="Keyword">=</span> {
|
||||||
<span class="Keyword">return</span> <span class="LibraryFunction">print</span>(winner, runners);
|
<span class="Keyword">return</span> <span class="LibraryFunction">print</span>(winner, runners);
|
||||||
};
|
};
|
||||||
|
|
||||||
<span class="Keyword">if</span> (<span class="Keyword">typeof</span> elvis <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">&</span><span class="Keyword">&</span> elvis <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">null</span>) <span class="LibraryFunction">alert</span>(<span class="String"><span class="String">"</span>I knew it!<span class="String">"</span></span>);
|
<span class="Keyword">if</span> (<span class="Keyword">typeof</span> elvis <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">&</span><span class="Keyword">&</span> elvis <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">null</span>) {
|
||||||
|
<span class="LibraryFunction">alert</span>(<span class="String"><span class="String">"</span>I knew it!<span class="String">"</span></span>);
|
||||||
|
}
|
||||||
|
|
||||||
cubes <span class="Keyword">=</span> (<span class="Storage">function</span>() {
|
cubes <span class="Keyword">=</span> (<span class="Storage">function</span>() {
|
||||||
<span class="Storage">var</span> _i, _len, _results;
|
<span class="Storage">var</span> _i, _len, _results;
|
||||||
|
@ -191,13 +195,15 @@ cubes <span class="Keyword">=</span> (<span class="Storage">function</span>() {
|
||||||
<span class="Keyword">return</span> _results;
|
<span class="Keyword">return</span> _results;
|
||||||
})();
|
})();
|
||||||
</pre><script>window.example1 = "# Assignment:\nnumber = 42\nopposite = true\n\n# Conditions:\nnumber = -42 if opposite\n\n# Functions:\nsquare = (x) -> x * x\n\n# Arrays:\nlist = [1, 2, 3, 4, 5]\n\n# Objects:\nmath =\n root: Math.sqrt\n square: square\n cube: (x) -> x * square x\n\n# Splats:\nrace = (winner, runners...) ->\n print winner, runners\n\n# Existence:\nalert \"I knew it!\" if elvis?\n\n# Array comprehensions:\ncubes = (math.cube num for num in list)\n\nalert cubes"</script><div class='minibutton ok' onclick='javascript: var cubes, list, math, num, number, opposite, race, square,
|
</pre><script>window.example1 = "# Assignment:\nnumber = 42\nopposite = true\n\n# Conditions:\nnumber = -42 if opposite\n\n# Functions:\nsquare = (x) -> x * x\n\n# Arrays:\nlist = [1, 2, 3, 4, 5]\n\n# Objects:\nmath =\n root: Math.sqrt\n square: square\n cube: (x) -> x * square x\n\n# Splats:\nrace = (winner, runners...) ->\n print winner, runners\n\n# Existence:\nalert \"I knew it!\" if elvis?\n\n# Array comprehensions:\ncubes = (math.cube num for num in list)\n\nalert cubes"</script><div class='minibutton ok' onclick='javascript: var cubes, list, math, num, number, opposite, race, square,
|
||||||
__slice = Array.prototype.slice;
|
__slice = [].slice;
|
||||||
|
|
||||||
number = 42;
|
number = 42;
|
||||||
|
|
||||||
opposite = true;
|
opposite = true;
|
||||||
|
|
||||||
if (opposite) number = -42;
|
if (opposite) {
|
||||||
|
number = -42;
|
||||||
|
}
|
||||||
|
|
||||||
square = function(x) {
|
square = function(x) {
|
||||||
return x * x;
|
return x * x;
|
||||||
|
@ -219,7 +225,9 @@ race = function() {
|
||||||
return print(winner, runners);
|
return print(winner, runners);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (typeof elvis !== "undefined" && elvis !== null) alert("I knew it!");
|
if (typeof elvis !== "undefined" && elvis !== null) {
|
||||||
|
alert("I knew it!");
|
||||||
|
}
|
||||||
|
|
||||||
cubes = (function() {
|
cubes = (function() {
|
||||||
var _i, _len, _results;
|
var _i, _len, _results;
|
||||||
|
@ -274,12 +282,6 @@ npm install -g coffee-script</pre>
|
||||||
<pre>
|
<pre>
|
||||||
sudo bin/cake install</pre>
|
sudo bin/cake install</pre>
|
||||||
|
|
||||||
<p>
|
|
||||||
If installing on Ubuntu or Debian,
|
|
||||||
<a href="http://opinionatedprogrammer.com/2010/12/installing-coffeescript-on-debian-or-ubuntu/">be
|
|
||||||
careful not to use the existing out-of-date package</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>
|
<h2>
|
||||||
<span id="usage" class="bookmark"></span>
|
<span id="usage" class="bookmark"></span>
|
||||||
Usage
|
Usage
|
||||||
|
@ -434,7 +436,7 @@ Expressions
|
||||||
<tt>coffee -o lib/ -cw src/</tt>
|
<tt>coffee -o lib/ -cw src/</tt>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Start the CoffeeScript REPL:<br />
|
Start the CoffeeScript REPL (<tt>Ctrl-D</tt> to exit, <tt>Ctrl-V</tt>for multi-line):<br />
|
||||||
<tt>coffee</tt>
|
<tt>coffee</tt>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -521,13 +523,17 @@ cube = function(x) {
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> fill;
|
</pre><pre class="idle"><span class="Storage">var</span> fill;
|
||||||
|
|
||||||
<span class="FunctionName">fill</span> = <span class="Storage">function</span>(<span class="FunctionArgument">container, liquid</span>) {
|
<span class="FunctionName">fill</span> = <span class="Storage">function</span>(<span class="FunctionArgument">container, liquid</span>) {
|
||||||
<span class="Keyword">if</span> (liquid <span class="Keyword">==</span> <span class="BuiltInConstant">null</span>) liquid <span class="Keyword">=</span> <span class="String"><span class="String">"</span>coffee<span class="String">"</span></span>;
|
<span class="Keyword">if</span> (liquid <span class="Keyword">==</span> <span class="BuiltInConstant">null</span>) {
|
||||||
|
liquid <span class="Keyword">=</span> <span class="String"><span class="String">"</span>coffee<span class="String">"</span></span>;
|
||||||
|
}
|
||||||
<span class="Keyword">return</span> <span class="String"><span class="String">"</span>Filling the <span class="String">"</span></span> <span class="Keyword">+</span> container <span class="Keyword">+</span> <span class="String"><span class="String">"</span> with <span class="String">"</span></span> <span class="Keyword">+</span> liquid <span class="Keyword">+</span> <span class="String"><span class="String">"</span>...<span class="String">"</span></span>;
|
<span class="Keyword">return</span> <span class="String"><span class="String">"</span>Filling the <span class="String">"</span></span> <span class="Keyword">+</span> container <span class="Keyword">+</span> <span class="String"><span class="String">"</span> with <span class="String">"</span></span> <span class="Keyword">+</span> liquid <span class="Keyword">+</span> <span class="String"><span class="String">"</span>...<span class="String">"</span></span>;
|
||||||
};
|
};
|
||||||
</pre><script>window.example3 = "fill = (container, liquid = \"coffee\") ->\n \"Filling the #{container} with #{liquid}...\"\n\nalert fill(\"cup\")"</script><div class='minibutton load' onclick='javascript: loadConsole(example3);'>load</div><div class='minibutton ok' onclick='javascript: var fill;
|
</pre><script>window.example3 = "fill = (container, liquid = \"coffee\") ->\n \"Filling the #{container} with #{liquid}...\"\n\nalert fill(\"cup\")"</script><div class='minibutton load' onclick='javascript: loadConsole(example3);'>load</div><div class='minibutton ok' onclick='javascript: var fill;
|
||||||
|
|
||||||
fill = function(container, liquid) {
|
fill = function(container, liquid) {
|
||||||
if (liquid == null) liquid = "coffee";
|
if (liquid == null) {
|
||||||
|
liquid = "coffee";
|
||||||
|
}
|
||||||
return "Filling the " + container + " with " + liquid + "...";
|
return "Filling the " + container + " with " + liquid + "...";
|
||||||
};
|
};
|
||||||
;alert(fill("cup"));'>run: fill("cup")</div><br class='clear' /></div>
|
;alert(fill("cup"));'>run: fill("cup")</div><br class='clear' /></div>
|
||||||
|
@ -710,12 +716,13 @@ inner = changeNumbers();
|
||||||
|
|
||||||
date <span class="Keyword">=</span> <span class="Keyword">if</span> friday <span class="Keyword">then</span> sue <span class="Keyword">else</span> jill
|
date <span class="Keyword">=</span> <span class="Keyword">if</span> friday <span class="Keyword">then</span> sue <span class="Keyword">else</span> jill
|
||||||
|
|
||||||
options <span class="Keyword">or=</span> defaults
|
|
||||||
|
|
||||||
|
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> date, mood;
|
</pre><pre class="idle"><span class="Storage">var</span> date, mood;
|
||||||
|
|
||||||
<span class="Keyword">if</span> (singing) mood <span class="Keyword">=</span> greatlyImproved;
|
<span class="Keyword">if</span> (singing) {
|
||||||
|
mood <span class="Keyword">=</span> greatlyImproved;
|
||||||
|
}
|
||||||
|
|
||||||
<span class="Keyword">if</span> (happy <span class="Keyword">&</span><span class="Keyword">&</span> knowsIt) {
|
<span class="Keyword">if</span> (happy <span class="Keyword">&</span><span class="Keyword">&</span> knowsIt) {
|
||||||
clapsHands();
|
clapsHands();
|
||||||
|
@ -725,9 +732,7 @@ options <span class="Keyword">or=</span> defaults
|
||||||
}
|
}
|
||||||
|
|
||||||
date <span class="Keyword">=</span> friday ? sue : jill;
|
date <span class="Keyword">=</span> friday ? sue : jill;
|
||||||
|
</pre><script>window.example7 = "mood = greatlyImproved if singing\n\nif happy and knowsIt\n clapsHands()\n chaChaCha()\nelse\n showIt()\n\ndate = if friday then sue else jill\n\n\n\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example7);'>load</div><br class='clear' /></div>
|
||||||
options <span class="Keyword">||</span> (options <span class="Keyword">=</span> defaults);
|
|
||||||
</pre><script>window.example7 = "mood = greatlyImproved if singing\n\nif happy and knowsIt\n clapsHands()\n chaChaCha()\nelse\n showIt()\n\ndate = if friday then sue else jill\n\noptions or= defaults\n\n\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example7);'>load</div><br class='clear' /></div>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<span id="splats" class="bookmark"></span>
|
<span id="splats" class="bookmark"></span>
|
||||||
|
@ -765,7 +770,7 @@ alert <span class="String"><span class="String">"</span>The Field: <span cl
|
||||||
|
|
||||||
|
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> awardMedals, contenders, gold, rest, silver,
|
</pre><pre class="idle"><span class="Storage">var</span> awardMedals, contenders, gold, rest, silver,
|
||||||
__slice <span class="Keyword">=</span> <span class="LibraryClassType">Array</span>.<span class="LibraryConstant">prototype</span>.slice;
|
__slice <span class="Keyword">=</span> [].slice;
|
||||||
|
|
||||||
gold <span class="Keyword">=</span> silver <span class="Keyword">=</span> rest <span class="Keyword">=</span> <span class="String"><span class="String">"</span>unknown<span class="String">"</span></span>;
|
gold <span class="Keyword">=</span> silver <span class="Keyword">=</span> rest <span class="Keyword">=</span> <span class="String"><span class="String">"</span>unknown<span class="String">"</span></span>;
|
||||||
|
|
||||||
|
@ -787,7 +792,7 @@ awardMedals.<span class="LibraryFunction">apply</span>(<span class="BuiltInConst
|
||||||
|
|
||||||
<span class="LibraryFunction">alert</span>(<span class="String"><span class="String">"</span>The Field: <span class="String">"</span></span> <span class="Keyword">+</span> rest);
|
<span class="LibraryFunction">alert</span>(<span class="String"><span class="String">"</span>The Field: <span class="String">"</span></span> <span class="Keyword">+</span> rest);
|
||||||
</pre><script>window.example8 = "gold = silver = rest = \"unknown\"\n\nawardMedals = (first, second, others...) ->\n gold = first\n silver = second\n rest = others\n\ncontenders = [\n \"Michael Phelps\"\n \"Liu Xiang\"\n \"Yao Ming\"\n \"Allyson Felix\"\n \"Shawn Johnson\"\n \"Roman Sebrle\"\n \"Guo Jingjing\"\n \"Tyson Gay\"\n \"Asafa Powell\"\n \"Usain Bolt\"\n]\n\nawardMedals contenders...\n\nalert \"Gold: \" + gold\nalert \"Silver: \" + silver\nalert \"The Field: \" + rest\n\n\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example8);'>load</div><div class='minibutton ok' onclick='javascript: var awardMedals, contenders, gold, rest, silver,
|
</pre><script>window.example8 = "gold = silver = rest = \"unknown\"\n\nawardMedals = (first, second, others...) ->\n gold = first\n silver = second\n rest = others\n\ncontenders = [\n \"Michael Phelps\"\n \"Liu Xiang\"\n \"Yao Ming\"\n \"Allyson Felix\"\n \"Shawn Johnson\"\n \"Roman Sebrle\"\n \"Guo Jingjing\"\n \"Tyson Gay\"\n \"Asafa Powell\"\n \"Usain Bolt\"\n]\n\nawardMedals contenders...\n\nalert \"Gold: \" + gold\nalert \"Silver: \" + silver\nalert \"The Field: \" + rest\n\n\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example8);'>load</div><div class='minibutton ok' onclick='javascript: var awardMedals, contenders, gold, rest, silver,
|
||||||
__slice = Array.prototype.slice;
|
__slice = [].slice;
|
||||||
|
|
||||||
gold = silver = rest = "unknown";
|
gold = silver = rest = "unknown";
|
||||||
|
|
||||||
|
@ -829,7 +834,7 @@ menu i <span class="Keyword">+</span> <span class="Number">1</span>, dish <span
|
||||||
<span class="Comment"><span class="Comment">#</span> Health conscious meal.</span>
|
<span class="Comment"><span class="Comment">#</span> Health conscious meal.</span>
|
||||||
foods <span class="Keyword">=</span> [<span class="String"><span class="String">'</span>broccoli<span class="String">'</span></span>, <span class="String"><span class="String">'</span>spinach<span class="String">'</span></span>, <span class="String"><span class="String">'</span>chocolate<span class="String">'</span></span>]
|
foods <span class="Keyword">=</span> [<span class="String"><span class="String">'</span>broccoli<span class="String">'</span></span>, <span class="String"><span class="String">'</span>spinach<span class="String">'</span></span>, <span class="String"><span class="String">'</span>chocolate<span class="String">'</span></span>]
|
||||||
eat food <span class="Keyword">for</span> food <span class="Keyword">in</span> foods <span class="Keyword">when</span> food <span class="Keyword">isnt</span> <span class="String"><span class="String">'</span>chocolate<span class="String">'</span></span>
|
eat food <span class="Keyword">for</span> food <span class="Keyword">in</span> foods <span class="Keyword">when</span> food <span class="Keyword">isnt</span> <span class="String"><span class="String">'</span>chocolate<span class="String">'</span></span>
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> courses, dish, food, foods, i, _i, _j, _len, _len2, _len3, _ref;
|
</pre><pre class="idle"><span class="Storage">var</span> courses, dish, food, foods, i, _i, _j, _k, _len, _len1, _len2, _ref;
|
||||||
|
|
||||||
_ref <span class="Keyword">=</span> [<span class="String"><span class="String">'</span>toast<span class="String">'</span></span>, <span class="String"><span class="String">'</span>cheese<span class="String">'</span></span>, <span class="String"><span class="String">'</span>wine<span class="String">'</span></span>];
|
_ref <span class="Keyword">=</span> [<span class="String"><span class="String">'</span>toast<span class="String">'</span></span>, <span class="String"><span class="String">'</span>cheese<span class="String">'</span></span>, <span class="String"><span class="String">'</span>wine<span class="String">'</span></span>];
|
||||||
<span class="Keyword">for</span> (_i <span class="Keyword">=</span> <span class="Number">0</span>, _len <span class="Keyword">=</span> _ref.<span class="LibraryConstant">length</span>; _i <span class="Keyword"><</span> _len; _i<span class="Keyword">++</span>) {
|
<span class="Keyword">for</span> (_i <span class="Keyword">=</span> <span class="Number">0</span>, _len <span class="Keyword">=</span> _ref.<span class="LibraryConstant">length</span>; _i <span class="Keyword"><</span> _len; _i<span class="Keyword">++</span>) {
|
||||||
|
@ -839,16 +844,18 @@ _ref <span class="Keyword">=</span> [<span class="String"><span class="String">'
|
||||||
|
|
||||||
courses <span class="Keyword">=</span> [<span class="String"><span class="String">'</span>greens<span class="String">'</span></span>, <span class="String"><span class="String">'</span>caviar<span class="String">'</span></span>, <span class="String"><span class="String">'</span>truffles<span class="String">'</span></span>, <span class="String"><span class="String">'</span>roast<span class="String">'</span></span>, <span class="String"><span class="String">'</span>cake<span class="String">'</span></span>];
|
courses <span class="Keyword">=</span> [<span class="String"><span class="String">'</span>greens<span class="String">'</span></span>, <span class="String"><span class="String">'</span>caviar<span class="String">'</span></span>, <span class="String"><span class="String">'</span>truffles<span class="String">'</span></span>, <span class="String"><span class="String">'</span>roast<span class="String">'</span></span>, <span class="String"><span class="String">'</span>cake<span class="String">'</span></span>];
|
||||||
|
|
||||||
<span class="Keyword">for</span> (i <span class="Keyword">=</span> <span class="Number">0</span>, _len2 <span class="Keyword">=</span> courses.<span class="LibraryConstant">length</span>; i <span class="Keyword"><</span> _len2; i<span class="Keyword">++</span>) {
|
<span class="Keyword">for</span> (i <span class="Keyword">=</span> _j <span class="Keyword">=</span> <span class="Number">0</span>, _len1 <span class="Keyword">=</span> courses.<span class="LibraryConstant">length</span>; _j <span class="Keyword"><</span> _len1; i <span class="Keyword">=</span> <span class="Keyword">++</span>_j) {
|
||||||
dish <span class="Keyword">=</span> courses[i];
|
dish <span class="Keyword">=</span> courses[i];
|
||||||
menu(i <span class="Keyword">+</span> <span class="Number">1</span>, dish);
|
menu(i <span class="Keyword">+</span> <span class="Number">1</span>, dish);
|
||||||
}
|
}
|
||||||
|
|
||||||
foods <span class="Keyword">=</span> [<span class="String"><span class="String">'</span>broccoli<span class="String">'</span></span>, <span class="String"><span class="String">'</span>spinach<span class="String">'</span></span>, <span class="String"><span class="String">'</span>chocolate<span class="String">'</span></span>];
|
foods <span class="Keyword">=</span> [<span class="String"><span class="String">'</span>broccoli<span class="String">'</span></span>, <span class="String"><span class="String">'</span>spinach<span class="String">'</span></span>, <span class="String"><span class="String">'</span>chocolate<span class="String">'</span></span>];
|
||||||
|
|
||||||
<span class="Keyword">for</span> (_j <span class="Keyword">=</span> <span class="Number">0</span>, _len3 <span class="Keyword">=</span> foods.<span class="LibraryConstant">length</span>; _j <span class="Keyword"><</span> _len3; _j<span class="Keyword">++</span>) {
|
<span class="Keyword">for</span> (_k <span class="Keyword">=</span> <span class="Number">0</span>, _len2 <span class="Keyword">=</span> foods.<span class="LibraryConstant">length</span>; _k <span class="Keyword"><</span> _len2; _k<span class="Keyword">++</span>) {
|
||||||
food <span class="Keyword">=</span> foods[_j];
|
food <span class="Keyword">=</span> foods[_k];
|
||||||
<span class="Keyword">if</span> (food <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">'</span>chocolate<span class="String">'</span></span>) eat(food);
|
<span class="Keyword">if</span> (food <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">'</span>chocolate<span class="String">'</span></span>) {
|
||||||
|
eat(food);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</pre><script>window.example9 = "# Eat lunch.\neat food for food in ['toast', 'cheese', 'wine']\n\n# Fine five course dining.\ncourses = ['greens', 'caviar', 'truffles', 'roast', 'cake']\nmenu i + 1, dish for dish, i in courses\n\n# Health conscious meal.\nfoods = ['broccoli', 'spinach', 'chocolate']\neat food for food in foods when food isnt 'chocolate'\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example9);'>load</div><br class='clear' /></div>
|
</pre><script>window.example9 = "# Eat lunch.\neat food for food in ['toast', 'cheese', 'wine']\n\n# Fine five course dining.\ncourses = ['greens', 'caviar', 'truffles', 'roast', 'cake']\nmenu i + 1, dish for dish, i in courses\n\n# Health conscious meal.\nfoods = ['broccoli', 'spinach', 'chocolate']\neat food for food in foods when food isnt 'chocolate'\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example9);'>load</div><br class='clear' /></div>
|
||||||
<p>
|
<p>
|
||||||
|
@ -864,9 +871,9 @@ foods <span class="Keyword">=</span> [<span class="String"><span class="String">
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> countdown, num;
|
</pre><pre class="idle"><span class="Storage">var</span> countdown, num;
|
||||||
|
|
||||||
countdown <span class="Keyword">=</span> (<span class="Storage">function</span>() {
|
countdown <span class="Keyword">=</span> (<span class="Storage">function</span>() {
|
||||||
<span class="Storage">var</span> _results;
|
<span class="Storage">var</span> _i, _results;
|
||||||
_results <span class="Keyword">=</span> [];
|
_results <span class="Keyword">=</span> [];
|
||||||
<span class="Keyword">for</span> (num <span class="Keyword">=</span> <span class="Number">10</span>; num <span class="Keyword">>=</span> <span class="Number">1</span>; num<span class="Keyword">--</span>) {
|
<span class="Keyword">for</span> (num <span class="Keyword">=</span> _i <span class="Keyword">=</span> <span class="Number">10</span>; _i <span class="Keyword">>=</span> <span class="Number">1</span>; num <span class="Keyword">=</span> <span class="Keyword">--</span>_i) {
|
||||||
_results.<span class="LibraryFunction">push</span>(num);
|
_results.<span class="LibraryFunction">push</span>(num);
|
||||||
}
|
}
|
||||||
<span class="Keyword">return</span> _results;
|
<span class="Keyword">return</span> _results;
|
||||||
|
@ -874,9 +881,9 @@ countdown <span class="Keyword">=</span> (<span class="Storage">function</span>(
|
||||||
</pre><script>window.example10 = "countdown = (num for num in [10..1])\n\nalert countdown"</script><div class='minibutton load' onclick='javascript: loadConsole(example10);'>load</div><div class='minibutton ok' onclick='javascript: var countdown, num;
|
</pre><script>window.example10 = "countdown = (num for num in [10..1])\n\nalert countdown"</script><div class='minibutton load' onclick='javascript: loadConsole(example10);'>load</div><div class='minibutton ok' onclick='javascript: var countdown, num;
|
||||||
|
|
||||||
countdown = (function() {
|
countdown = (function() {
|
||||||
var _results;
|
var _i, _results;
|
||||||
_results = [];
|
_results = [];
|
||||||
for (num = 10; num >= 1; num--) {
|
for (num = _i = 10; _i >= 1; num = --_i) {
|
||||||
_results.push(num);
|
_results.push(num);
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
|
@ -1039,28 +1046,40 @@ lyrics = (function() {
|
||||||
Ranges can also be used to extract slices of arrays.
|
Ranges can also be used to extract slices of arrays.
|
||||||
With two dots (<tt>3..6</tt>), the range is inclusive (<tt>3, 4, 5, 6</tt>);
|
With two dots (<tt>3..6</tt>), the range is inclusive (<tt>3, 4, 5, 6</tt>);
|
||||||
with three dots (<tt>3...6</tt>), the range excludes the end (<tt>3, 4, 5</tt>).
|
with three dots (<tt>3...6</tt>), the range excludes the end (<tt>3, 4, 5</tt>).
|
||||||
|
Slices indices have useful defaults. An omitted first index defaults to
|
||||||
|
zero and an omitted second index defaults to the size of the array.
|
||||||
</p>
|
</p>
|
||||||
<div class='code'><pre class="idle">numbers <span class="Keyword">=</span> [<span class="Number">0</span>, <span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>, <span class="Number">6</span>, <span class="Number">7</span>, <span class="Number">8</span>, <span class="Number">9</span>]
|
<div class='code'><pre class="idle">numbers <span class="Keyword">=</span> [<span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>, <span class="Number">6</span>, <span class="Number">7</span>, <span class="Number">8</span>, <span class="Number">9</span>]
|
||||||
|
|
||||||
copy <span class="Keyword">=</span> numbers[<span class="Number">0</span>...numbers.length]
|
start <span class="Keyword">=</span> numbers[<span class="Number">0</span>..<span class="Number">2</span>]
|
||||||
|
|
||||||
middle <span class="Keyword">=</span> copy[<span class="Number">3</span>..<span class="Number">6</span>]
|
middle <span class="Keyword">=</span> numbers[<span class="Number">3</span>...<span class="Number">6</span>]
|
||||||
|
|
||||||
|
end <span class="Keyword">=</span> numbers[<span class="Number">6</span>..]
|
||||||
|
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> copy, middle, numbers;
|
copy <span class="Keyword">=</span> numbers[..]
|
||||||
|
</pre><pre class="idle"><span class="Storage">var</span> copy, end, middle, numbers, start;
|
||||||
|
|
||||||
numbers <span class="Keyword">=</span> [<span class="Number">0</span>, <span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>, <span class="Number">6</span>, <span class="Number">7</span>, <span class="Number">8</span>, <span class="Number">9</span>];
|
numbers <span class="Keyword">=</span> [<span class="Number">1</span>, <span class="Number">2</span>, <span class="Number">3</span>, <span class="Number">4</span>, <span class="Number">5</span>, <span class="Number">6</span>, <span class="Number">7</span>, <span class="Number">8</span>, <span class="Number">9</span>];
|
||||||
|
|
||||||
copy <span class="Keyword">=</span> numbers.<span class="LibraryFunction">slice</span>(<span class="Number">0</span>, numbers.<span class="LibraryConstant">length</span>);
|
start <span class="Keyword">=</span> numbers.<span class="LibraryFunction">slice</span>(<span class="Number">0</span>, <span class="Number">3</span>);
|
||||||
|
|
||||||
middle <span class="Keyword">=</span> copy.<span class="LibraryFunction">slice</span>(<span class="Number">3</span>, <span class="Number">7</span>);
|
middle <span class="Keyword">=</span> numbers.<span class="LibraryFunction">slice</span>(<span class="Number">3</span>, <span class="Number">6</span>);
|
||||||
</pre><script>window.example14 = "numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\ncopy = numbers[0...numbers.length]\n\nmiddle = copy[3..6]\n\nalert middle"</script><div class='minibutton load' onclick='javascript: loadConsole(example14);'>load</div><div class='minibutton ok' onclick='javascript: var copy, middle, numbers;
|
|
||||||
|
|
||||||
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
end <span class="Keyword">=</span> numbers.<span class="LibraryFunction">slice</span>(<span class="Number">6</span>);
|
||||||
|
|
||||||
copy = numbers.slice(0, numbers.length);
|
copy <span class="Keyword">=</span> numbers.<span class="LibraryFunction">slice</span>(<span class="Number">0</span>);
|
||||||
|
</pre><script>window.example14 = "numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n\nstart = numbers[0..2]\n\nmiddle = numbers[3...6]\n\nend = numbers[6..]\n\ncopy = numbers[..]\n\nalert middle"</script><div class='minibutton load' onclick='javascript: loadConsole(example14);'>load</div><div class='minibutton ok' onclick='javascript: var copy, end, middle, numbers, start;
|
||||||
|
|
||||||
middle = copy.slice(3, 7);
|
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
|
||||||
|
|
||||||
|
start = numbers.slice(0, 3);
|
||||||
|
|
||||||
|
middle = numbers.slice(3, 6);
|
||||||
|
|
||||||
|
end = numbers.slice(6);
|
||||||
|
|
||||||
|
copy = numbers.slice(0);
|
||||||
;alert(middle);'>run: middle</div><br class='clear' /></div>
|
;alert(middle);'>run: middle</div><br class='clear' /></div>
|
||||||
<p>
|
<p>
|
||||||
The same syntax can be used with assignment to replace a segment of an array
|
The same syntax can be used with assignment to replace a segment of an array
|
||||||
|
@ -1293,15 +1312,25 @@ winner <span class="Keyword">=</span> <span class="BuiltInConstant">yes</span> <
|
||||||
print inspect <span class="String"><span class="String">"</span>My name is <span class="String"><span class="String">#{</span><span class="Variable">@name</span><span class="String">}</span></span><span class="String">"</span></span>
|
print inspect <span class="String"><span class="String">"</span>My name is <span class="String"><span class="String">#{</span><span class="Variable">@name</span><span class="String">}</span></span><span class="String">"</span></span>
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> volume, winner;
|
</pre><pre class="idle"><span class="Storage">var</span> volume, winner;
|
||||||
|
|
||||||
<span class="Keyword">if</span> (ignition <span class="Keyword">===</span> <span class="BuiltInConstant">true</span>) launch();
|
<span class="Keyword">if</span> (ignition <span class="Keyword">===</span> <span class="BuiltInConstant">true</span>) {
|
||||||
|
launch();
|
||||||
|
}
|
||||||
|
|
||||||
<span class="Keyword">if</span> (band <span class="Keyword">!</span><span class="Keyword">==</span> SpinalTap) volume <span class="Keyword">=</span> <span class="Number">10</span>;
|
<span class="Keyword">if</span> (band <span class="Keyword">!</span><span class="Keyword">==</span> SpinalTap) {
|
||||||
|
volume <span class="Keyword">=</span> <span class="Number">10</span>;
|
||||||
|
}
|
||||||
|
|
||||||
<span class="Keyword">if</span> (answer <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">false</span>) letTheWildRumpusBegin();
|
<span class="Keyword">if</span> (answer <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">false</span>) {
|
||||||
|
letTheWildRumpusBegin();
|
||||||
|
}
|
||||||
|
|
||||||
<span class="Keyword">if</span> (car.speed <span class="Keyword"><</span> limit) accelerate();
|
<span class="Keyword">if</span> (car.speed <span class="Keyword"><</span> limit) {
|
||||||
|
accelerate();
|
||||||
|
}
|
||||||
|
|
||||||
<span class="Keyword">if</span> (pick <span class="Keyword">===</span> <span class="Number">47</span> <span class="Keyword">||</span> pick <span class="Keyword">===</span> <span class="Number">92</span> <span class="Keyword">||</span> pick <span class="Keyword">===</span> <span class="Number">13</span>) winner <span class="Keyword">=</span> <span class="BuiltInConstant">true</span>;
|
<span class="Keyword">if</span> (pick <span class="Keyword">===</span> <span class="Number">47</span> <span class="Keyword">||</span> pick <span class="Keyword">===</span> <span class="Number">92</span> <span class="Keyword">||</span> pick <span class="Keyword">===</span> <span class="Number">13</span>) {
|
||||||
|
winner <span class="Keyword">=</span> <span class="BuiltInConstant">true</span>;
|
||||||
|
}
|
||||||
|
|
||||||
<span class="LibraryFunction">print</span>(inspect(<span class="String"><span class="String">"</span>My name is <span class="String">"</span></span> <span class="Keyword">+</span> <span class="Variable">this</span>.<span class="LibraryConstant">name</span>));
|
<span class="LibraryFunction">print</span>(inspect(<span class="String"><span class="String">"</span>My name is <span class="String">"</span></span> <span class="Keyword">+</span> <span class="Variable">this</span>.<span class="LibraryConstant">name</span>));
|
||||||
</pre><script>window.example20 = "launch() if ignition is on\n\nvolume = 10 if band isnt SpinalTap\n\nletTheWildRumpusBegin() unless answer is no\n\nif car.speed < limit then accelerate()\n\nwinner = yes if pick in [47, 92, 13]\n\nprint inspect \"My name is #{@name}\"\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example20);'>load</div><br class='clear' /></div>
|
</pre><script>window.example20 = "launch() if ignition is on\n\nvolume = 10 if band isnt SpinalTap\n\nletTheWildRumpusBegin() unless answer is no\n\nif car.speed < limit then accelerate()\n\nwinner = yes if pick in [47, 92, 13]\n\nprint inspect \"My name is #{@name}\"\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example20);'>load</div><br class='clear' /></div>
|
||||||
|
@ -1320,7 +1349,8 @@ print inspect <span class="String"><span class="String">"</span>My name is
|
||||||
</p>
|
</p>
|
||||||
<div class='code'><pre class="idle">solipsism <span class="Keyword">=</span> <span class="BuiltInConstant">true</span> <span class="Keyword">if</span> mind<span class="Keyword">?</span> <span class="Keyword">and</span> <span class="Keyword">not</span> world<span class="Keyword">?</span>
|
<div class='code'><pre class="idle">solipsism <span class="Keyword">=</span> <span class="BuiltInConstant">true</span> <span class="Keyword">if</span> mind<span class="Keyword">?</span> <span class="Keyword">and</span> <span class="Keyword">not</span> world<span class="Keyword">?</span>
|
||||||
|
|
||||||
speed <span class="Keyword">?</span><span class="Keyword">=</span> <span class="Number">75</span>
|
speed <span class="Keyword">=</span> <span class="Number">0</span>
|
||||||
|
speed <span class="Keyword">?</span><span class="Keyword">=</span> <span class="Number">15</span>
|
||||||
|
|
||||||
footprints <span class="Keyword">=</span> yeti <span class="Keyword">?</span> <span class="String"><span class="String">"</span>bear<span class="String">"</span></span>
|
footprints <span class="Keyword">=</span> yeti <span class="Keyword">?</span> <span class="String"><span class="String">"</span>bear<span class="String">"</span></span>
|
||||||
|
|
||||||
|
@ -1330,22 +1360,30 @@ footprints <span class="Keyword">=</span> yeti <span class="Keyword">?</span> <s
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> footprints, solipsism;
|
</pre><pre class="idle"><span class="Storage">var</span> footprints, solipsism, speed;
|
||||||
|
|
||||||
<span class="Keyword">if</span> ((<span class="Keyword">typeof</span> mind <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">&</span><span class="Keyword">&</span> mind <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">null</span>) <span class="Keyword">&</span><span class="Keyword">&</span> <span class="Keyword">!</span>(<span class="Keyword">typeof</span> world <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">&</span><span class="Keyword">&</span> world <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">null</span>)) {
|
<span class="Keyword">if</span> ((<span class="Keyword">typeof</span> mind <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">&</span><span class="Keyword">&</span> mind <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">null</span>) <span class="Keyword">&</span><span class="Keyword">&</span> <span class="Keyword">!</span>(<span class="Keyword">typeof</span> world <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">&</span><span class="Keyword">&</span> world <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">null</span>)) {
|
||||||
solipsism <span class="Keyword">=</span> <span class="BuiltInConstant">true</span>;
|
solipsism <span class="Keyword">=</span> <span class="BuiltInConstant">true</span>;
|
||||||
}
|
}
|
||||||
|
|
||||||
<span class="Keyword">if</span> (<span class="Keyword">typeof</span> speed <span class="Keyword">===</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">||</span> speed <span class="Keyword">===</span> <span class="BuiltInConstant">null</span>) speed <span class="Keyword">=</span> <span class="Number">75</span>;
|
speed <span class="Keyword">=</span> <span class="Number">0</span>;
|
||||||
|
|
||||||
|
<span class="Keyword">if</span> (speed <span class="Keyword">==</span> <span class="BuiltInConstant">null</span>) {
|
||||||
|
speed <span class="Keyword">=</span> <span class="Number">15</span>;
|
||||||
|
}
|
||||||
|
|
||||||
footprints <span class="Keyword">=</span> <span class="Keyword">typeof</span> yeti <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">&</span><span class="Keyword">&</span> yeti <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">null</span> ? yeti : <span class="String"><span class="String">"</span>bear<span class="String">"</span></span>;
|
footprints <span class="Keyword">=</span> <span class="Keyword">typeof</span> yeti <span class="Keyword">!</span><span class="Keyword">==</span> <span class="String"><span class="String">"</span>undefined<span class="String">"</span></span> <span class="Keyword">&</span><span class="Keyword">&</span> yeti <span class="Keyword">!</span><span class="Keyword">==</span> <span class="BuiltInConstant">null</span> ? yeti : <span class="String"><span class="String">"</span>bear<span class="String">"</span></span>;
|
||||||
</pre><script>window.example21 = "solipsism = true if mind? and not world?\n\nspeed ?= 75\n\nfootprints = yeti ? \"bear\"\n\nalert footprints"</script><div class='minibutton load' onclick='javascript: loadConsole(example21);'>load</div><div class='minibutton ok' onclick='javascript: var footprints, solipsism;
|
</pre><script>window.example21 = "solipsism = true if mind? and not world?\n\nspeed = 0\nspeed ?= 15\n\nfootprints = yeti ? \"bear\"\n\nalert footprints"</script><div class='minibutton load' onclick='javascript: loadConsole(example21);'>load</div><div class='minibutton ok' onclick='javascript: var footprints, solipsism, speed;
|
||||||
|
|
||||||
if ((typeof mind !== "undefined" && mind !== null) && !(typeof world !== "undefined" && world !== null)) {
|
if ((typeof mind !== "undefined" && mind !== null) && !(typeof world !== "undefined" && world !== null)) {
|
||||||
solipsism = true;
|
solipsism = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof speed === "undefined" || speed === null) speed = 75;
|
speed = 0;
|
||||||
|
|
||||||
|
if (speed == null) {
|
||||||
|
speed = 15;
|
||||||
|
}
|
||||||
|
|
||||||
footprints = typeof yeti !== "undefined" && yeti !== null ? yeti : "bear";
|
footprints = typeof yeti !== "undefined" && yeti !== null ? yeti : "bear";
|
||||||
;alert(footprints);'>run: footprints</div><br class='clear' /></div>
|
;alert(footprints);'>run: footprints</div><br class='clear' /></div>
|
||||||
|
@ -1392,6 +1430,7 @@ zip <span class="Keyword">=</span> <span class="Keyword">typeof</span> lottery.d
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Constructor functions are named, to better support helpful stack traces.
|
Constructor functions are named, to better support helpful stack traces.
|
||||||
|
In the first class in the example below, <tt>this.constructor.name is "Animal"</tt>.
|
||||||
</p>
|
</p>
|
||||||
<div class='code'><pre class="idle"><span class="Storage">class</span> <span class="TypeName">Animal</span>
|
<div class='code'><pre class="idle"><span class="Storage">class</span> <span class="TypeName">Animal</span>
|
||||||
<span class="FunctionName">constructor</span><span class="Keyword">:</span> <span class="FunctionArgument">(@name)</span> <span class="Storage">-></span>
|
<span class="FunctionName">constructor</span><span class="Keyword">:</span> <span class="FunctionArgument">(@name)</span> <span class="Storage">-></span>
|
||||||
|
@ -1419,11 +1458,13 @@ tom.move()
|
||||||
|
|
||||||
|
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> Animal, Horse, Snake, sam, tom,
|
</pre><pre class="idle"><span class="Storage">var</span> Animal, Horse, Snake, sam, tom,
|
||||||
__hasProp <span class="Keyword">=</span> <span class="LibraryClassType">Object</span>.<span class="LibraryConstant">prototype</span>.hasOwnProperty,
|
__hasProp <span class="Keyword">=</span> {}.hasOwnProperty,
|
||||||
<span class="FunctionName">__extends</span> = <span class="Storage">function</span>(<span class="FunctionArgument">child, parent</span>) { <span class="Keyword">for</span> (<span class="Storage">var</span> key <span class="Keyword">in</span> parent) { <span class="Keyword">if</span> (__hasProp.<span class="LibraryFunction">call</span>(parent, key)) child[key] <span class="Keyword">=</span> parent[key]; } <span class="Storage">function</span> <span class="FunctionName">ctor</span>() { <span class="Variable">this</span>.<span class="LibraryConstant">constructor</span> <span class="Keyword">=</span> child; } <span class="LibraryClassType">ctor</span>.<span class="LibraryConstant">prototype</span> = parent.<span class="LibraryConstant">prototype</span>; <span class="LibraryClassType">child</span>.<span class="LibraryConstant">prototype</span> = <span class="Keyword">new</span> <span class="TypeName">ctor</span>; child.__super__ <span class="Keyword">=</span> parent.<span class="LibraryConstant">prototype</span>; <span class="Keyword">return</span> child; };
|
<span class="FunctionName">__extends</span> = <span class="Storage">function</span>(<span class="FunctionArgument">child, parent</span>) { <span class="Keyword">for</span> (<span class="Storage">var</span> key <span class="Keyword">in</span> parent) { <span class="Keyword">if</span> (__hasProp.<span class="LibraryFunction">call</span>(parent, key)) child[key] <span class="Keyword">=</span> parent[key]; } <span class="Storage">function</span> <span class="FunctionName">ctor</span>() { <span class="Variable">this</span>.<span class="LibraryConstant">constructor</span> <span class="Keyword">=</span> child; } <span class="LibraryClassType">ctor</span>.<span class="LibraryConstant">prototype</span> = parent.<span class="LibraryConstant">prototype</span>; <span class="LibraryClassType">child</span>.<span class="LibraryConstant">prototype</span> = <span class="Keyword">new</span> <span class="TypeName">ctor</span>; child.__super__ <span class="Keyword">=</span> parent.<span class="LibraryConstant">prototype</span>; <span class="Keyword">return</span> child; };
|
||||||
|
|
||||||
Animal <span class="Keyword">=</span> (<span class="Storage">function</span>() {
|
Animal <span class="Keyword">=</span> (<span class="Storage">function</span>() {
|
||||||
|
|
||||||
|
Animal.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> <span class="String"><span class="String">'</span>Animal<span class="String">'</span></span>;
|
||||||
|
|
||||||
<span class="Storage">function</span> <span class="FunctionName">Animal</span>(<span class="FunctionArgument">name</span>) {
|
<span class="Storage">function</span> <span class="FunctionName">Animal</span>(<span class="FunctionArgument">name</span>) {
|
||||||
<span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> name;
|
<span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> name;
|
||||||
}
|
}
|
||||||
|
@ -1440,8 +1481,10 @@ Snake <span class="Keyword">=</span> (<span class="Storage">function</span>(_sup
|
||||||
|
|
||||||
__extends(Snake, _super);
|
__extends(Snake, _super);
|
||||||
|
|
||||||
|
Snake.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> <span class="String"><span class="String">'</span>Snake<span class="String">'</span></span>;
|
||||||
|
|
||||||
<span class="Storage">function</span> <span class="FunctionName">Snake</span>() {
|
<span class="Storage">function</span> <span class="FunctionName">Snake</span>() {
|
||||||
Snake.__super__.<span class="LibraryConstant">constructor</span>.<span class="LibraryFunction">apply</span>(<span class="Variable">this</span>, arguments);
|
<span class="Keyword">return</span> Snake.__super__.<span class="LibraryConstant">constructor</span>.<span class="LibraryFunction">apply</span>(<span class="Variable">this</span>, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
<span class="LibraryClassType">Snake</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">move</span> = <span class="Storage">function</span>() {
|
<span class="LibraryClassType">Snake</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">move</span> = <span class="Storage">function</span>() {
|
||||||
|
@ -1457,8 +1500,10 @@ Horse <span class="Keyword">=</span> (<span class="Storage">function</span>(_sup
|
||||||
|
|
||||||
__extends(Horse, _super);
|
__extends(Horse, _super);
|
||||||
|
|
||||||
|
Horse.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> <span class="String"><span class="String">'</span>Horse<span class="String">'</span></span>;
|
||||||
|
|
||||||
<span class="Storage">function</span> <span class="FunctionName">Horse</span>() {
|
<span class="Storage">function</span> <span class="FunctionName">Horse</span>() {
|
||||||
Horse.__super__.<span class="LibraryConstant">constructor</span>.<span class="LibraryFunction">apply</span>(<span class="Variable">this</span>, arguments);
|
<span class="Keyword">return</span> Horse.__super__.<span class="LibraryConstant">constructor</span>.<span class="LibraryFunction">apply</span>(<span class="Variable">this</span>, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
<span class="LibraryClassType">Horse</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">move</span> = <span class="Storage">function</span>() {
|
<span class="LibraryClassType">Horse</span>.<span class="LibraryConstant">prototype</span>.<span class="FunctionName">move</span> = <span class="Storage">function</span>() {
|
||||||
|
@ -1478,11 +1523,13 @@ sam.move();
|
||||||
|
|
||||||
tom.move();
|
tom.move();
|
||||||
</pre><script>window.example23 = "class Animal\n constructor: (@name) ->\n\n move: (meters) ->\n alert @name + \" moved #{meters}m.\"\n\nclass Snake extends Animal\n move: ->\n alert \"Slithering...\"\n super 5\n\nclass Horse extends Animal\n move: ->\n alert \"Galloping...\"\n super 45\n\nsam = new Snake \"Sammy the Python\"\ntom = new Horse \"Tommy the Palomino\"\n\nsam.move()\ntom.move()\n\n\n\n\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example23);'>load</div><div class='minibutton ok' onclick='javascript: var Animal, Horse, Snake, sam, tom,
|
</pre><script>window.example23 = "class Animal\n constructor: (@name) ->\n\n move: (meters) ->\n alert @name + \" moved #{meters}m.\"\n\nclass Snake extends Animal\n move: ->\n alert \"Slithering...\"\n super 5\n\nclass Horse extends Animal\n move: ->\n alert \"Galloping...\"\n super 45\n\nsam = new Snake \"Sammy the Python\"\ntom = new Horse \"Tommy the Palomino\"\n\nsam.move()\ntom.move()\n\n\n\n\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example23);'>load</div><div class='minibutton ok' onclick='javascript: var Animal, Horse, Snake, sam, tom,
|
||||||
__hasProp = Object.prototype.hasOwnProperty,
|
__hasProp = {}.hasOwnProperty,
|
||||||
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
|
||||||
|
|
||||||
Animal = (function() {
|
Animal = (function() {
|
||||||
|
|
||||||
|
Animal.name = 'Animal';
|
||||||
|
|
||||||
function Animal(name) {
|
function Animal(name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
@ -1499,8 +1546,10 @@ Snake = (function(_super) {
|
||||||
|
|
||||||
__extends(Snake, _super);
|
__extends(Snake, _super);
|
||||||
|
|
||||||
|
Snake.name = 'Snake';
|
||||||
|
|
||||||
function Snake() {
|
function Snake() {
|
||||||
Snake.__super__.constructor.apply(this, arguments);
|
return Snake.__super__.constructor.apply(this, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
Snake.prototype.move = function() {
|
Snake.prototype.move = function() {
|
||||||
|
@ -1516,8 +1565,10 @@ Horse = (function(_super) {
|
||||||
|
|
||||||
__extends(Horse, _super);
|
__extends(Horse, _super);
|
||||||
|
|
||||||
|
Horse.name = 'Horse';
|
||||||
|
|
||||||
function Horse() {
|
function Horse() {
|
||||||
Horse.__super__.constructor.apply(this, arguments);
|
return Horse.__super__.constructor.apply(this, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
Horse.prototype.move = function() {
|
Horse.prototype.move = function() {
|
||||||
|
@ -1646,7 +1697,7 @@ _ref = weatherReport("Berkeley, CA"), city = _ref[0], temp = _ref[1], forecast =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> city, futurists, name, street, _ref, _ref2;
|
</pre><pre class="idle"><span class="Storage">var</span> city, futurists, name, street, _ref, _ref1;
|
||||||
|
|
||||||
futurists <span class="Keyword">=</span> {
|
futurists <span class="Keyword">=</span> {
|
||||||
sculptor: <span class="String"><span class="String">"</span>Umberto Boccioni<span class="String">"</span></span>,
|
sculptor: <span class="String"><span class="String">"</span>Umberto Boccioni<span class="String">"</span></span>,
|
||||||
|
@ -1657,8 +1708,8 @@ futurists <span class="Keyword">=</span> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_ref <span class="Keyword">=</span> futurists.poet, name <span class="Keyword">=</span> _ref.<span class="LibraryConstant">name</span>, (_ref2 <span class="Keyword">=</span> _ref.address, street <span class="Keyword">=</span> _ref2[<span class="Number">0</span>], city <span class="Keyword">=</span> _ref2[<span class="Number">1</span>]);
|
_ref <span class="Keyword">=</span> futurists.poet, name <span class="Keyword">=</span> _ref.<span class="LibraryConstant">name</span>, (_ref1 <span class="Keyword">=</span> _ref.address, street <span class="Keyword">=</span> _ref1[<span class="Number">0</span>], city <span class="Keyword">=</span> _ref1[<span class="Number">1</span>]);
|
||||||
</pre><script>window.example27 = "futurists =\n sculptor: \"Umberto Boccioni\"\n painter: \"Vladimir Burliuk\"\n poet:\n name: \"F.T. Marinetti\"\n address: [\n \"Via Roma 42R\"\n \"Bellagio, Italy 22021\"\n ]\n\n{poet: {name, address: [street, city]}} = futurists\n\nalert name + \" — \" + street"</script><div class='minibutton load' onclick='javascript: loadConsole(example27);'>load</div><div class='minibutton ok' onclick='javascript: var city, futurists, name, street, _ref, _ref2;
|
</pre><script>window.example27 = "futurists =\n sculptor: \"Umberto Boccioni\"\n painter: \"Vladimir Burliuk\"\n poet:\n name: \"F.T. Marinetti\"\n address: [\n \"Via Roma 42R\"\n \"Bellagio, Italy 22021\"\n ]\n\n{poet: {name, address: [street, city]}} = futurists\n\nalert name + \" — \" + street"</script><div class='minibutton load' onclick='javascript: loadConsole(example27);'>load</div><div class='minibutton ok' onclick='javascript: var city, futurists, name, street, _ref, _ref1;
|
||||||
|
|
||||||
futurists = {
|
futurists = {
|
||||||
sculptor: "Umberto Boccioni",
|
sculptor: "Umberto Boccioni",
|
||||||
|
@ -1669,7 +1720,7 @@ futurists = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_ref = futurists.poet, name = _ref.name, (_ref2 = _ref.address, street = _ref2[0], city = _ref2[1]);
|
_ref = futurists.poet, name = _ref.name, (_ref1 = _ref.address, street = _ref1[0], city = _ref1[1]);
|
||||||
;alert(name + " — " + street);'>run: name + " — " + street</div><br class='clear' /></div>
|
;alert(name + " — " + street);'>run: name + " — " + street</div><br class='clear' /></div>
|
||||||
<p>
|
<p>
|
||||||
Destructuring assignment can even be combined with splats.
|
Destructuring assignment can even be combined with splats.
|
||||||
|
@ -1684,13 +1735,13 @@ _ref = futurists.poet, name = _ref.name, (_ref2 = _ref.address, street = _ref2[0
|
||||||
|
|
||||||
|
|
||||||
</pre><pre class="idle"><span class="Storage">var</span> close, contents, open, tag, _i, _ref,
|
</pre><pre class="idle"><span class="Storage">var</span> close, contents, open, tag, _i, _ref,
|
||||||
__slice <span class="Keyword">=</span> <span class="LibraryClassType">Array</span>.<span class="LibraryConstant">prototype</span>.slice;
|
__slice <span class="Keyword">=</span> [].slice;
|
||||||
|
|
||||||
tag <span class="Keyword">=</span> <span class="String"><span class="String">"</span><impossible><span class="String">"</span></span>;
|
tag <span class="Keyword">=</span> <span class="String"><span class="String">"</span><impossible><span class="String">"</span></span>;
|
||||||
|
|
||||||
_ref <span class="Keyword">=</span> tag.<span class="LibraryFunction">split</span>(<span class="String"><span class="String">"</span><span class="String">"</span></span>), open <span class="Keyword">=</span> _ref[<span class="Number">0</span>], contents <span class="Keyword">=</span> <span class="Number">3</span> <span class="Keyword"><=</span> _ref.<span class="LibraryConstant">length</span> ? __slice.<span class="LibraryFunction">call</span>(_ref, <span class="Number">1</span>, _i <span class="Keyword">=</span> _ref.<span class="LibraryConstant">length</span> <span class="Keyword">-</span> <span class="Number">1</span>) : (_i <span class="Keyword">=</span> <span class="Number">1</span>, []), close <span class="Keyword">=</span> _ref[_i<span class="Keyword">++</span>];
|
_ref <span class="Keyword">=</span> tag.<span class="LibraryFunction">split</span>(<span class="String"><span class="String">"</span><span class="String">"</span></span>), open <span class="Keyword">=</span> _ref[<span class="Number">0</span>], contents <span class="Keyword">=</span> <span class="Number">3</span> <span class="Keyword"><=</span> _ref.<span class="LibraryConstant">length</span> ? __slice.<span class="LibraryFunction">call</span>(_ref, <span class="Number">1</span>, _i <span class="Keyword">=</span> _ref.<span class="LibraryConstant">length</span> <span class="Keyword">-</span> <span class="Number">1</span>) : (_i <span class="Keyword">=</span> <span class="Number">1</span>, []), close <span class="Keyword">=</span> _ref[_i<span class="Keyword">++</span>];
|
||||||
</pre><script>window.example28 = "tag = \"<impossible>\"\n\n[open, contents..., close] = tag.split(\"\")\n\nalert contents.join(\"\")"</script><div class='minibutton load' onclick='javascript: loadConsole(example28);'>load</div><div class='minibutton ok' onclick='javascript: var close, contents, open, tag, _i, _ref,
|
</pre><script>window.example28 = "tag = \"<impossible>\"\n\n[open, contents..., close] = tag.split(\"\")\n\nalert contents.join(\"\")"</script><div class='minibutton load' onclick='javascript: loadConsole(example28);'>load</div><div class='minibutton ok' onclick='javascript: var close, contents, open, tag, _i, _ref,
|
||||||
__slice = Array.prototype.slice;
|
__slice = [].slice;
|
||||||
|
|
||||||
tag = "<impossible>";
|
tag = "<impossible>";
|
||||||
|
|
||||||
|
@ -1947,26 +1998,27 @@ html = "<strong>\n cup of coffeescript\n</strong>";
|
||||||
are preserved in the generated code.
|
are preserved in the generated code.
|
||||||
</p>
|
</p>
|
||||||
<div class='code'><pre class="idle"><span class="Comment"><span class="Comment">###</span></span>
|
<div class='code'><pre class="idle"><span class="Comment"><span class="Comment">###</span></span>
|
||||||
<span class="Comment">CoffeeScript Compiler v1.2.0</span>
|
<span class="Comment">CoffeeScript Compiler v1.3.0</span>
|
||||||
<span class="Comment">Released under the MIT License</span>
|
<span class="Comment">Released under the MIT License</span>
|
||||||
<span class="Comment"><span class="Comment">###</span></span>
|
<span class="Comment"><span class="Comment">###</span></span>
|
||||||
|
|
||||||
|
|
||||||
</pre><pre class="idle"><span class="Comment"><span class="Comment">/*</span></span>
|
</pre><pre class="idle"><span class="Comment"><span class="Comment">/*</span></span>
|
||||||
<span class="Comment">CoffeeScript Compiler v1.2.0</span>
|
<span class="Comment">CoffeeScript Compiler v1.3.0</span>
|
||||||
<span class="Comment">Released under the MIT License</span>
|
<span class="Comment">Released under the MIT License</span>
|
||||||
<span class="Comment"><span class="Comment">*/</span></span>
|
<span class="Comment"><span class="Comment">*/</span></span>
|
||||||
|
|
||||||
</pre><script>window.example37 = "###\nCoffeeScript Compiler v1.2.0\nReleased under the MIT License\n###\n\n\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example37);'>load</div><br class='clear' /></div>
|
|
||||||
|
</pre><script>window.example37 = "###\nCoffeeScript Compiler v1.3.0\nReleased under the MIT License\n###\n\n\n"</script><div class='minibutton load' onclick='javascript: loadConsole(example37);'>load</div><br class='clear' /></div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<span id="regexes" class="bookmark"></span>
|
<span id="regexes" class="bookmark"></span>
|
||||||
<b class="header">Extended Regular Expressions</b>
|
<b class="header">Extended Regular Expressions</b>
|
||||||
Similar to "heredocs" and "herecomments", CoffeeScript supports "heregexes" —
|
Similar to "heredocs" and "herecomments", CoffeeScript supports "heregexes" —
|
||||||
extended regular expressions that ignore internal whitespace and can contain
|
extended regular expressions that ignore internal whitespace and can contain
|
||||||
comments, after Perl's <tt>/x</tt> modifier, but delimited by <tt>///</tt>.
|
comments and interpolation. Modeled after Perl's <tt>/x</tt> modifier, CoffeeSctipt's
|
||||||
They go a long way towards making complex regular expressions readable.
|
heregexes are delimited by <tt>///</tt> and go a long way towards making complex
|
||||||
To quote from the CoffeeScript source:
|
regular expressions readable. To quote from the CoffeeScript source:
|
||||||
</p>
|
</p>
|
||||||
<div class='code'><pre class="idle">OPERATOR <span class="Keyword">=</span> <span class="String">/// ^ (</span>
|
<div class='code'><pre class="idle">OPERATOR <span class="Keyword">=</span> <span class="String">/// ^ (</span>
|
||||||
<span class="String"> ?: [-=]> <span class="Comment"><span class="Comment">#</span> function</span></span>
|
<span class="String"> ?: [-=]> <span class="Comment"><span class="Comment">#</span> function</span></span>
|
||||||
|
@ -2233,6 +2285,56 @@ task(<span class="String"><span class="String">'</span>build:parser<span class="
|
||||||
Change Log
|
Change Log
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<b class="header" style="margin-top: 20px;">
|
||||||
|
<a href="https://github.com/jashkenas/coffee-script/compare/1.2.0...1.3.0">1.3.0</a>
|
||||||
|
<span class="timestamp"> – <small>April 10, 2012</small></span>
|
||||||
|
</b>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
CoffeeScript now enforces all of JavaScript's <b>Strict Mode</b> early syntax
|
||||||
|
errors at compile time. This includes old-style octal literals,
|
||||||
|
duplicate property names in object literals, duplicate parameters in
|
||||||
|
a function definition, deleting naked variables, setting the value of
|
||||||
|
<tt>eval</tt> or <tt>arguments</tt>, and more.
|
||||||
|
See a full discussion at
|
||||||
|
<a href="https://github.com/jashkenas/coffee-script/issues/1547">#1547</a>.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
The REPL now has a handy new multi-line mode for entering large
|
||||||
|
blocks of code. It's useful when copy-and-pasting examples into the
|
||||||
|
REPL. Enter multi-line mode with <tt>Ctrl-V</tt>. You may also now
|
||||||
|
pipe input directly into the REPL.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
CoffeeScript now prints a <tt>Generated by CoffeeScript VERSION</tt>
|
||||||
|
header at the top of each compiled file.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Conditional assignment of previously undefined variables
|
||||||
|
<tt>a or= b</tt> is now considered a syntax error.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
A tweak to the semantics of <tt>do</tt>, which can now be used to
|
||||||
|
more easily simulate a namespace: <tt>do (x = 1, y = 2) -> ...</tt>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Loop indices are now mutable within a loop iteration, and immutable
|
||||||
|
between them.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Both endpoints of a slice are now allowed to be omitted for consistency,
|
||||||
|
effectively creating a shallow copy of the list.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Additional tweaks and improvments to <tt>coffee --watch</tt> under
|
||||||
|
Node's "new" file watching API. Watch will now beep by default
|
||||||
|
if you introduce a syntax error into a watched script. We also now
|
||||||
|
ignore hidden directories by default when watching recursively.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<b class="header" style="margin-top: 20px;">
|
<b class="header" style="margin-top: 20px;">
|
||||||
<a href="https://github.com/jashkenas/coffee-script/compare/1.1.3...1.2.0">1.2.0</a>
|
<a href="https://github.com/jashkenas/coffee-script/compare/1.1.3...1.2.0">1.2.0</a>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var CoffeeScript, runScripts;
|
var CoffeeScript, runScripts;
|
||||||
|
|
||||||
|
@ -7,24 +7,34 @@
|
||||||
CoffeeScript.require = require;
|
CoffeeScript.require = require;
|
||||||
|
|
||||||
CoffeeScript["eval"] = function(code, options) {
|
CoffeeScript["eval"] = function(code, options) {
|
||||||
if (options == null) options = {};
|
if (options == null) {
|
||||||
if (options.bare == null) options.bare = true;
|
options = {};
|
||||||
|
}
|
||||||
|
if (options.bare == null) {
|
||||||
|
options.bare = true;
|
||||||
|
}
|
||||||
return eval(CoffeeScript.compile(code, options));
|
return eval(CoffeeScript.compile(code, options));
|
||||||
};
|
};
|
||||||
|
|
||||||
CoffeeScript.run = function(code, options) {
|
CoffeeScript.run = function(code, options) {
|
||||||
if (options == null) options = {};
|
if (options == null) {
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
options.bare = true;
|
options.bare = true;
|
||||||
return Function(CoffeeScript.compile(code, options))();
|
return Function(CoffeeScript.compile(code, options))();
|
||||||
};
|
};
|
||||||
|
|
||||||
if (typeof window === "undefined" || window === null) return;
|
if (typeof window === "undefined" || window === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CoffeeScript.load = function(url, callback) {
|
CoffeeScript.load = function(url, callback) {
|
||||||
var xhr;
|
var xhr;
|
||||||
xhr = new (window.ActiveXObject || XMLHttpRequest)('Microsoft.XMLHTTP');
|
xhr = new (window.ActiveXObject || XMLHttpRequest)('Microsoft.XMLHTTP');
|
||||||
xhr.open('GET', url, true);
|
xhr.open('GET', url, true);
|
||||||
if ('overrideMimeType' in xhr) xhr.overrideMimeType('text/plain');
|
if ('overrideMimeType' in xhr) {
|
||||||
|
xhr.overrideMimeType('text/plain');
|
||||||
|
}
|
||||||
xhr.onreadystatechange = function() {
|
xhr.onreadystatechange = function() {
|
||||||
var _ref;
|
var _ref;
|
||||||
if (xhr.readyState === 4) {
|
if (xhr.readyState === 4) {
|
||||||
|
@ -33,7 +43,9 @@
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Could not load " + url);
|
throw new Error("Could not load " + url);
|
||||||
}
|
}
|
||||||
if (callback) return callback();
|
if (callback) {
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return xhr.send(null);
|
return xhr.send(null);
|
||||||
|
@ -47,7 +59,9 @@
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = scripts.length; _i < _len; _i++) {
|
for (_i = 0, _len = scripts.length; _i < _len; _i++) {
|
||||||
s = scripts[_i];
|
s = scripts[_i];
|
||||||
if (s.type === 'text/coffeescript') _results.push(s);
|
if (s.type === 'text/coffeescript') {
|
||||||
|
_results.push(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var CoffeeScript, cakefileDirectory, fatalError, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks;
|
var CoffeeScript, cakefileDirectory, fatalError, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks;
|
||||||
|
|
||||||
|
@ -36,7 +36,9 @@
|
||||||
return switches.push([letter, flag, description]);
|
return switches.push([letter, flag, description]);
|
||||||
},
|
},
|
||||||
invoke: function(name) {
|
invoke: function(name) {
|
||||||
if (!tasks[name]) missingTask(name);
|
if (!tasks[name]) {
|
||||||
|
missingTask(name);
|
||||||
|
}
|
||||||
return tasks[name].action(options);
|
return tasks[name].action(options);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -50,7 +52,9 @@
|
||||||
filename: 'Cakefile'
|
filename: 'Cakefile'
|
||||||
});
|
});
|
||||||
oparse = new optparse.OptionParser(switches);
|
oparse = new optparse.OptionParser(switches);
|
||||||
if (!args.length) return printTasks();
|
if (!args.length) {
|
||||||
|
return printTasks();
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
options = oparse.parse(args);
|
options = oparse.parse(args);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -77,7 +81,9 @@
|
||||||
desc = task.description ? "# " + task.description : '';
|
desc = task.description ? "# " + task.description : '';
|
||||||
console.log("cake " + name + spaces + " " + desc);
|
console.log("cake " + name + spaces + " " + desc);
|
||||||
}
|
}
|
||||||
if (switches.length) return console.log(oparse.help());
|
if (switches.length) {
|
||||||
|
return console.log(oparse.help());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
fatalError = function(message) {
|
fatalError = function(message) {
|
||||||
|
@ -92,9 +98,13 @@
|
||||||
|
|
||||||
cakefileDirectory = function(dir) {
|
cakefileDirectory = function(dir) {
|
||||||
var parent;
|
var parent;
|
||||||
if (path.existsSync(path.join(dir, 'Cakefile'))) return dir;
|
if (path.existsSync(path.join(dir, 'Cakefile'))) {
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
parent = path.normalize(path.join(dir, '..'));
|
parent = path.normalize(path.join(dir, '..'));
|
||||||
if (parent !== dir) return cakefileDirectory(parent);
|
if (parent !== dir) {
|
||||||
|
return cakefileDirectory(parent);
|
||||||
|
}
|
||||||
throw new Error("Cakefile not found in " + (process.cwd()));
|
throw new Error("Cakefile not found in " + (process.cwd()));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var Lexer, RESERVED, compile, fs, lexer, parser, path, vm, _ref,
|
var Lexer, RESERVED, compile, fs, lexer, parser, path, vm, _ref,
|
||||||
__hasProp = {}.hasOwnProperty;
|
__hasProp = {}.hasOwnProperty;
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.VERSION = '1.2.1-pre';
|
exports.VERSION = '1.3.0';
|
||||||
|
|
||||||
exports.RESERVED = RESERVED;
|
exports.RESERVED = RESERVED;
|
||||||
|
|
||||||
|
@ -35,11 +35,15 @@
|
||||||
|
|
||||||
exports.compile = compile = function(code, options) {
|
exports.compile = compile = function(code, options) {
|
||||||
var header, js, merge;
|
var header, js, merge;
|
||||||
if (options == null) options = {};
|
if (options == null) {
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
merge = exports.helpers.merge;
|
merge = exports.helpers.merge;
|
||||||
try {
|
try {
|
||||||
js = (parser.parse(lexer.tokenize(code))).compile(options);
|
js = (parser.parse(lexer.tokenize(code))).compile(options);
|
||||||
if (!options.header) return js;
|
if (!options.header) {
|
||||||
|
return js;
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (options.filename) {
|
if (options.filename) {
|
||||||
err.message = "In " + options.filename + ", " + err.message;
|
err.message = "In " + options.filename + ", " + err.message;
|
||||||
|
@ -64,7 +68,9 @@
|
||||||
|
|
||||||
exports.run = function(code, options) {
|
exports.run = function(code, options) {
|
||||||
var mainModule;
|
var mainModule;
|
||||||
if (options == null) options = {};
|
if (options == null) {
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
mainModule = require.main;
|
mainModule = require.main;
|
||||||
mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '.';
|
mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '.';
|
||||||
mainModule.moduleCache && (mainModule.moduleCache = {});
|
mainModule.moduleCache && (mainModule.moduleCache = {});
|
||||||
|
@ -78,8 +84,12 @@
|
||||||
|
|
||||||
exports["eval"] = function(code, options) {
|
exports["eval"] = function(code, options) {
|
||||||
var Module, Script, js, k, o, r, sandbox, v, _i, _len, _module, _ref1, _ref2, _require;
|
var Module, Script, js, k, o, r, sandbox, v, _i, _len, _module, _ref1, _ref2, _require;
|
||||||
if (options == null) options = {};
|
if (options == null) {
|
||||||
if (!(code = code.trim())) return;
|
options = {};
|
||||||
|
}
|
||||||
|
if (!(code = code.trim())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
Script = vm.Script;
|
Script = vm.Script;
|
||||||
if (Script) {
|
if (Script) {
|
||||||
if (options.sandbox != null) {
|
if (options.sandbox != null) {
|
||||||
|
@ -110,7 +120,9 @@
|
||||||
_ref2 = Object.getOwnPropertyNames(require);
|
_ref2 = Object.getOwnPropertyNames(require);
|
||||||
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
|
||||||
r = _ref2[_i];
|
r = _ref2[_i];
|
||||||
if (r !== 'paths') _require[r] = require[r];
|
if (r !== 'paths') {
|
||||||
|
_require[r] = require[r];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_require.paths = _module.paths = Module._nodeModulePaths(process.cwd());
|
_require.paths = _module.paths = Module._nodeModulePaths(process.cwd());
|
||||||
_require.resolve = function(request) {
|
_require.resolve = function(request) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, forkNode, fs, helpers, hidden, joinTimeout, lint, loadRequires, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, removeSource, sourceCode, sources, spawn, timeLog, unwatchDir, usage, version, wait, watch, watchDir, watchers, writeJs, _ref;
|
var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, forkNode, fs, helpers, hidden, joinTimeout, lint, loadRequires, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, removeSource, sourceCode, sources, spawn, timeLog, unwatchDir, usage, version, wait, watch, watchDir, watchers, writeJs, _ref;
|
||||||
|
|
||||||
|
@ -49,17 +49,33 @@
|
||||||
exports.run = function() {
|
exports.run = function() {
|
||||||
var literals, source, _i, _len, _results;
|
var literals, source, _i, _len, _results;
|
||||||
parseOptions();
|
parseOptions();
|
||||||
if (opts.nodejs) return forkNode();
|
if (opts.nodejs) {
|
||||||
if (opts.help) return usage();
|
return forkNode();
|
||||||
if (opts.version) return version();
|
}
|
||||||
if (opts.require) loadRequires();
|
if (opts.help) {
|
||||||
if (opts.interactive) return require('./repl');
|
return usage();
|
||||||
|
}
|
||||||
|
if (opts.version) {
|
||||||
|
return version();
|
||||||
|
}
|
||||||
|
if (opts.require) {
|
||||||
|
loadRequires();
|
||||||
|
}
|
||||||
|
if (opts.interactive) {
|
||||||
|
return require('./repl');
|
||||||
|
}
|
||||||
if (opts.watch && !fs.watch) {
|
if (opts.watch && !fs.watch) {
|
||||||
return printWarn("The --watch feature depends on Node v0.6.0+. You are running " + process.version + ".");
|
return printWarn("The --watch feature depends on Node v0.6.0+. You are running " + process.version + ".");
|
||||||
}
|
}
|
||||||
if (opts.stdio) return compileStdio();
|
if (opts.stdio) {
|
||||||
if (opts["eval"]) return compileScript(null, sources[0]);
|
return compileStdio();
|
||||||
if (!sources.length) return require('./repl');
|
}
|
||||||
|
if (opts["eval"]) {
|
||||||
|
return compileScript(null, sources[0]);
|
||||||
|
}
|
||||||
|
if (!sources.length) {
|
||||||
|
return require('./repl');
|
||||||
|
}
|
||||||
literals = opts.run ? sources.splice(1) : [];
|
literals = opts.run ? sources.splice(1) : [];
|
||||||
process.argv = process.argv.slice(0, 2).concat(literals);
|
process.argv = process.argv.slice(0, 2).concat(literals);
|
||||||
process.argv[0] = 'coffee';
|
process.argv[0] = 'coffee';
|
||||||
|
@ -74,7 +90,9 @@
|
||||||
|
|
||||||
compilePath = function(source, topLevel, base) {
|
compilePath = function(source, topLevel, base) {
|
||||||
return fs.stat(source, function(err, stats) {
|
return fs.stat(source, function(err, stats) {
|
||||||
if (err && err.code !== 'ENOENT') throw err;
|
if (err && err.code !== 'ENOENT') {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
if ((err != null ? err.code : void 0) === 'ENOENT') {
|
if ((err != null ? err.code : void 0) === 'ENOENT') {
|
||||||
if (topLevel && source.slice(-7) !== '.coffee') {
|
if (topLevel && source.slice(-7) !== '.coffee') {
|
||||||
source = sources[sources.indexOf(source)] = "" + source + ".coffee";
|
source = sources[sources.indexOf(source)] = "" + source + ".coffee";
|
||||||
|
@ -87,11 +105,17 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (stats.isDirectory()) {
|
if (stats.isDirectory()) {
|
||||||
if (opts.watch) watchDir(source, base);
|
if (opts.watch) {
|
||||||
|
watchDir(source, base);
|
||||||
|
}
|
||||||
return fs.readdir(source, function(err, files) {
|
return fs.readdir(source, function(err, files) {
|
||||||
var file, index, _i, _len, _ref1, _ref2, _results;
|
var file, index, _i, _len, _ref1, _ref2, _results;
|
||||||
if (err && err.code !== 'ENOENT') throw err;
|
if (err && err.code !== 'ENOENT') {
|
||||||
if ((err != null ? err.code : void 0) === 'ENOENT') return;
|
throw err;
|
||||||
|
}
|
||||||
|
if ((err != null ? err.code : void 0) === 'ENOENT') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
index = sources.indexOf(source);
|
index = sources.indexOf(source);
|
||||||
[].splice.apply(sources, [index, index - index + 1].concat(_ref1 = (function() {
|
[].splice.apply(sources, [index, index - index + 1].concat(_ref1 = (function() {
|
||||||
var _i, _len, _results;
|
var _i, _len, _results;
|
||||||
|
@ -115,10 +139,16 @@
|
||||||
return _results;
|
return _results;
|
||||||
});
|
});
|
||||||
} else if (topLevel || path.extname(source) === '.coffee') {
|
} else if (topLevel || path.extname(source) === '.coffee') {
|
||||||
if (opts.watch) watch(source, base);
|
if (opts.watch) {
|
||||||
|
watch(source, base);
|
||||||
|
}
|
||||||
return fs.readFile(source, function(err, code) {
|
return fs.readFile(source, function(err, code) {
|
||||||
if (err && err.code !== 'ENOENT') throw err;
|
if (err && err.code !== 'ENOENT') {
|
||||||
if ((err != null ? err.code : void 0) === 'ENOENT') return;
|
throw err;
|
||||||
|
}
|
||||||
|
if ((err != null ? err.code : void 0) === 'ENOENT') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
return compileScript(source, code.toString(), base);
|
return compileScript(source, code.toString(), base);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -161,8 +191,12 @@
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
CoffeeScript.emit('failure', err, task);
|
CoffeeScript.emit('failure', err, task);
|
||||||
if (CoffeeScript.listeners('failure').length) return;
|
if (CoffeeScript.listeners('failure').length) {
|
||||||
if (o.watch) return printLine(err.message + '\x07');
|
return;
|
||||||
|
}
|
||||||
|
if (o.watch) {
|
||||||
|
return printLine(err.message + '\x07');
|
||||||
|
}
|
||||||
printWarn(err instanceof Error && err.stack || ("ERROR: " + err));
|
printWarn(err instanceof Error && err.stack || ("ERROR: " + err));
|
||||||
return process.exit(1);
|
return process.exit(1);
|
||||||
}
|
}
|
||||||
|
@ -173,7 +207,9 @@
|
||||||
code = '';
|
code = '';
|
||||||
stdin = process.openStdin();
|
stdin = process.openStdin();
|
||||||
stdin.on('data', function(buffer) {
|
stdin.on('data', function(buffer) {
|
||||||
if (buffer) return code += buffer.toString();
|
if (buffer) {
|
||||||
|
return code += buffer.toString();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return stdin.on('end', function() {
|
return stdin.on('end', function() {
|
||||||
return compileScript(null, code);
|
return compileScript(null, code);
|
||||||
|
@ -183,7 +219,9 @@
|
||||||
joinTimeout = null;
|
joinTimeout = null;
|
||||||
|
|
||||||
compileJoin = function() {
|
compileJoin = function() {
|
||||||
if (!opts.join) return;
|
if (!opts.join) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!sourceCode.some(function(code) {
|
if (!sourceCode.some(function(code) {
|
||||||
return code === null;
|
return code === null;
|
||||||
})) {
|
})) {
|
||||||
|
@ -212,7 +250,9 @@
|
||||||
compileTimeout = null;
|
compileTimeout = null;
|
||||||
watchErr = function(e) {
|
watchErr = function(e) {
|
||||||
if (e.code === 'ENOENT') {
|
if (e.code === 'ENOENT') {
|
||||||
if (sources.indexOf(source) === -1) return;
|
if (sources.indexOf(source) === -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
rewatch();
|
rewatch();
|
||||||
return compile();
|
return compile();
|
||||||
|
@ -228,13 +268,17 @@
|
||||||
clearTimeout(compileTimeout);
|
clearTimeout(compileTimeout);
|
||||||
return compileTimeout = wait(25, function() {
|
return compileTimeout = wait(25, function() {
|
||||||
return fs.stat(source, function(err, stats) {
|
return fs.stat(source, function(err, stats) {
|
||||||
if (err) return watchErr(err);
|
if (err) {
|
||||||
|
return watchErr(err);
|
||||||
|
}
|
||||||
if (prevStats && stats.size === prevStats.size && stats.mtime.getTime() === prevStats.mtime.getTime()) {
|
if (prevStats && stats.size === prevStats.size && stats.mtime.getTime() === prevStats.mtime.getTime()) {
|
||||||
return rewatch();
|
return rewatch();
|
||||||
}
|
}
|
||||||
prevStats = stats;
|
prevStats = stats;
|
||||||
return fs.readFile(source, function(err, code) {
|
return fs.readFile(source, function(err, code) {
|
||||||
if (err) return watchErr(err);
|
if (err) {
|
||||||
|
return watchErr(err);
|
||||||
|
}
|
||||||
compileScript(source, code.toString(), base);
|
compileScript(source, code.toString(), base);
|
||||||
return rewatch();
|
return rewatch();
|
||||||
});
|
});
|
||||||
|
@ -247,7 +291,9 @@
|
||||||
watchErr(e);
|
watchErr(e);
|
||||||
}
|
}
|
||||||
return rewatch = function() {
|
return rewatch = function() {
|
||||||
if (watcher != null) watcher.close();
|
if (watcher != null) {
|
||||||
|
watcher.close();
|
||||||
|
}
|
||||||
return watcher = fs.watch(source, compile);
|
return watcher = fs.watch(source, compile);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -262,14 +308,18 @@
|
||||||
return fs.readdir(source, function(err, files) {
|
return fs.readdir(source, function(err, files) {
|
||||||
var file, _i, _len, _results;
|
var file, _i, _len, _results;
|
||||||
if (err) {
|
if (err) {
|
||||||
if (err.code !== 'ENOENT') throw err;
|
if (err.code !== 'ENOENT') {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
watcher.close();
|
watcher.close();
|
||||||
return unwatchDir(source, base);
|
return unwatchDir(source, base);
|
||||||
}
|
}
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = files.length; _i < _len; _i++) {
|
for (_i = 0, _len = files.length; _i < _len; _i++) {
|
||||||
file = files[_i];
|
file = files[_i];
|
||||||
if (!(!hidden(file) && !notSources[file])) continue;
|
if (!(!hidden(file) && !notSources[file])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
file = path.join(source, file);
|
file = path.join(source, file);
|
||||||
if (sources.some(function(s) {
|
if (sources.some(function(s) {
|
||||||
return s.indexOf(file) >= 0;
|
return s.indexOf(file) >= 0;
|
||||||
|
@ -285,7 +335,9 @@
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e.code !== 'ENOENT') throw e;
|
if (e.code !== 'ENOENT') {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -297,7 +349,9 @@
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = sources.length; _i < _len; _i++) {
|
for (_i = 0, _len = sources.length; _i < _len; _i++) {
|
||||||
file = sources[_i];
|
file = sources[_i];
|
||||||
if (file.indexOf(source) >= 0) _results.push(file);
|
if (file.indexOf(source) >= 0) {
|
||||||
|
_results.push(file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
})();
|
})();
|
||||||
|
@ -323,7 +377,9 @@
|
||||||
return path.exists(jsPath, function(exists) {
|
return path.exists(jsPath, function(exists) {
|
||||||
if (exists) {
|
if (exists) {
|
||||||
return fs.unlink(jsPath, function(err) {
|
return fs.unlink(jsPath, function(err) {
|
||||||
if (err && err.code !== 'ENOENT') throw err;
|
if (err && err.code !== 'ENOENT') {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
return timeLog("removed " + source);
|
return timeLog("removed " + source);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -345,7 +401,9 @@
|
||||||
jsPath = outputPath(source, base);
|
jsPath = outputPath(source, base);
|
||||||
jsDir = path.dirname(jsPath);
|
jsDir = path.dirname(jsPath);
|
||||||
compile = function() {
|
compile = function() {
|
||||||
if (js.length <= 0) js = ' ';
|
if (js.length <= 0) {
|
||||||
|
js = ' ';
|
||||||
|
}
|
||||||
return fs.writeFile(jsPath, js, function(err) {
|
return fs.writeFile(jsPath, js, function(err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return printLine(err.message);
|
return printLine(err.message);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap;
|
var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap;
|
||||||
|
|
||||||
|
@ -9,7 +9,9 @@
|
||||||
o = function(patternString, action, options) {
|
o = function(patternString, action, options) {
|
||||||
var match;
|
var match;
|
||||||
patternString = patternString.replace(/\s{2,}/g, ' ');
|
patternString = patternString.replace(/\s{2,}/g, ' ');
|
||||||
if (!action) return [patternString, '$$ = $1;', options];
|
if (!action) {
|
||||||
|
return [patternString, '$$ = $1;', options];
|
||||||
|
}
|
||||||
action = (match = unwrap.exec(action)) ? match[1] : "(" + action + "())";
|
action = (match = unwrap.exec(action)) ? match[1] : "(" + action + "())";
|
||||||
action = action.replace(/\bnew /g, '$&yy.');
|
action = action.replace(/\bnew /g, '$&yy.');
|
||||||
action = action.replace(/\b(?:Block\.wrap|extend)\b/g, 'yy.$&');
|
action = action.replace(/\b(?:Block\.wrap|extend)\b/g, 'yy.$&');
|
||||||
|
@ -65,7 +67,9 @@
|
||||||
}), o('BOOL', function() {
|
}), o('BOOL', function() {
|
||||||
var val;
|
var val;
|
||||||
val = new Literal($1);
|
val = new Literal($1);
|
||||||
if ($1 === 'undefined') val.isUndefined = true;
|
if ($1 === 'undefined') {
|
||||||
|
val.isUndefined = true;
|
||||||
|
}
|
||||||
return val;
|
return val;
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
|
@ -576,9 +580,13 @@
|
||||||
_ref = alt[0].split(' ');
|
_ref = alt[0].split(' ');
|
||||||
for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
|
for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
|
||||||
token = _ref[_j];
|
token = _ref[_j];
|
||||||
if (!grammar[token]) tokens.push(token);
|
if (!grammar[token]) {
|
||||||
|
tokens.push(token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (name === 'Root') {
|
||||||
|
alt[1] = "return " + alt[1];
|
||||||
}
|
}
|
||||||
if (name === 'Root') alt[1] = "return " + alt[1];
|
|
||||||
_results.push(alt);
|
_results.push(alt);
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var extend, flatten;
|
var extend, flatten;
|
||||||
|
|
||||||
|
@ -17,7 +17,9 @@
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = array.length; _i < _len; _i++) {
|
for (_i = 0, _len = array.length; _i < _len; _i++) {
|
||||||
item = array[_i];
|
item = array[_i];
|
||||||
if (item) _results.push(item);
|
if (item) {
|
||||||
|
_results.push(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
};
|
};
|
||||||
|
@ -25,7 +27,9 @@
|
||||||
exports.count = function(string, substr) {
|
exports.count = function(string, substr) {
|
||||||
var num, pos;
|
var num, pos;
|
||||||
num = pos = 0;
|
num = pos = 0;
|
||||||
if (!substr.length) return 1 / 0;
|
if (!substr.length) {
|
||||||
|
return 1 / 0;
|
||||||
|
}
|
||||||
while (pos = 1 + string.indexOf(substr, pos)) {
|
while (pos = 1 + string.indexOf(substr, pos)) {
|
||||||
num++;
|
num++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var key, val, _ref;
|
var key, val, _ref;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, key, last, starts, _ref, _ref1,
|
var BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, key, last, starts, _ref, _ref1,
|
||||||
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||||
|
@ -15,8 +15,12 @@
|
||||||
|
|
||||||
Lexer.prototype.tokenize = function(code, opts) {
|
Lexer.prototype.tokenize = function(code, opts) {
|
||||||
var i, tag;
|
var i, tag;
|
||||||
if (opts == null) opts = {};
|
if (opts == null) {
|
||||||
if (WHITESPACE.test(code)) code = "\n" + code;
|
opts = {};
|
||||||
|
}
|
||||||
|
if (WHITESPACE.test(code)) {
|
||||||
|
code = "\n" + code;
|
||||||
|
}
|
||||||
code = code.replace(/\r/g, '').replace(TRAILING_SPACES, '');
|
code = code.replace(/\r/g, '').replace(TRAILING_SPACES, '');
|
||||||
this.code = code;
|
this.code = code;
|
||||||
this.line = opts.line || 0;
|
this.line = opts.line || 0;
|
||||||
|
@ -31,14 +35,20 @@
|
||||||
i += this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken();
|
i += this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken();
|
||||||
}
|
}
|
||||||
this.closeIndentation();
|
this.closeIndentation();
|
||||||
if (tag = this.ends.pop()) this.error("missing " + tag);
|
if (tag = this.ends.pop()) {
|
||||||
if (opts.rewrite === false) return this.tokens;
|
this.error("missing " + tag);
|
||||||
|
}
|
||||||
|
if (opts.rewrite === false) {
|
||||||
|
return this.tokens;
|
||||||
|
}
|
||||||
return (new Rewriter).rewrite(this.tokens);
|
return (new Rewriter).rewrite(this.tokens);
|
||||||
};
|
};
|
||||||
|
|
||||||
Lexer.prototype.identifierToken = function() {
|
Lexer.prototype.identifierToken = function() {
|
||||||
var colon, forcedIdentifier, id, input, match, prev, tag, _ref2, _ref3;
|
var colon, forcedIdentifier, id, input, match, prev, tag, _ref2, _ref3;
|
||||||
if (!(match = IDENTIFIER.exec(this.chunk))) return 0;
|
if (!(match = IDENTIFIER.exec(this.chunk))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
input = match[0], id = match[1], colon = match[2];
|
input = match[0], id = match[1], colon = match[2];
|
||||||
if (id === 'own' && this.tag() === 'FOR') {
|
if (id === 'own' && this.tag() === 'FOR') {
|
||||||
this.token('OWN', id);
|
this.token('OWN', id);
|
||||||
|
@ -79,7 +89,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!forcedIdentifier) {
|
if (!forcedIdentifier) {
|
||||||
if (__indexOf.call(COFFEE_ALIASES, id) >= 0) id = COFFEE_ALIAS_MAP[id];
|
if (__indexOf.call(COFFEE_ALIASES, id) >= 0) {
|
||||||
|
id = COFFEE_ALIAS_MAP[id];
|
||||||
|
}
|
||||||
tag = (function() {
|
tag = (function() {
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case '!':
|
case '!':
|
||||||
|
@ -104,13 +116,17 @@
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
this.token(tag, id);
|
this.token(tag, id);
|
||||||
if (colon) this.token(':', ':');
|
if (colon) {
|
||||||
|
this.token(':', ':');
|
||||||
|
}
|
||||||
return input.length;
|
return input.length;
|
||||||
};
|
};
|
||||||
|
|
||||||
Lexer.prototype.numberToken = function() {
|
Lexer.prototype.numberToken = function() {
|
||||||
var binaryLiteral, lexedLength, match, number, octalLiteral;
|
var binaryLiteral, lexedLength, match, number, octalLiteral;
|
||||||
if (!(match = NUMBER.exec(this.chunk))) return 0;
|
if (!(match = NUMBER.exec(this.chunk))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
number = match[0];
|
number = match[0];
|
||||||
if (/^0[BOX]/.test(number)) {
|
if (/^0[BOX]/.test(number)) {
|
||||||
this.error("radix prefix '" + number + "' must be lowercase");
|
this.error("radix prefix '" + number + "' must be lowercase");
|
||||||
|
@ -136,11 +152,15 @@
|
||||||
var match, octalEsc, string;
|
var match, octalEsc, string;
|
||||||
switch (this.chunk.charAt(0)) {
|
switch (this.chunk.charAt(0)) {
|
||||||
case "'":
|
case "'":
|
||||||
if (!(match = SIMPLESTR.exec(this.chunk))) return 0;
|
if (!(match = SIMPLESTR.exec(this.chunk))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
this.token('STRING', (string = match[0]).replace(MULTILINER, '\\\n'));
|
this.token('STRING', (string = match[0]).replace(MULTILINER, '\\\n'));
|
||||||
break;
|
break;
|
||||||
case '"':
|
case '"':
|
||||||
if (!(string = this.balancedString(this.chunk, '"'))) return 0;
|
if (!(string = this.balancedString(this.chunk, '"'))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (0 < string.indexOf('#{', 1)) {
|
if (0 < string.indexOf('#{', 1)) {
|
||||||
this.interpolateString(string.slice(1, -1));
|
this.interpolateString(string.slice(1, -1));
|
||||||
} else {
|
} else {
|
||||||
|
@ -159,7 +179,9 @@
|
||||||
|
|
||||||
Lexer.prototype.heredocToken = function() {
|
Lexer.prototype.heredocToken = function() {
|
||||||
var doc, heredoc, match, quote;
|
var doc, heredoc, match, quote;
|
||||||
if (!(match = HEREDOC.exec(this.chunk))) return 0;
|
if (!(match = HEREDOC.exec(this.chunk))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
heredoc = match[0];
|
heredoc = match[0];
|
||||||
quote = heredoc.charAt(0);
|
quote = heredoc.charAt(0);
|
||||||
doc = this.sanitizeHeredoc(match[2], {
|
doc = this.sanitizeHeredoc(match[2], {
|
||||||
|
@ -179,7 +201,9 @@
|
||||||
|
|
||||||
Lexer.prototype.commentToken = function() {
|
Lexer.prototype.commentToken = function() {
|
||||||
var comment, here, match;
|
var comment, here, match;
|
||||||
if (!(match = this.chunk.match(COMMENT))) return 0;
|
if (!(match = this.chunk.match(COMMENT))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
comment = match[0], here = match[1];
|
comment = match[0], here = match[1];
|
||||||
if (here) {
|
if (here) {
|
||||||
this.token('HERECOMMENT', this.sanitizeHeredoc(here, {
|
this.token('HERECOMMENT', this.sanitizeHeredoc(here, {
|
||||||
|
@ -202,7 +226,9 @@
|
||||||
|
|
||||||
Lexer.prototype.regexToken = function() {
|
Lexer.prototype.regexToken = function() {
|
||||||
var flags, length, match, prev, regex, _ref2, _ref3;
|
var flags, length, match, prev, regex, _ref2, _ref3;
|
||||||
if (this.chunk.charAt(0) !== '/') return 0;
|
if (this.chunk.charAt(0) !== '/') {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (match = HEREGEX.exec(this.chunk)) {
|
if (match = HEREGEX.exec(this.chunk)) {
|
||||||
length = this.heregexToken(match);
|
length = this.heregexToken(match);
|
||||||
this.line += count(match[0], '\n');
|
this.line += count(match[0], '\n');
|
||||||
|
@ -212,12 +238,16 @@
|
||||||
if (prev && (_ref2 = prev[0], __indexOf.call((prev.spaced ? NOT_REGEX : NOT_SPACED_REGEX), _ref2) >= 0)) {
|
if (prev && (_ref2 = prev[0], __indexOf.call((prev.spaced ? NOT_REGEX : NOT_SPACED_REGEX), _ref2) >= 0)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!(match = REGEX.exec(this.chunk))) return 0;
|
if (!(match = REGEX.exec(this.chunk))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
_ref3 = match, match = _ref3[0], regex = _ref3[1], flags = _ref3[2];
|
_ref3 = match, match = _ref3[0], regex = _ref3[1], flags = _ref3[2];
|
||||||
if (regex.slice(0, 2) === '/*') {
|
if (regex.slice(0, 2) === '/*') {
|
||||||
this.error('regular expressions cannot begin with `*`');
|
this.error('regular expressions cannot begin with `*`');
|
||||||
}
|
}
|
||||||
if (regex === '//') regex = '/(?:)/';
|
if (regex === '//') {
|
||||||
|
regex = '/(?:)/';
|
||||||
|
}
|
||||||
this.token('REGEX', "" + regex + flags);
|
this.token('REGEX', "" + regex + flags);
|
||||||
return match.length;
|
return match.length;
|
||||||
};
|
};
|
||||||
|
@ -244,7 +274,9 @@
|
||||||
if (tag === 'TOKENS') {
|
if (tag === 'TOKENS') {
|
||||||
tokens.push.apply(tokens, value);
|
tokens.push.apply(tokens, value);
|
||||||
} else {
|
} else {
|
||||||
if (!(value = value.replace(HEREGEX_OMIT, ''))) continue;
|
if (!(value = value.replace(HEREGEX_OMIT, ''))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
value = value.replace(/\\/g, '\\\\');
|
value = value.replace(/\\/g, '\\\\');
|
||||||
tokens.push(['STRING', this.makeString(value, '"', true)]);
|
tokens.push(['STRING', this.makeString(value, '"', true)]);
|
||||||
}
|
}
|
||||||
|
@ -255,14 +287,18 @@
|
||||||
this.tokens.push(['STRING', '""'], ['+', '+']);
|
this.tokens.push(['STRING', '""'], ['+', '+']);
|
||||||
}
|
}
|
||||||
(_ref5 = this.tokens).push.apply(_ref5, tokens);
|
(_ref5 = this.tokens).push.apply(_ref5, tokens);
|
||||||
if (flags) this.tokens.push([',', ','], ['STRING', '"' + flags + '"']);
|
if (flags) {
|
||||||
|
this.tokens.push([',', ','], ['STRING', '"' + flags + '"']);
|
||||||
|
}
|
||||||
this.token(')', ')');
|
this.token(')', ')');
|
||||||
return heregex.length;
|
return heregex.length;
|
||||||
};
|
};
|
||||||
|
|
||||||
Lexer.prototype.lineToken = function() {
|
Lexer.prototype.lineToken = function() {
|
||||||
var diff, indent, match, noNewlines, prev, size;
|
var diff, indent, match, noNewlines, prev, size;
|
||||||
if (!(match = MULTI_DENT.exec(this.chunk))) return 0;
|
if (!(match = MULTI_DENT.exec(this.chunk))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
indent = match[0];
|
indent = match[0];
|
||||||
this.line += count(indent, '\n');
|
this.line += count(indent, '\n');
|
||||||
this.seenFor = false;
|
this.seenFor = false;
|
||||||
|
@ -316,7 +352,9 @@
|
||||||
this.token('OUTDENT', dent);
|
this.token('OUTDENT', dent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dent) this.outdebt -= moveOut;
|
if (dent) {
|
||||||
|
this.outdebt -= moveOut;
|
||||||
|
}
|
||||||
while (this.value() === ';') {
|
while (this.value() === ';') {
|
||||||
this.tokens.pop();
|
this.tokens.pop();
|
||||||
}
|
}
|
||||||
|
@ -332,7 +370,9 @@
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
prev = last(this.tokens);
|
prev = last(this.tokens);
|
||||||
if (prev) prev[match ? 'spaced' : 'newLine'] = true;
|
if (prev) {
|
||||||
|
prev[match ? 'spaced' : 'newLine'] = true;
|
||||||
|
}
|
||||||
if (match) {
|
if (match) {
|
||||||
return match[0].length;
|
return match[0].length;
|
||||||
} else {
|
} else {
|
||||||
|
@ -344,12 +384,16 @@
|
||||||
while (this.value() === ';') {
|
while (this.value() === ';') {
|
||||||
this.tokens.pop();
|
this.tokens.pop();
|
||||||
}
|
}
|
||||||
if (this.tag() !== 'TERMINATOR') this.token('TERMINATOR', '\n');
|
if (this.tag() !== 'TERMINATOR') {
|
||||||
|
this.token('TERMINATOR', '\n');
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
Lexer.prototype.suppressNewlines = function() {
|
Lexer.prototype.suppressNewlines = function() {
|
||||||
if (this.value() === '\\') this.tokens.pop();
|
if (this.value() === '\\') {
|
||||||
|
this.tokens.pop();
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -357,7 +401,9 @@
|
||||||
var match, prev, tag, value, _ref2, _ref3, _ref4, _ref5;
|
var match, prev, tag, value, _ref2, _ref3, _ref4, _ref5;
|
||||||
if (match = OPERATOR.exec(this.chunk)) {
|
if (match = OPERATOR.exec(this.chunk)) {
|
||||||
value = match[0];
|
value = match[0];
|
||||||
if (CODE.test(value)) this.tagParameters();
|
if (CODE.test(value)) {
|
||||||
|
this.tagParameters();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
value = this.chunk.charAt(0);
|
value = this.chunk.charAt(0);
|
||||||
}
|
}
|
||||||
|
@ -390,7 +436,9 @@
|
||||||
tag = 'LOGIC';
|
tag = 'LOGIC';
|
||||||
} else if (prev && !prev.spaced) {
|
} else if (prev && !prev.spaced) {
|
||||||
if (value === '(' && (_ref4 = prev[0], __indexOf.call(CALLABLE, _ref4) >= 0)) {
|
if (value === '(' && (_ref4 = prev[0], __indexOf.call(CALLABLE, _ref4) >= 0)) {
|
||||||
if (prev[0] === '?') prev[0] = 'FUNC_EXIST';
|
if (prev[0] === '?') {
|
||||||
|
prev[0] = 'FUNC_EXIST';
|
||||||
|
}
|
||||||
tag = 'CALL_START';
|
tag = 'CALL_START';
|
||||||
} else if (value === '[' && (_ref5 = prev[0], __indexOf.call(INDEXABLE, _ref5) >= 0)) {
|
} else if (value === '[' && (_ref5 = prev[0], __indexOf.call(INDEXABLE, _ref5) >= 0)) {
|
||||||
tag = 'INDEX_START';
|
tag = 'INDEX_START';
|
||||||
|
@ -422,7 +470,9 @@
|
||||||
if (HEREDOC_ILLEGAL.test(doc)) {
|
if (HEREDOC_ILLEGAL.test(doc)) {
|
||||||
this.error("block comment cannot contain \"*/\", starting");
|
this.error("block comment cannot contain \"*/\", starting");
|
||||||
}
|
}
|
||||||
if (doc.indexOf('\n') <= 0) return doc;
|
if (doc.indexOf('\n') <= 0) {
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
while (match = HEREDOC_INDENT.exec(doc)) {
|
while (match = HEREDOC_INDENT.exec(doc)) {
|
||||||
attempt = match[1];
|
attempt = match[1];
|
||||||
|
@ -431,14 +481,20 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (indent) doc = doc.replace(RegExp("\\n" + indent, "g"), '\n');
|
if (indent) {
|
||||||
if (!herecomment) doc = doc.replace(/^\n/, '');
|
doc = doc.replace(RegExp("\\n" + indent, "g"), '\n');
|
||||||
|
}
|
||||||
|
if (!herecomment) {
|
||||||
|
doc = doc.replace(/^\n/, '');
|
||||||
|
}
|
||||||
return doc;
|
return doc;
|
||||||
};
|
};
|
||||||
|
|
||||||
Lexer.prototype.tagParameters = function() {
|
Lexer.prototype.tagParameters = function() {
|
||||||
var i, stack, tok, tokens;
|
var i, stack, tok, tokens;
|
||||||
if (this.tag() !== ')') return this;
|
if (this.tag() !== ')') {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
stack = [];
|
stack = [];
|
||||||
tokens = this.tokens;
|
tokens = this.tokens;
|
||||||
i = tokens.length;
|
i = tokens.length;
|
||||||
|
@ -482,7 +538,9 @@
|
||||||
continue;
|
continue;
|
||||||
case end:
|
case end:
|
||||||
stack.pop();
|
stack.pop();
|
||||||
if (!stack.length) return str.slice(0, i + 1 || 9e9);
|
if (!stack.length) {
|
||||||
|
return str.slice(0, i + 1 || 9e9);
|
||||||
|
}
|
||||||
end = stack[stack.length - 1];
|
end = stack[stack.length - 1];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -502,7 +560,9 @@
|
||||||
|
|
||||||
Lexer.prototype.interpolateString = function(str, options) {
|
Lexer.prototype.interpolateString = function(str, options) {
|
||||||
var expr, heredoc, i, inner, interpolated, len, letter, nested, pi, regex, tag, tokens, value, _i, _len, _ref2, _ref3, _ref4;
|
var expr, heredoc, i, inner, interpolated, len, letter, nested, pi, regex, tag, tokens, value, _i, _len, _ref2, _ref3, _ref4;
|
||||||
if (options == null) options = {};
|
if (options == null) {
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
heredoc = options.heredoc, regex = options.regex;
|
heredoc = options.heredoc, regex = options.regex;
|
||||||
tokens = [];
|
tokens = [];
|
||||||
pi = 0;
|
pi = 0;
|
||||||
|
@ -515,7 +575,9 @@
|
||||||
if (!(letter === '#' && str.charAt(i + 1) === '{' && (expr = this.balancedString(str.slice(i + 1), '}')))) {
|
if (!(letter === '#' && str.charAt(i + 1) === '{' && (expr = this.balancedString(str.slice(i + 1), '}')))) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (pi < i) tokens.push(['NEOSTRING', str.slice(pi, i)]);
|
if (pi < i) {
|
||||||
|
tokens.push(['NEOSTRING', str.slice(pi, i)]);
|
||||||
|
}
|
||||||
inner = expr.slice(1, -1);
|
inner = expr.slice(1, -1);
|
||||||
if (inner.length) {
|
if (inner.length) {
|
||||||
nested = new Lexer().tokenize(inner, {
|
nested = new Lexer().tokenize(inner, {
|
||||||
|
@ -537,28 +599,44 @@
|
||||||
i += expr.length;
|
i += expr.length;
|
||||||
pi = i + 1;
|
pi = i + 1;
|
||||||
}
|
}
|
||||||
if ((i > pi && pi < str.length)) tokens.push(['NEOSTRING', str.slice(pi)]);
|
if ((i > pi && pi < str.length)) {
|
||||||
if (regex) return tokens;
|
tokens.push(['NEOSTRING', str.slice(pi)]);
|
||||||
if (!tokens.length) return this.token('STRING', '""');
|
}
|
||||||
if (tokens[0][0] !== 'NEOSTRING') tokens.unshift(['', '']);
|
if (regex) {
|
||||||
if (interpolated = tokens.length > 1) this.token('(', '(');
|
return tokens;
|
||||||
|
}
|
||||||
|
if (!tokens.length) {
|
||||||
|
return this.token('STRING', '""');
|
||||||
|
}
|
||||||
|
if (tokens[0][0] !== 'NEOSTRING') {
|
||||||
|
tokens.unshift(['', '']);
|
||||||
|
}
|
||||||
|
if (interpolated = tokens.length > 1) {
|
||||||
|
this.token('(', '(');
|
||||||
|
}
|
||||||
for (i = _i = 0, _len = tokens.length; _i < _len; i = ++_i) {
|
for (i = _i = 0, _len = tokens.length; _i < _len; i = ++_i) {
|
||||||
_ref3 = tokens[i], tag = _ref3[0], value = _ref3[1];
|
_ref3 = tokens[i], tag = _ref3[0], value = _ref3[1];
|
||||||
if (i) this.token('+', '+');
|
if (i) {
|
||||||
|
this.token('+', '+');
|
||||||
|
}
|
||||||
if (tag === 'TOKENS') {
|
if (tag === 'TOKENS') {
|
||||||
(_ref4 = this.tokens).push.apply(_ref4, value);
|
(_ref4 = this.tokens).push.apply(_ref4, value);
|
||||||
} else {
|
} else {
|
||||||
this.token('STRING', this.makeString(value, '"', heredoc));
|
this.token('STRING', this.makeString(value, '"', heredoc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (interpolated) this.token(')', ')');
|
if (interpolated) {
|
||||||
|
this.token(')', ')');
|
||||||
|
}
|
||||||
return tokens;
|
return tokens;
|
||||||
};
|
};
|
||||||
|
|
||||||
Lexer.prototype.pair = function(tag) {
|
Lexer.prototype.pair = function(tag) {
|
||||||
var size, wanted;
|
var size, wanted;
|
||||||
if (tag !== (wanted = last(this.ends))) {
|
if (tag !== (wanted = last(this.ends))) {
|
||||||
if ('OUTDENT' !== wanted) this.error("unmatched " + tag);
|
if ('OUTDENT' !== wanted) {
|
||||||
|
this.error("unmatched " + tag);
|
||||||
|
}
|
||||||
this.indent -= size = last(this.indents);
|
this.indent -= size = last(this.indents);
|
||||||
this.outdentToken(size, true);
|
this.outdentToken(size, true);
|
||||||
return this.pair(tag);
|
return this.pair(tag);
|
||||||
|
@ -590,7 +668,9 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
Lexer.prototype.makeString = function(body, quote, heredoc) {
|
Lexer.prototype.makeString = function(body, quote, heredoc) {
|
||||||
if (!body) return quote + quote;
|
if (!body) {
|
||||||
|
return quote + quote;
|
||||||
|
}
|
||||||
body = body.replace(/\\([\s\S])/g, function(match, contents) {
|
body = body.replace(/\\([\s\S])/g, function(match, contents) {
|
||||||
if (contents === '\n' || contents === quote) {
|
if (contents === '\n' || contents === quote) {
|
||||||
return contents;
|
return contents;
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments;
|
var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments;
|
||||||
|
|
||||||
|
@ -52,7 +52,9 @@
|
||||||
throw new Error("unrecognized option: " + arg);
|
throw new Error("unrecognized option: " + arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (seenNonOptionArg || !isOption) options["arguments"].push(arg);
|
if (seenNonOptionArg || !isOption) {
|
||||||
|
options["arguments"].push(arg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
};
|
};
|
||||||
|
@ -60,7 +62,9 @@
|
||||||
OptionParser.prototype.help = function() {
|
OptionParser.prototype.help = function() {
|
||||||
var letPart, lines, rule, spaces, _i, _len, _ref;
|
var letPart, lines, rule, spaces, _i, _len, _ref;
|
||||||
lines = [];
|
lines = [];
|
||||||
if (this.banner) lines.unshift("" + this.banner + "\n");
|
if (this.banner) {
|
||||||
|
lines.unshift("" + this.banner + "\n");
|
||||||
|
}
|
||||||
_ref = this.rules;
|
_ref = this.rules;
|
||||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
rule = _ref[_i];
|
rule = _ref[_i];
|
||||||
|
@ -89,7 +93,9 @@
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = rules.length; _i < _len; _i++) {
|
for (_i = 0, _len = rules.length; _i < _len; _i++) {
|
||||||
tuple = rules[_i];
|
tuple = rules[_i];
|
||||||
if (tuple.length < 3) tuple.unshift(null);
|
if (tuple.length < 3) {
|
||||||
|
tuple.unshift(null);
|
||||||
|
}
|
||||||
_results.push(buildRule.apply(null, tuple));
|
_results.push(buildRule.apply(null, tuple));
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
|
@ -97,7 +103,9 @@
|
||||||
|
|
||||||
buildRule = function(shortFlag, longFlag, description, options) {
|
buildRule = function(shortFlag, longFlag, description, options) {
|
||||||
var match;
|
var match;
|
||||||
if (options == null) options = {};
|
if (options == null) {
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
match = longFlag.match(OPTIONAL);
|
match = longFlag.match(OPTIONAL);
|
||||||
longFlag = longFlag.match(LONG_FLAG)[1];
|
longFlag = longFlag.match(LONG_FLAG)[1];
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var ACCESSOR, CoffeeScript, Module, REPL_PROMPT, REPL_PROMPT_CONTINUATION, REPL_PROMPT_MULTILINE, SIMPLEVAR, Script, autocomplete, backlog, completeAttribute, completeVariable, enableColours, error, getCompletions, inspect, multilineMode, pipedInput, readline, repl, run, stdin, stdout;
|
var ACCESSOR, CoffeeScript, Module, REPL_PROMPT, REPL_PROMPT_CONTINUATION, REPL_PROMPT_MULTILINE, SIMPLEVAR, Script, autocomplete, backlog, completeAttribute, completeVariable, enableColours, error, getCompletions, inspect, multilineMode, pipedInput, readline, repl, run, stdin, stdout;
|
||||||
|
|
||||||
|
@ -57,7 +57,9 @@
|
||||||
completeVariable = function(text) {
|
completeVariable = function(text) {
|
||||||
var completions, free, keywords, possibilities, r, vars, _ref;
|
var completions, free, keywords, possibilities, r, vars, _ref;
|
||||||
free = (_ref = text.match(SIMPLEVAR)) != null ? _ref[1] : void 0;
|
free = (_ref = text.match(SIMPLEVAR)) != null ? _ref[1] : void 0;
|
||||||
if (text === "") free = "";
|
if (text === "") {
|
||||||
|
free = "";
|
||||||
|
}
|
||||||
if (free != null) {
|
if (free != null) {
|
||||||
vars = Script.runInThisContext('Object.getOwnPropertyNames(Object(this))');
|
vars = Script.runInThisContext('Object.getOwnPropertyNames(Object(this))');
|
||||||
keywords = (function() {
|
keywords = (function() {
|
||||||
|
@ -66,7 +68,9 @@
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||||
r = _ref1[_i];
|
r = _ref1[_i];
|
||||||
if (r.slice(0, 2) !== '__') _results.push(r);
|
if (r.slice(0, 2) !== '__') {
|
||||||
|
_results.push(r);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
})();
|
})();
|
||||||
|
@ -81,7 +85,9 @@
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = candidates.length; _i < _len; _i++) {
|
for (_i = 0, _len = candidates.length; _i < _len; _i++) {
|
||||||
el = candidates[_i];
|
el = candidates[_i];
|
||||||
if (el.indexOf(prefix) === 0) _results.push(el);
|
if (el.indexOf(prefix) === 0) {
|
||||||
|
_results.push(el);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
};
|
};
|
||||||
|
@ -118,7 +124,9 @@
|
||||||
filename: 'repl',
|
filename: 'repl',
|
||||||
modulename: 'repl'
|
modulename: 'repl'
|
||||||
});
|
});
|
||||||
if (returnValue === void 0) global._ = _;
|
if (returnValue === void 0) {
|
||||||
|
global._ = _;
|
||||||
|
}
|
||||||
repl.output.write("" + (inspect(returnValue, false, 2, enableColours)) + "\n");
|
repl.output.write("" + (inspect(returnValue, false, 2, enableColours)) + "\n");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error(err);
|
error(err);
|
||||||
|
@ -168,11 +176,16 @@
|
||||||
|
|
||||||
repl.input.on('keypress', function(char, key) {
|
repl.input.on('keypress', function(char, key) {
|
||||||
var cursorPos, newPrompt;
|
var cursorPos, newPrompt;
|
||||||
if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) return;
|
if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
cursorPos = repl.cursor;
|
cursorPos = repl.cursor;
|
||||||
repl.output.cursorTo(0);
|
repl.output.cursorTo(0);
|
||||||
repl.output.clearLine(1);
|
repl.output.clearLine(1);
|
||||||
multilineMode = !multilineMode;
|
multilineMode = !multilineMode;
|
||||||
|
if (!multilineMode && backlog) {
|
||||||
|
repl._line();
|
||||||
|
}
|
||||||
backlog = '';
|
backlog = '';
|
||||||
repl.setPrompt((newPrompt = multilineMode ? REPL_PROMPT_MULTILINE : REPL_PROMPT));
|
repl.setPrompt((newPrompt = multilineMode ? REPL_PROMPT_MULTILINE : REPL_PROMPT));
|
||||||
repl.prompt();
|
repl.prompt();
|
||||||
|
@ -180,8 +193,12 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
repl.input.on('keypress', function(char, key) {
|
repl.input.on('keypress', function(char, key) {
|
||||||
if (!(multilineMode && repl.line)) return;
|
if (!(multilineMode && repl.line)) {
|
||||||
if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'd')) return;
|
return;
|
||||||
|
}
|
||||||
|
if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'd')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
multilineMode = false;
|
multilineMode = false;
|
||||||
return repl._line();
|
return repl._line();
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, left, rite, _i, _len, _ref,
|
var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, left, rite, _i, _len, _ref,
|
||||||
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
|
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
|
||||||
|
@ -41,7 +41,9 @@
|
||||||
if (levels === 0 && condition.call(this, token, i)) {
|
if (levels === 0 && condition.call(this, token, i)) {
|
||||||
return action.call(this, token, i);
|
return action.call(this, token, i);
|
||||||
}
|
}
|
||||||
if (!token || levels < 0) return action.call(this, token, i - 1);
|
if (!token || levels < 0) {
|
||||||
|
return action.call(this, token, i - 1);
|
||||||
|
}
|
||||||
if (_ref = token[0], __indexOf.call(EXPRESSION_START, _ref) >= 0) {
|
if (_ref = token[0], __indexOf.call(EXPRESSION_START, _ref) >= 0) {
|
||||||
levels += 1;
|
levels += 1;
|
||||||
} else if (_ref1 = token[0], __indexOf.call(EXPRESSION_END, _ref1) >= 0) {
|
} else if (_ref1 = token[0], __indexOf.call(EXPRESSION_END, _ref1) >= 0) {
|
||||||
|
@ -57,9 +59,13 @@
|
||||||
_ref = this.tokens;
|
_ref = this.tokens;
|
||||||
for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
|
for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
|
||||||
tag = _ref[i][0];
|
tag = _ref[i][0];
|
||||||
if (tag !== 'TERMINATOR') break;
|
if (tag !== 'TERMINATOR') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i) {
|
||||||
|
return this.tokens.splice(0, i);
|
||||||
}
|
}
|
||||||
if (i) return this.tokens.splice(0, i);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Rewriter.prototype.removeMidExpressionNewlines = function() {
|
Rewriter.prototype.removeMidExpressionNewlines = function() {
|
||||||
|
@ -83,7 +89,9 @@
|
||||||
return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END';
|
return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END';
|
||||||
};
|
};
|
||||||
return this.scanTokens(function(token, i) {
|
return this.scanTokens(function(token, i) {
|
||||||
if (token[0] === 'CALL_START') this.detectEnd(i + 1, condition, action);
|
if (token[0] === 'CALL_START') {
|
||||||
|
this.detectEnd(i + 1, condition, action);
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -98,7 +106,9 @@
|
||||||
return token[0] = 'INDEX_END';
|
return token[0] = 'INDEX_END';
|
||||||
};
|
};
|
||||||
return this.scanTokens(function(token, i) {
|
return this.scanTokens(function(token, i) {
|
||||||
if (token[0] === 'INDEX_START') this.detectEnd(i + 1, condition, action);
|
if (token[0] === 'INDEX_START') {
|
||||||
|
this.detectEnd(i + 1, condition, action);
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -113,9 +123,13 @@
|
||||||
condition = function(token, i) {
|
condition = function(token, i) {
|
||||||
var one, tag, three, two, _ref, _ref1;
|
var one, tag, three, two, _ref, _ref1;
|
||||||
_ref = this.tokens.slice(i + 1, (i + 3) + 1 || 9e9), one = _ref[0], two = _ref[1], three = _ref[2];
|
_ref = this.tokens.slice(i + 1, (i + 3) + 1 || 9e9), one = _ref[0], two = _ref[1], three = _ref[2];
|
||||||
if ('HERECOMMENT' === (one != null ? one[0] : void 0)) return false;
|
if ('HERECOMMENT' === (one != null ? one[0] : void 0)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
tag = token[0];
|
tag = token[0];
|
||||||
if (__indexOf.call(LINEBREAKS, tag) >= 0) sameLine = false;
|
if (__indexOf.call(LINEBREAKS, tag) >= 0) {
|
||||||
|
sameLine = false;
|
||||||
|
}
|
||||||
return (((tag === 'TERMINATOR' || tag === 'OUTDENT') || (__indexOf.call(IMPLICIT_END, tag) >= 0 && sameLine)) && ((!startsLine && this.tag(i - 1) !== ',') || !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':'))) || (tag === ',' && one && ((_ref1 = one[0]) !== 'IDENTIFIER' && _ref1 !== 'NUMBER' && _ref1 !== 'STRING' && _ref1 !== '@' && _ref1 !== 'TERMINATOR' && _ref1 !== 'OUTDENT'));
|
return (((tag === 'TERMINATOR' || tag === 'OUTDENT') || (__indexOf.call(IMPLICIT_END, tag) >= 0 && sameLine)) && ((!startsLine && this.tag(i - 1) !== ',') || !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':'))) || (tag === ',' && one && ((_ref1 = one[0]) !== 'IDENTIFIER' && _ref1 !== 'NUMBER' && _ref1 !== 'STRING' && _ref1 !== '@' && _ref1 !== 'TERMINATOR' && _ref1 !== 'OUTDENT'));
|
||||||
};
|
};
|
||||||
action = function(token, i) {
|
action = function(token, i) {
|
||||||
|
@ -159,7 +173,9 @@
|
||||||
condition = function(token, i) {
|
condition = function(token, i) {
|
||||||
var post, tag, _ref, _ref1;
|
var post, tag, _ref, _ref1;
|
||||||
tag = token[0];
|
tag = token[0];
|
||||||
if (!seenSingle && token.fromThen) return true;
|
if (!seenSingle && token.fromThen) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (tag === 'IF' || tag === 'ELSE' || tag === 'CATCH' || tag === '->' || tag === '=>' || tag === 'CLASS') {
|
if (tag === 'IF' || tag === 'ELSE' || tag === 'CATCH' || tag === '->' || tag === '=>' || tag === 'CLASS') {
|
||||||
seenSingle = true;
|
seenSingle = true;
|
||||||
}
|
}
|
||||||
|
@ -184,15 +200,23 @@
|
||||||
callObject = !noCall && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && (_ref1 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref1) >= 0);
|
callObject = !noCall && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && (_ref1 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref1) >= 0);
|
||||||
seenSingle = false;
|
seenSingle = false;
|
||||||
seenControl = false;
|
seenControl = false;
|
||||||
if (__indexOf.call(LINEBREAKS, tag) >= 0) noCall = false;
|
if (__indexOf.call(LINEBREAKS, tag) >= 0) {
|
||||||
if (prev && !prev.spaced && tag === '?') token.call = true;
|
noCall = false;
|
||||||
if (token.fromThen) return 1;
|
}
|
||||||
|
if (prev && !prev.spaced && tag === '?') {
|
||||||
|
token.call = true;
|
||||||
|
}
|
||||||
|
if (token.fromThen) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
if (!(callObject || (prev != null ? prev.spaced : void 0) && (prev.call || (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) {
|
if (!(callObject || (prev != null ? prev.spaced : void 0) && (prev.call || (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
tokens.splice(i, 0, this.generate('CALL_START', '(', token[2]));
|
tokens.splice(i, 0, this.generate('CALL_START', '(', token[2]));
|
||||||
this.detectEnd(i + 1, condition, action);
|
this.detectEnd(i + 1, condition, action);
|
||||||
if (prev[0] === '?') prev[0] = 'FUNC_EXIST';
|
if (prev[0] === '?') {
|
||||||
|
prev[0] = 'FUNC_EXIST';
|
||||||
|
}
|
||||||
return 2;
|
return 2;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -225,10 +249,14 @@
|
||||||
if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) {
|
if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) {
|
||||||
starter = tag;
|
starter = tag;
|
||||||
_ref1 = this.indentation(token, true), indent = _ref1[0], outdent = _ref1[1];
|
_ref1 = this.indentation(token, true), indent = _ref1[0], outdent = _ref1[1];
|
||||||
if (starter === 'THEN') indent.fromThen = true;
|
if (starter === 'THEN') {
|
||||||
|
indent.fromThen = true;
|
||||||
|
}
|
||||||
tokens.splice(i + 1, 0, indent);
|
tokens.splice(i + 1, 0, indent);
|
||||||
this.detectEnd(i + 2, condition, action);
|
this.detectEnd(i + 2, condition, action);
|
||||||
if (tag === 'THEN') tokens.splice(i, 1);
|
if (tag === 'THEN') {
|
||||||
|
tokens.splice(i, 1);
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -248,7 +276,9 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return this.scanTokens(function(token, i) {
|
return this.scanTokens(function(token, i) {
|
||||||
if (token[0] !== 'IF') return 1;
|
if (token[0] !== 'IF') {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
original = token;
|
original = token;
|
||||||
this.detectEnd(i + 1, condition, action);
|
this.detectEnd(i + 1, condition, action);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -257,10 +287,14 @@
|
||||||
|
|
||||||
Rewriter.prototype.indentation = function(token, implicit) {
|
Rewriter.prototype.indentation = function(token, implicit) {
|
||||||
var indent, outdent;
|
var indent, outdent;
|
||||||
if (implicit == null) implicit = false;
|
if (implicit == null) {
|
||||||
|
implicit = false;
|
||||||
|
}
|
||||||
indent = ['INDENT', 2, token[2]];
|
indent = ['INDENT', 2, token[2]];
|
||||||
outdent = ['OUTDENT', 2, token[2]];
|
outdent = ['OUTDENT', 2, token[2]];
|
||||||
if (implicit) indent.generated = outdent.generated = true;
|
if (implicit) {
|
||||||
|
indent.generated = outdent.generated = true;
|
||||||
|
}
|
||||||
return [indent, outdent];
|
return [indent, outdent];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Generated by CoffeeScript 1.2.1-pre
|
// Generated by CoffeeScript 1.3.0
|
||||||
(function() {
|
(function() {
|
||||||
var Scope, extend, last, _ref;
|
var Scope, extend, last, _ref;
|
||||||
|
|
||||||
|
@ -21,11 +21,15 @@
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
this.positions = {};
|
this.positions = {};
|
||||||
if (!this.parent) Scope.root = this;
|
if (!this.parent) {
|
||||||
|
Scope.root = this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Scope.prototype.add = function(name, type, immediate) {
|
Scope.prototype.add = function(name, type, immediate) {
|
||||||
if (this.shared && !immediate) return this.parent.add(name, type, immediate);
|
if (this.shared && !immediate) {
|
||||||
|
return this.parent.add(name, type, immediate);
|
||||||
|
}
|
||||||
if (Object.prototype.hasOwnProperty.call(this.positions, name)) {
|
if (Object.prototype.hasOwnProperty.call(this.positions, name)) {
|
||||||
return this.variables[this.positions[name]].type = type;
|
return this.variables[this.positions[name]].type = type;
|
||||||
} else {
|
} else {
|
||||||
|
@ -37,20 +41,26 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
Scope.prototype.find = function(name, options) {
|
Scope.prototype.find = function(name, options) {
|
||||||
if (this.check(name, options)) return true;
|
if (this.check(name, options)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
this.add(name, 'var');
|
this.add(name, 'var');
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
Scope.prototype.parameter = function(name) {
|
Scope.prototype.parameter = function(name) {
|
||||||
if (this.shared && this.parent.check(name, true)) return;
|
if (this.shared && this.parent.check(name, true)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
return this.add(name, 'param');
|
return this.add(name, 'param');
|
||||||
};
|
};
|
||||||
|
|
||||||
Scope.prototype.check = function(name, immediate) {
|
Scope.prototype.check = function(name, immediate) {
|
||||||
var found, _ref1;
|
var found, _ref1;
|
||||||
found = !!this.type(name);
|
found = !!this.type(name);
|
||||||
if (found || immediate) return found;
|
if (found || immediate) {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
return !!((_ref1 = this.parent) != null ? _ref1.check(name) : void 0);
|
return !!((_ref1 = this.parent) != null ? _ref1.check(name) : void 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -67,19 +77,25 @@
|
||||||
_ref1 = this.variables;
|
_ref1 = this.variables;
|
||||||
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||||
v = _ref1[_i];
|
v = _ref1[_i];
|
||||||
if (v.name === name) return v.type;
|
if (v.name === name) {
|
||||||
|
return v.type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
Scope.prototype.freeVariable = function(name, reserve) {
|
Scope.prototype.freeVariable = function(name, reserve) {
|
||||||
var index, temp;
|
var index, temp;
|
||||||
if (reserve == null) reserve = true;
|
if (reserve == null) {
|
||||||
|
reserve = true;
|
||||||
|
}
|
||||||
index = 0;
|
index = 0;
|
||||||
while (this.check((temp = this.temporary(name, index)))) {
|
while (this.check((temp = this.temporary(name, index)))) {
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
if (reserve) this.add(temp, 'var', true);
|
if (reserve) {
|
||||||
|
this.add(temp, 'var', true);
|
||||||
|
}
|
||||||
return temp;
|
return temp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -115,7 +131,9 @@
|
||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||||
v = _ref1[_i];
|
v = _ref1[_i];
|
||||||
if (v.type.assigned) _results.push("" + v.name + " = " + v.type.value);
|
if (v.type.assigned) {
|
||||||
|
_results.push("" + v.name + " = " + v.type.value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return _results;
|
return _results;
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
"description": "Unfancy JavaScript",
|
"description": "Unfancy JavaScript",
|
||||||
"keywords": ["javascript", "language", "coffeescript", "compiler"],
|
"keywords": ["javascript", "language", "coffeescript", "compiler"],
|
||||||
"author": "Jeremy Ashkenas",
|
"author": "Jeremy Ashkenas",
|
||||||
"version": "1.2.1-pre",
|
"version": "1.3.0",
|
||||||
"licenses": [{
|
"licenses": [{
|
||||||
"type": "MIT",
|
"type": "MIT",
|
||||||
"url": "http://github.com/jashkenas/coffee-script/raw/master/LICENSE"
|
"url": "http://github.com/jashkenas/coffee-script/raw/master/LICENSE"
|
||||||
|
|
|
@ -21,7 +21,7 @@ else if require.registerExtension
|
||||||
require.registerExtension '.coffee', (content) -> compile content
|
require.registerExtension '.coffee', (content) -> compile content
|
||||||
|
|
||||||
# The current CoffeeScript version number.
|
# The current CoffeeScript version number.
|
||||||
exports.VERSION = '1.2.1-pre'
|
exports.VERSION = '1.3.0'
|
||||||
|
|
||||||
# Words that cannot be used as identifiers in CoffeeScript code
|
# Words that cannot be used as identifiers in CoffeeScript code
|
||||||
exports.RESERVED = RESERVED
|
exports.RESERVED = RESERVED
|
||||||
|
|
|
@ -1871,17 +1871,7 @@ exports.If = class If extends Base
|
||||||
cond = @condition.compile o, LEVEL_PAREN
|
cond = @condition.compile o, LEVEL_PAREN
|
||||||
o.indent += TAB
|
o.indent += TAB
|
||||||
body = @ensureBlock(@body)
|
body = @ensureBlock(@body)
|
||||||
bodyc = body.compile o
|
ifPart = "if (#{cond}) {\n#{body.compile(o)}\n#{@tab}}"
|
||||||
if (
|
|
||||||
1 is body.expressions?.length and
|
|
||||||
!@elseBody and !child and
|
|
||||||
bodyc and cond and
|
|
||||||
-1 is (bodyc.indexOf '\n') and
|
|
||||||
80 > cond.length + bodyc.length
|
|
||||||
)
|
|
||||||
return "#{@tab}if (#{cond}) #{bodyc.replace /^\s+/, ''}"
|
|
||||||
bodyc = "\n#{bodyc}\n#{@tab}" if bodyc
|
|
||||||
ifPart = "if (#{cond}) {#{bodyc}}"
|
|
||||||
ifPart = @tab + ifPart unless child
|
ifPart = @tab + ifPart unless child
|
||||||
return ifPart unless @elseBody
|
return ifPart unless @elseBody
|
||||||
ifPart + ' else ' + if @isChain
|
ifPart + ' else ' + if @isChain
|
||||||
|
|
|
@ -140,6 +140,7 @@ repl.input.on 'keypress', (char, key) ->
|
||||||
repl.output.cursorTo 0
|
repl.output.cursorTo 0
|
||||||
repl.output.clearLine 1
|
repl.output.clearLine 1
|
||||||
multilineMode = not multilineMode
|
multilineMode = not multilineMode
|
||||||
|
repl._line() if not multilineMode and backlog
|
||||||
backlog = ''
|
backlog = ''
|
||||||
repl.setPrompt (newPrompt = if multilineMode then REPL_PROMPT_MULTILINE else REPL_PROMPT)
|
repl.setPrompt (newPrompt = if multilineMode then REPL_PROMPT_MULTILINE else REPL_PROMPT)
|
||||||
repl.prompt()
|
repl.prompt()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue