mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-01-14 17:27:59 -05:00
602 lines
31 KiB
HTML
602 lines
31 KiB
HTML
<!DOCTYPE html>
|
|
|
|
<html>
|
|
<head>
|
|
<title>helpers.coffee</title>
|
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
|
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
|
|
<link rel="stylesheet" media="all" href="docco.css" />
|
|
</head>
|
|
<body>
|
|
<div id="container">
|
|
<div id="background"></div>
|
|
|
|
<ul id="jump_to">
|
|
<li>
|
|
<a class="large" href="javascript:void(0);">Jump To …</a>
|
|
<a class="small" href="javascript:void(0);">+</a>
|
|
<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.litcoffee
|
|
</a>
|
|
|
|
|
|
<a class="source" href="sourcemap.html">
|
|
sourcemap.coffee
|
|
</a>
|
|
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
|
|
<ul class="sections">
|
|
<li id="title">
|
|
<div class="annotation">
|
|
<h1>helpers.coffee</h1>
|
|
</div>
|
|
</li>
|
|
|
|
|
|
<li id="section-1">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-1">¶</a>
|
|
</div>
|
|
<p>This file contains the common helper functions that we'd like to share among
|
|
the <strong>Lexer</strong>, <strong>Rewriter</strong>, and the <strong>Nodes</strong>. Merge objects, flatten
|
|
arrays, count characters, that sort of thing.
|
|
|
|
</p>
|
|
<p>Peek at the beginning of a given string to see if it matches a sequence.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.starts = </span><span class="nf">(string, literal, start) -></span>
|
|
<span class="nx">literal</span> <span class="o">is</span> <span class="nx">string</span><span class="p">.</span><span class="nx">substr</span> <span class="nx">start</span><span class="p">,</span> <span class="nx">literal</span><span class="p">.</span><span class="nx">length</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-2">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-2">¶</a>
|
|
</div>
|
|
|
|
<p>Peek at the end of a given string to see if it matches a sequence.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.ends = </span><span class="nf">(string, literal, back) -></span>
|
|
<span class="nv">len = </span><span class="nx">literal</span><span class="p">.</span><span class="nx">length</span>
|
|
<span class="nx">literal</span> <span class="o">is</span> <span class="nx">string</span><span class="p">.</span><span class="nx">substr</span> <span class="nx">string</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="nx">len</span> <span class="o">-</span> <span class="p">(</span><span class="nx">back</span> <span class="o">or</span> <span class="mi">0</span><span class="p">),</span> <span class="nx">len</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-3">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-3">¶</a>
|
|
</div>
|
|
|
|
<p>Repeat a string <code>n</code> times.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.repeat = repeat = </span><span class="nf">(str, n) -></span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-4">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-4">¶</a>
|
|
</div>
|
|
|
|
<p>Use clever algorithm to have O(log(n)) string concatenation operations.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre> <span class="nv">res = </span><span class="s">''</span>
|
|
<span class="k">while</span> <span class="nx">n</span> <span class="o">></span> <span class="mi">0</span>
|
|
<span class="nx">res</span> <span class="o">+=</span> <span class="nx">str</span> <span class="k">if</span> <span class="nx">n</span> <span class="o">&</span> <span class="mi">1</span>
|
|
<span class="nx">n</span> <span class="o">>>>=</span> <span class="mi">1</span>
|
|
<span class="nx">str</span> <span class="o">+=</span> <span class="nx">str</span>
|
|
<span class="nx">res</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-5">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-5">¶</a>
|
|
</div>
|
|
|
|
<p>Trim out all falsy values from an array.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.compact = </span><span class="nf">(array) -></span>
|
|
<span class="nx">item</span> <span class="k">for</span> <span class="nx">item</span> <span class="k">in</span> <span class="nx">array</span> <span class="k">when</span> <span class="nx">item</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-6">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-6">¶</a>
|
|
</div>
|
|
|
|
<p>Count the number of occurrences of a string in a string.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.count = </span><span class="nf">(string, substr) -></span>
|
|
<span class="nv">num = pos = </span><span class="mi">0</span>
|
|
<span class="k">return</span> <span class="mi">1</span><span class="o">/</span><span class="mi">0</span> <span class="k">unless</span> <span class="nx">substr</span><span class="p">.</span><span class="nx">length</span>
|
|
<span class="nx">num</span><span class="o">++</span> <span class="k">while</span> <span class="nv">pos = </span><span class="mi">1</span> <span class="o">+</span> <span class="nx">string</span><span class="p">.</span><span class="nx">indexOf</span> <span class="nx">substr</span><span class="p">,</span> <span class="nx">pos</span>
|
|
<span class="nx">num</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-7">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-7">¶</a>
|
|
</div>
|
|
|
|
<p>Merge objects, returning a fresh copy with attributes from both sides.
|
|
Used every time <code>Base#compile</code> is called, to allow properties in the
|
|
options hash to propagate down the tree without polluting other branches.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.merge = </span><span class="nf">(options, overrides) -></span>
|
|
<span class="nx">extend</span> <span class="p">(</span><span class="nx">extend</span> <span class="p">{},</span> <span class="nx">options</span><span class="p">),</span> <span class="nx">overrides</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-8">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-8">¶</a>
|
|
</div>
|
|
|
|
<p>Extend a source object with the properties of another object (shallow copy).
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">extend = exports.extend = </span><span class="nf">(object, properties) -></span>
|
|
<span class="k">for</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">properties</span>
|
|
<span class="nx">object</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">val</span>
|
|
<span class="nx">object</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-9">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-9">¶</a>
|
|
</div>
|
|
|
|
<p>Return a flattened version of an array.
|
|
Handy for getting a list of <code>children</code> from the nodes.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.flatten = flatten = </span><span class="nf">(array) -></span>
|
|
<span class="nv">flattened = </span><span class="p">[]</span>
|
|
<span class="k">for</span> <span class="nx">element</span> <span class="k">in</span> <span class="nx">array</span>
|
|
<span class="k">if</span> <span class="nx">element</span> <span class="k">instanceof</span> <span class="nb">Array</span>
|
|
<span class="nv">flattened = </span><span class="nx">flattened</span><span class="p">.</span><span class="nx">concat</span> <span class="nx">flatten</span> <span class="nx">element</span>
|
|
<span class="k">else</span>
|
|
<span class="nx">flattened</span><span class="p">.</span><span class="nx">push</span> <span class="nx">element</span>
|
|
<span class="nx">flattened</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-10">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-10">¶</a>
|
|
</div>
|
|
|
|
<p>Delete a key from an object, returning the value. Useful when a node is
|
|
looking for a particular method in an options hash.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.del = </span><span class="nf">(obj, key) -></span>
|
|
<span class="nv">val = </span> <span class="nx">obj</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span>
|
|
<span class="k">delete</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span>
|
|
<span class="nx">val</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-11">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-11">¶</a>
|
|
</div>
|
|
|
|
<p>Gets the last item of an array(-like) object.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.last = last = </span><span class="nf">(array, back) -></span> <span class="nx">array</span><span class="p">[</span><span class="nx">array</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="p">(</span><span class="nx">back</span> <span class="o">or</span> <span class="mi">0</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-12">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-12">¶</a>
|
|
</div>
|
|
|
|
<p>Typical Array::some
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.some = </span><span class="nb">Array</span><span class="o">::</span><span class="nx">some</span> <span class="o">?</span> <span class="nf">(fn) -></span>
|
|
<span class="k">return</span> <span class="kc">true</span> <span class="k">for</span> <span class="nx">e</span> <span class="k">in</span> <span class="k">this</span> <span class="k">when</span> <span class="nx">fn</span> <span class="nx">e</span>
|
|
<span class="kc">false</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-13">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-13">¶</a>
|
|
</div>
|
|
|
|
<p>Simple function for inverting Literate CoffeeScript code by putting the
|
|
documentation in comments, and bumping the actual code back out to the edge ...
|
|
producing a string of CoffeeScript code that can be compiled "normally".
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.invertLiterate = </span><span class="nf">(code) -></span>
|
|
<span class="nv">lines = </span><span class="k">for</span> <span class="nx">line</span> <span class="k">in</span> <span class="nx">code</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s">'\n'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nv">match = </span><span class="p">(</span><span class="sr">/^([ ]{4}|\t)/</span><span class="p">).</span><span class="nx">exec</span> <span class="nx">line</span>
|
|
<span class="nx">line</span><span class="p">[</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="p">..]</span>
|
|
<span class="k">else</span>
|
|
<span class="s">'# '</span> <span class="o">+</span> <span class="nx">line</span>
|
|
<span class="nx">lines</span><span class="p">.</span><span class="nx">join</span> <span class="s">'\n'</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-14">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-14">¶</a>
|
|
</div>
|
|
|
|
<p>Merge two jison-style location data objects together.
|
|
If <code>last</code> is not provided, this will simply return <code>first</code>.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">buildLocationData = </span><span class="nf">(first, last) -></span>
|
|
<span class="k">if</span> <span class="o">not</span> <span class="nx">last</span>
|
|
<span class="nx">first</span>
|
|
<span class="k">else</span>
|
|
<span class="nv">first_line: </span><span class="nx">first</span><span class="p">.</span><span class="nx">first_line</span>
|
|
<span class="nv">first_column: </span><span class="nx">first</span><span class="p">.</span><span class="nx">first_column</span>
|
|
<span class="nv">last_line: </span><span class="nx">last</span><span class="p">.</span><span class="nx">last_line</span>
|
|
<span class="nv">last_column: </span><span class="nx">last</span><span class="p">.</span><span class="nx">last_column</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-15">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-15">¶</a>
|
|
</div>
|
|
|
|
<p>This returns a function which takes an object as a parameter, and if that
|
|
object is an AST node, updates that object's locationData.
|
|
The object is returned either way.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.addLocationDataFn = </span><span class="nf">(first, last) -></span>
|
|
<span class="nf">(obj) -></span>
|
|
<span class="k">if</span> <span class="p">((</span><span class="k">typeof</span> <span class="nx">obj</span><span class="p">)</span> <span class="o">is</span> <span class="s">'object'</span><span class="p">)</span> <span class="o">and</span> <span class="p">(</span><span class="o">!!</span><span class="nx">obj</span><span class="p">[</span><span class="s">'updateLocationDataIfMissing'</span><span class="p">])</span>
|
|
<span class="nx">obj</span><span class="p">.</span><span class="nx">updateLocationDataIfMissing</span> <span class="nx">buildLocationData</span><span class="p">(</span><span class="nx">first</span><span class="p">,</span> <span class="nx">last</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="nx">obj</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-16">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-16">¶</a>
|
|
</div>
|
|
|
|
<p>Convert jison location data to a string.
|
|
<code>obj</code> can be a token, or a locationData.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.locationDataToString = </span><span class="nf">(obj) -></span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="s">"2"</span> <span class="k">of</span> <span class="nx">obj</span><span class="p">)</span> <span class="o">and</span> <span class="p">(</span><span class="s">"first_line"</span> <span class="k">of</span> <span class="nx">obj</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="k">then</span> <span class="nv">locationData = </span><span class="nx">obj</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
|
|
<span class="k">else</span> <span class="k">if</span> <span class="s">"first_line"</span> <span class="k">of</span> <span class="nx">obj</span> <span class="k">then</span> <span class="nv">locationData = </span><span class="nx">obj</span>
|
|
|
|
<span class="k">if</span> <span class="nx">locationData</span>
|
|
<span class="s">"</span><span class="si">#{</span><span class="nx">locationData</span><span class="p">.</span><span class="nx">first_line</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s">:</span><span class="si">#{</span><span class="nx">locationData</span><span class="p">.</span><span class="nx">first_column</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s">-"</span> <span class="o">+</span>
|
|
<span class="s">"</span><span class="si">#{</span><span class="nx">locationData</span><span class="p">.</span><span class="nx">last_line</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s">:</span><span class="si">#{</span><span class="nx">locationData</span><span class="p">.</span><span class="nx">last_column</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s">"</span>
|
|
<span class="k">else</span>
|
|
<span class="s">"No location data"</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-17">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-17">¶</a>
|
|
</div>
|
|
|
|
<p>A <code>.coffee.md</code> compatible version of <code>basename</code>, that returns the file sans-extension.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.baseFileName = </span><span class="nf">(file, stripExt = no) -></span>
|
|
<span class="nv">parts = </span><span class="nx">file</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span>
|
|
<span class="nv">file = </span><span class="nx">parts</span><span class="p">[</span><span class="nx">parts</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">return</span> <span class="nx">file</span> <span class="k">unless</span> <span class="nx">stripExt</span>
|
|
<span class="nv">parts = </span><span class="nx">file</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s">'.'</span><span class="p">)</span>
|
|
<span class="nx">parts</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span>
|
|
<span class="nx">parts</span><span class="p">.</span><span class="nx">pop</span><span class="p">()</span> <span class="k">if</span> <span class="nx">parts</span><span class="p">[</span><span class="nx">parts</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="o">is</span> <span class="s">'coffee'</span> <span class="o">and</span> <span class="nx">parts</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">1</span>
|
|
<span class="nx">parts</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s">'.'</span><span class="p">)</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-18">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-18">¶</a>
|
|
</div>
|
|
|
|
<p>Determine if a filename represents a CoffeeScript file.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.isCoffee = </span><span class="nf">(file) -></span> <span class="o">/</span><span class="err">\</span><span class="p">.((</span><span class="nx">lit</span><span class="p">)</span><span class="o">?</span><span class="nx">coffee</span><span class="o">|</span><span class="nx">coffee</span><span class="err">\</span><span class="p">.</span><span class="nx">md</span><span class="p">)</span><span class="nx">$</span><span class="o">/</span><span class="p">.</span><span class="nx">test</span> <span class="nx">file</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-19">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-19">¶</a>
|
|
</div>
|
|
|
|
<p>Determine if a filename represents a Literate CoffeeScript file.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.isLiterate = </span><span class="nf">(file) -></span> <span class="o">/</span><span class="err">\</span><span class="p">.(</span><span class="nx">litcoffee</span><span class="o">|</span><span class="nx">coffee</span><span class="err">\</span><span class="p">.</span><span class="nx">md</span><span class="p">)</span><span class="nx">$</span><span class="o">/</span><span class="p">.</span><span class="nx">test</span> <span class="nx">file</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-20">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-20">¶</a>
|
|
</div>
|
|
|
|
<p>Throws a SyntaxError with a source file location data attached to it in a
|
|
property called <code>location</code>.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.throwSyntaxError = </span><span class="nf">(message, location) -></span>
|
|
<span class="nx">location</span><span class="p">.</span><span class="nx">last_line</span> <span class="o">?=</span> <span class="nx">location</span><span class="p">.</span><span class="nx">first_line</span>
|
|
<span class="nx">location</span><span class="p">.</span><span class="nx">last_column</span> <span class="o">?=</span> <span class="nx">location</span><span class="p">.</span><span class="nx">first_column</span>
|
|
<span class="nv">error = </span><span class="k">new</span> <span class="nx">SyntaxError</span> <span class="nx">message</span>
|
|
<span class="nv">error.location = </span><span class="nx">location</span>
|
|
<span class="k">throw</span> <span class="nx">error</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-21">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-21">¶</a>
|
|
</div>
|
|
|
|
<p>Creates a nice error message like, following the "standard" format
|
|
</p>
|
|
<p><filename>:<line>:<col>: <message> plus the line with the error and a marker
|
|
showing where the error is.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre><span class="nv">exports.prettyErrorMessage = </span><span class="nf">(error, fileName, code, useColors) -></span>
|
|
<span class="k">return</span> <span class="nx">error</span><span class="p">.</span><span class="nx">stack</span> <span class="o">or</span> <span class="s">"</span><span class="si">#{</span><span class="nx">error</span><span class="si">}</span><span class="s">"</span> <span class="k">unless</span> <span class="nx">error</span><span class="p">.</span><span class="nx">location</span>
|
|
|
|
<span class="p">{</span><span class="nx">first_line</span><span class="p">,</span> <span class="nx">first_column</span><span class="p">,</span> <span class="nx">last_line</span><span class="p">,</span> <span class="nx">last_column</span><span class="p">}</span> <span class="o">=</span> <span class="nx">error</span><span class="p">.</span><span class="nx">location</span>
|
|
<span class="nv">codeLine = </span><span class="nx">code</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s">'\n'</span><span class="p">)[</span><span class="nx">first_line</span><span class="p">]</span>
|
|
<span class="nv">start = </span><span class="nx">first_column</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-22">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-22">¶</a>
|
|
</div>
|
|
|
|
<p>Show only the first line on multi-line errors.
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre> <span class="nv">end = </span><span class="k">if</span> <span class="nx">first_line</span> <span class="o">is</span> <span class="nx">last_line</span> <span class="k">then</span> <span class="nx">last_column</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">else</span> <span class="nx">codeLine</span><span class="p">.</span><span class="nx">length</span>
|
|
<span class="nv">marker = </span><span class="nx">repeat</span><span class="p">(</span><span class="s">' '</span><span class="p">,</span> <span class="nx">start</span><span class="p">)</span> <span class="o">+</span> <span class="nx">repeat</span><span class="p">(</span><span class="s">'^'</span><span class="p">,</span> <span class="nx">end</span> <span class="o">-</span> <span class="nx">start</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="nx">useColors</span>
|
|
<span class="nv">colorize = </span><span class="nf">(str) -></span> <span class="s">"\x1B[1;31m</span><span class="si">#{</span><span class="nx">str</span><span class="si">}</span><span class="s">\x1B[0m"</span>
|
|
<span class="nv">codeLine = </span><span class="nx">codeLine</span><span class="p">[...</span><span class="nx">start</span><span class="p">]</span> <span class="o">+</span> <span class="nx">colorize</span><span class="p">(</span><span class="nx">codeLine</span><span class="p">[</span><span class="nx">start</span><span class="p">...</span><span class="nx">end</span><span class="p">])</span> <span class="o">+</span> <span class="nx">codeLine</span><span class="p">[</span><span class="nx">end</span><span class="p">..]</span>
|
|
<span class="nv">marker = </span><span class="nx">colorize</span> <span class="nx">marker</span>
|
|
|
|
<span class="nv">message = </span><span class="s">"""</span>
|
|
<span class="s"> </span><span class="si">#{</span><span class="nx">fileName</span><span class="si">}</span><span class="s">:</span><span class="si">#{</span><span class="nx">first_line</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s">:</span><span class="si">#{</span><span class="nx">first_column</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s">: error: </span><span class="si">#{</span><span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="si">}</span><span class="s"></span>
|
|
<span class="s"> </span><span class="si">#{</span><span class="nx">codeLine</span><span class="si">}</span><span class="s"></span>
|
|
<span class="s"> </span><span class="si">#{</span><span class="nx">marker</span><span class="si">}</span><span class="s"></span>
|
|
<span class="s"> """</span></pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-23">
|
|
<div class="annotation">
|
|
<div class="pilwrap">
|
|
<a class="pilcrow" href="#section-23">¶</a>
|
|
</div>
|
|
|
|
<p>Uncomment to add stacktrace.
|
|
message += "\n#{error.stack}"
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class="highlight"><pre> <span class="nx">message</span>
|
|
|
|
</pre></div></div>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|