mirror of
https://github.com/sharkdp/bat.git
synced 2025-01-18 20:11:03 +00:00
Add CoffeeScript syntax test file
This commit is contained in:
parent
b1f69434f9
commit
c9627040cc
391
tests/syntax-tests/highlighted/CoffeeScript/coffeescript.coffee
Normal file
391
tests/syntax-tests/highlighted/CoffeeScript/coffeescript.coffee
Normal file
@ -0,0 +1,391 @@
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m CoffeeScript can be used both on the server, as a command-line compiler based[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m on Node.js/V8, or to run CoffeeScript directly in the browser. This module[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m contains the main entry functions for tokenizing, parsing, and compiling[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m source CoffeeScript into JavaScript.[0m
|
||||
|
||||
[38;2;249;38;114m{[0m[38;2;248;248;242mLexer[0m[38;2;249;38;114m} =[0m[38;2;248;248;242m [0m[38;2;102;217;239mrequire[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m./lexer[0m[38;2;230;219;116m'[0m
|
||||
[38;2;249;38;114m{[0m[38;2;248;248;242mparser[0m[38;2;249;38;114m} =[0m[38;2;248;248;242m [0m[38;2;102;217;239mrequire[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m./parser[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242mhelpers [0m[38;2;249;38;114m= [0m[38;2;102;217;239mrequire[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m./helpers[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242mSourceMap [0m[38;2;249;38;114m= [0m[38;2;102;217;239mrequire[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m./sourcemap[0m[38;2;230;219;116m'[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Require `package.json`, which is two levels above this file, as this file is[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m evaluated from `lib/coffeescript`.[0m
|
||||
[38;2;248;248;242mpackageJson [0m[38;2;249;38;114m= [0m[38;2;102;217;239mrequire[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m../../package.json[0m[38;2;230;219;116m'[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m The current CoffeeScript version number.[0m
|
||||
[38;2;248;248;242mexports.VERSION [0m[38;2;249;38;114m= [0m[38;2;248;248;242mpackageJson[0m[38;2;248;248;242m.[0m[38;2;248;248;242mversion[0m
|
||||
|
||||
[38;2;248;248;242mexports.FILE_EXTENSIONS [0m[38;2;249;38;114m= [0m[38;2;248;248;242mFILE_EXTENSIONS [0m[38;2;249;38;114m= [0m[38;2;248;248;242m[[0m[38;2;230;219;116m'[0m[38;2;230;219;116m.coffee[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116m.litcoffee[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116m.coffee.md[0m[38;2;230;219;116m'[0m[38;2;248;248;242m][0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Expose helpers for testing.[0m
|
||||
[38;2;248;248;242mexports.helpers [0m[38;2;249;38;114m= [0m[38;2;248;248;242mhelpers[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Function that allows for btoa in both nodejs and the browser.[0m
|
||||
[38;2;166;226;46mbase64encod[0m[38;2;166;226;46me[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(src)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m[38;2;248;248;242m [0m[38;2;249;38;114mswitch[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m [0m[38;2;249;38;114mtypeof[0m[38;2;248;248;242m Buffer [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mfunction[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m Buffer[0m[38;2;248;248;242m.[0m[38;2;102;217;239mfrom[0m[38;2;255;255;255m([0m[38;2;248;248;242msrc[0m[38;2;255;255;255m)[0m[38;2;248;248;242m.[0m[38;2;102;217;239mtoString[0m[38;2;255;255;255m([0m[38;2;230;219;116m'[0m[38;2;230;219;116mbase64[0m[38;2;230;219;116m'[0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m [0m[38;2;249;38;114mtypeof[0m[38;2;248;248;242m btoa [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mfunction[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m The contents of a `<script>` block are encoded via UTF-16, so if any extended[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m characters are used in the block, btoa will fail as it maxes out at UTF-8.[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m See https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m for the gory details, and for the solution implemented here.[0m
|
||||
[38;2;248;248;242m btoa [0m[38;2;102;217;239mencodeURIComponent[0m[38;2;255;255;255m([0m[38;2;248;248;242msrc[0m[38;2;255;255;255m)[0m[38;2;248;248;242m.[0m[38;2;248;248;242mreplace [0m[38;2;246;170;17m/%([0-9A-F]{2})/g[0m[38;2;248;248;242m, [0m[3;38;2;253;151;31m(match, p1)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[3;38;2;166;226;46mString[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfromCharCode [0m[38;2;230;219;116m'[0m[38;2;230;219;116m0x[0m[38;2;230;219;116m'[0m[38;2;248;248;242m [0m[38;2;249;38;114m+[0m[38;2;248;248;242m p1[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mthrow[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mError[0m[38;2;255;255;255m([0m[38;2;230;219;116m'[0m[38;2;230;219;116mUnable to base64 encode inline sourcemap.[0m[38;2;230;219;116m'[0m[38;2;255;255;255m)[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Function wrapper to add source file information to SyntaxErrors thrown by the[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m lexer/parser/compiler.[0m
|
||||
[38;2;166;226;46mwithPrettyError[0m[38;2;166;226;46ms[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(fn)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[3;38;2;253;151;31m(code, options = {})[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mtry[0m
|
||||
[38;2;248;248;242m fn[0m[38;2;248;248;242m.[0m[38;2;102;217;239mcall[0m[38;2;248;248;242m [0m[38;2;255;255;255m@[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcode[0m[38;2;248;248;242m, [0m[38;2;248;248;242moptions[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mcatch[0m[38;2;248;248;242m err[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mthrow[0m[38;2;248;248;242m err [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;249;38;114mtypeof[0m[38;2;248;248;242m code [0m[38;2;249;38;114misnt[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mstring[0m[38;2;230;219;116m'[0m[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Support `CoffeeScript.nodes(tokens)`.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mthrow[0m[38;2;248;248;242m helpers[0m[38;2;248;248;242m.[0m[38;2;248;248;242mupdateSyntaxError err[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcode[0m[38;2;248;248;242m, [0m[38;2;248;248;242moptions[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfilename[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m For each compiled file, save its source in memory in case we need to[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m recompile it later. We might need to recompile if the first compilation[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m didn’t create a source map (faster) but something went wrong and we need[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m a stack trace. Assuming that most of the time, code isn’t throwing[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m exceptions, it’s probably more efficient to compile twice only when we[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m need a stack trace, rather than always generating a source map even when[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m it’s not likely to be used. Save in form of `filename`: [`(source)`][0m
|
||||
[38;2;248;248;242msources [0m[38;2;249;38;114m= [0m[38;2;248;248;242m{[0m[38;2;248;248;242m}[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Also save source maps if generated, in form of `(source)`: [`(source map)`].[0m
|
||||
[38;2;248;248;242msourceMaps [0m[38;2;249;38;114m= [0m[38;2;248;248;242m{[0m[38;2;248;248;242m}[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m This is exported to enable an external module to implement caching of[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m compilation results. When the compiled js source is loaded from cache, the[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m original coffee code should be added with this method in order to enable the[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Error.prepareStackTrace below to correctly adjust the stack trace for the[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m corresponding file (the source map will be generated on demand).[0m
|
||||
[38;2;248;248;242mexports.registerCompiled [0m[38;2;249;38;114m= [0m[38;2;166;226;46mregisterCompile[0m[38;2;166;226;46md[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(filename, source, sourcemap)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
|
||||
[38;2;248;248;242m sources[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m] [0m[38;2;249;38;114m?[0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m sources[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m][0m[38;2;248;248;242m.[0m[38;2;102;217;239mpush[0m[38;2;248;248;242m source[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m sourcemap[0m[38;2;249;38;114m?[0m
|
||||
[38;2;248;248;242m sourceMaps[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m] [0m[38;2;249;38;114m?[0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m sourceMaps[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m][0m[38;2;248;248;242m.[0m[38;2;102;217;239mpush[0m[38;2;248;248;242m sourcemap[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Compile CoffeeScript code to JavaScript, using the Coffee/Jison compiler.[0m
|
||||
[38;2;117;113;94m#[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m If `options.sourceMap` is specified, then `options.filename` must also be[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m specified. All options that can be passed to `SourceMap#generate` may also[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m be passed here.[0m
|
||||
[38;2;117;113;94m#[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m This returns a javascript string, unless `options.sourceMap` is passed,[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m in which case this returns a `{js, v3SourceMap, sourceMap}`[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m object, where sourceMap is a sourcemap.coffee#SourceMap object, handy for[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m doing programmatic lookups.[0m
|
||||
[38;2;248;248;242mexports.compile [0m[38;2;249;38;114m= [0m[38;2;248;248;242mcompile [0m[38;2;249;38;114m= [0m[38;2;248;248;242mwithPrettyErrors [0m[3;38;2;253;151;31m(code, options = {})[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Clone `options`, to avoid mutating the `options` object passed in.[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242moptions [0m[38;2;249;38;114m= [0m[3;38;2;166;226;46mObject[0m[38;2;248;248;242m.[0m[38;2;248;248;242massign [0m[38;2;248;248;242m{[0m[38;2;248;248;242m}[0m[38;2;248;248;242m, [0m[38;2;248;248;242moptions[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Always generate a source map if no filename is passed in, since without a[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m a filename we have no way to retrieve this source later in the event that[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m we need to recompile it to get a source map for `prepareStackTrace`.[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mgenerateSourceMap [0m[38;2;249;38;114m= [0m[38;2;248;248;242moptions[0m[38;2;248;248;242m.[0m[38;2;248;248;242msourceMap [0m[38;2;249;38;114mor[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242minlineMap [0m[38;2;249;38;114mor[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfilename[0m[38;2;249;38;114m?[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfilename [0m[38;2;249;38;114m= [0m[38;2;248;248;242moptions[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfilename [0m[38;2;249;38;114mor[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m<anonymous>[0m[38;2;230;219;116m'[0m
|
||||
|
||||
[38;2;248;248;242m checkShebangLine filename[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcode[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mmap [0m[38;2;249;38;114m= [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mSourceMap[0m[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m generateSourceMap[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtokens [0m[38;2;249;38;114m= [0m[38;2;248;248;242mlexer[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtokenize code[0m[38;2;248;248;242m, [0m[38;2;248;248;242moptions[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Pass a list of referenced variables, so that generated variables won’t get[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m the same name.[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242moptions.referencedVars [0m[38;2;249;38;114m= [0m[38;2;255;255;255m([0m
|
||||
[38;2;248;248;242m token[0m[38;2;248;248;242m[[0m[38;2;190;132;255m1[0m[38;2;248;248;242m] [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m token [0m[38;2;249;38;114min[0m[38;2;248;248;242m tokens [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m token[0m[38;2;248;248;242m[[0m[38;2;190;132;255m0[0m[38;2;248;248;242m] [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mIDENTIFIER[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m [0m[38;2;255;255;255m)[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Check for import or export; if found, force bare mode.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114munless[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mbare[0m[38;2;249;38;114m?[0m[38;2;248;248;242m [0m[38;2;249;38;114mand[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mbare [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;190;132;255myes[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m token [0m[38;2;249;38;114min[0m[38;2;248;248;242m tokens[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m token[0m[38;2;248;248;242m[[0m[38;2;190;132;255m0[0m[38;2;248;248;242m] [0m[38;2;249;38;114min[0m[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;230;219;116m'[0m[38;2;230;219;116mIMPORT[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116mEXPORT[0m[38;2;230;219;116m'[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242moptions.bare [0m[38;2;249;38;114m= [0m[38;2;190;132;255myes[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mbreak[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mnodes [0m[38;2;249;38;114m= [0m[38;2;248;248;242mparser[0m[38;2;248;248;242m.[0m[38;2;248;248;242mparse tokens[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m If all that was requested was a POJO representation of the nodes, e.g.[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m the abstract syntax tree (AST), we can stop now and just return that[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m (after fixing the location data for the root/`File`»`Program` node,[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m which might’ve gotten misaligned from the original source due to the[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m `clean` function in the lexer).[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mast[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mnodes.allCommentTokens [0m[38;2;249;38;114m= [0m[38;2;248;248;242mhelpers[0m[38;2;248;248;242m.[0m[38;2;248;248;242mextractAllCommentTokens tokens[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msourceCodeNumberOfLines [0m[38;2;249;38;114m= [0m[38;2;255;255;255m([0m[38;2;248;248;242mcode[0m[38;2;248;248;242m.[0m[38;2;248;248;242mmatch[0m[38;2;255;255;255m([0m[38;2;246;170;17m/\r?\n/g[0m[38;2;255;255;255m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mor[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m'[0m[38;2;255;255;255m)[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msourceCodeLastLine [0m[38;2;249;38;114m= [0m[38;2;246;170;17m/.*$/[0m[38;2;248;248;242m.[0m[38;2;248;248;242mexec[0m[38;2;255;255;255m([0m[38;2;248;248;242mcode[0m[38;2;255;255;255m)[0m[38;2;248;248;242m[[0m[38;2;190;132;255m0[0m[38;2;248;248;242m] [0m[38;2;117;113;94m#[0m[38;2;117;113;94m `.*` matches all but line break characters.[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mast [0m[38;2;249;38;114m= [0m[38;2;248;248;242mnodes[0m[38;2;248;248;242m.[0m[38;2;248;248;242mast options[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mrange [0m[38;2;249;38;114m= [0m[38;2;248;248;242m[[0m[38;2;190;132;255m0[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcode[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mast.start [0m[38;2;249;38;114m= [0m[38;2;248;248;242mast.program.start [0m[38;2;249;38;114m= [0m[38;2;248;248;242mrange[0m[38;2;248;248;242m[[0m[38;2;190;132;255m0[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mast.end [0m[38;2;249;38;114m= [0m[38;2;248;248;242mast.program.end [0m[38;2;249;38;114m= [0m[38;2;248;248;242mrange[0m[38;2;248;248;242m[[0m[38;2;190;132;255m1[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mast.range [0m[38;2;249;38;114m= [0m[38;2;248;248;242mast.program.range [0m[38;2;249;38;114m= [0m[38;2;248;248;242mrange[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mast.loc.start [0m[38;2;249;38;114m= [0m[38;2;248;248;242mast.program.loc.start [0m[38;2;249;38;114m= [0m[38;2;248;248;242m{[0m[38;2;248;248;242mline[0m[38;2;248;248;242m:[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcolumn[0m[38;2;248;248;242m:[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m}[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mast.loc.end.line [0m[38;2;249;38;114m= [0m[38;2;248;248;242mast.program.loc.end.line [0m[38;2;249;38;114m= [0m[38;2;248;248;242msourceCodeNumberOfLines[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mast.loc.end.column [0m[38;2;249;38;114m= [0m[38;2;248;248;242mast.program.loc.end.column [0m[38;2;249;38;114m= [0m[38;2;248;248;242msourceCodeLastLine[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mast.tokens [0m[38;2;249;38;114m= [0m[38;2;248;248;242mtokens[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m ast[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfragments [0m[38;2;249;38;114m= [0m[38;2;248;248;242mnodes[0m[38;2;248;248;242m.[0m[38;2;248;248;242mcompileToFragments options[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mcurrentLine [0m[38;2;249;38;114m= [0m[38;2;190;132;255m0[0m
|
||||
[38;2;248;248;242m currentLine [0m[38;2;249;38;114m+[0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mheader[0m
|
||||
[38;2;248;248;242m currentLine [0m[38;2;249;38;114m+[0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mshiftLine[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mcurrentColumn [0m[38;2;249;38;114m= [0m[38;2;190;132;255m0[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mjs [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m fragment [0m[38;2;249;38;114min[0m[38;2;248;248;242m fragments[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Update the sourcemap with data from each fragment.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m generateSourceMap[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Do not include empty, whitespace, or semicolon-only fragments.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m fragment[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlocationData [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m [0m[38;2;246;170;17m/^[;\s]*$/[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtest fragment[0m[38;2;248;248;242m.[0m[38;2;248;248;242mcode[0m
|
||||
[38;2;248;248;242m map[0m[38;2;248;248;242m.[0m[38;2;248;248;242madd[0m[38;2;255;255;255m([0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;248;248;242mfragment[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlocationData[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfirst_line[0m[38;2;248;248;242m, [0m[38;2;248;248;242mfragment[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlocationData[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfirst_column[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;248;248;242mcurrentLine[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcurrentColumn[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242m{[0m[38;2;248;248;242mnoReplace[0m[38;2;248;248;242m:[0m[38;2;248;248;242m [0m[38;2;190;132;255mtrue[0m[38;2;248;248;242m}[0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mnewLines [0m[38;2;249;38;114m= [0m[38;2;248;248;242mhelpers[0m[38;2;248;248;242m.[0m[38;2;248;248;242mcount fragment[0m[38;2;248;248;242m.[0m[38;2;248;248;242mcode[0m[38;2;248;248;242m, [0m[38;2;230;219;116m"[0m[38;2;190;132;255m\n[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m currentLine [0m[38;2;249;38;114m+[0m[38;2;249;38;114m=[0m[38;2;248;248;242m newLines[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m newLines[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mcurrentColumn [0m[38;2;249;38;114m= [0m[38;2;248;248;242mfragment[0m[38;2;248;248;242m.[0m[38;2;248;248;242mcode[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;255;255;255m([0m[38;2;248;248;242mfragment[0m[38;2;248;248;242m.[0m[38;2;248;248;242mcode[0m[38;2;248;248;242m.[0m[38;2;102;217;239mlastIndexOf[0m[38;2;255;255;255m([0m[38;2;230;219;116m"[0m[38;2;190;132;255m\n[0m[38;2;230;219;116m"[0m[38;2;255;255;255m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m currentColumn [0m[38;2;249;38;114m+[0m[38;2;249;38;114m=[0m[38;2;248;248;242m fragment[0m[38;2;248;248;242m.[0m[38;2;248;248;242mcode[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Copy the code from each fragment into the final JavaScript.[0m
|
||||
[38;2;248;248;242m js [0m[38;2;249;38;114m+[0m[38;2;249;38;114m=[0m[38;2;248;248;242m fragment[0m[38;2;248;248;242m.[0m[38;2;248;248;242mcode[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mheader[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mheader [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;219;116mGenerated by CoffeeScript [0m[38;2;230;159;102m#{[0m[38;2;255;255;255m@VERSION[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mjs [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;219;116m// [0m[38;2;230;159;102m#{[0m[38;2;230;219;116mheader[0m[38;2;230;159;102m}[0m[38;2;190;132;255m\n[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mjs[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m generateSourceMap[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mv3SourceMap [0m[38;2;249;38;114m= [0m[38;2;248;248;242mmap[0m[38;2;248;248;242m.[0m[38;2;248;248;242mgenerate options[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcode[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtranspile[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;249;38;114mtypeof[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtranspile [0m[38;2;249;38;114misnt[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mobject[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m This only happens if run via the Node API and `transpile` is set to[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m something other than an object.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mthrow[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mError[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mThe transpile option must be given an object with options to pass to Babel[0m[38;2;230;219;116m'[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Get the reference to Babel that we have been passed if this compiler[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m is run via the CLI or Node API.[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtranspiler [0m[38;2;249;38;114m= [0m[38;2;248;248;242moptions[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtranspile[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtranspile[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mdelete[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtranspile[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtranspile[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtranspilerOptions [0m[38;2;249;38;114m= [0m[3;38;2;166;226;46mObject[0m[38;2;248;248;242m.[0m[38;2;248;248;242massign [0m[38;2;248;248;242m{[0m[38;2;248;248;242m}[0m[38;2;248;248;242m, [0m[38;2;248;248;242moptions[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtranspile[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m See https://github.com/babel/babel/issues/827#issuecomment-77573107:[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Babel can take a v3 source map object as input in `inputSourceMap`[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m and it will return an *updated* v3 source map object in its output.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m v3SourceMap [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m transpilerOptions[0m[38;2;248;248;242m.[0m[38;2;248;248;242minputSourceMap[0m[38;2;249;38;114m?[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtranspilerOptions.inputSourceMap [0m[38;2;249;38;114m= [0m[38;2;248;248;242mv3SourceMap[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtranspilerOutput [0m[38;2;249;38;114m= [0m[38;2;248;248;242mtranspiler js[0m[38;2;248;248;242m, [0m[38;2;248;248;242mtranspilerOptions[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mjs [0m[38;2;249;38;114m= [0m[38;2;248;248;242mtranspilerOutput[0m[38;2;248;248;242m.[0m[38;2;248;248;242mcode[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m v3SourceMap [0m[38;2;249;38;114mand[0m[38;2;248;248;242m transpilerOutput[0m[38;2;248;248;242m.[0m[38;2;102;217;239mmap[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mv3SourceMap [0m[38;2;249;38;114m= [0m[38;2;248;248;242mtranspilerOutput[0m[38;2;248;248;242m.[0m[38;2;102;217;239mmap[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242minlineMap[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mencoded [0m[38;2;249;38;114m= [0m[38;2;248;248;242mbase64encode JSON[0m[38;2;248;248;242m.[0m[38;2;248;248;242mstringify v3SourceMap[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msourceMapDataURI [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;219;116m//# sourceMappingURL=data:application/json;base64,[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mencoded[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msourceURL [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;219;116m//# sourceURL=[0m[38;2;230;159;102m#{[0m[38;2;230;219;116moptions[0m[38;2;230;219;116m.[0m[38;2;230;219;116mfilename [0m[38;2;249;38;114m?[0m[38;2;230;219;116m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mcoffeescript[0m[38;2;230;219;116m'[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mjs [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mjs[0m[38;2;230;159;102m}[0m[38;2;190;132;255m\n[0m[38;2;230;159;102m#{[0m[38;2;230;219;116msourceMapDataURI[0m[38;2;230;159;102m}[0m[38;2;190;132;255m\n[0m[38;2;230;159;102m#{[0m[38;2;230;219;116msourceURL[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m
|
||||
|
||||
[38;2;248;248;242m registerCompiled filename[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcode[0m[38;2;248;248;242m, [0m[38;2;248;248;242mmap[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m options[0m[38;2;248;248;242m.[0m[38;2;248;248;242msourceMap[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242m{[0m
|
||||
[38;2;248;248;242m js[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msourceMap[0m[38;2;248;248;242m:[0m[38;2;248;248;242m map[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mv3SourceMap[0m[38;2;248;248;242m:[0m[38;2;248;248;242m JSON[0m[38;2;248;248;242m.[0m[38;2;248;248;242mstringify v3SourceMap[0m[38;2;248;248;242m, [0m[38;2;190;132;255mnull[0m[38;2;248;248;242m, [0m[38;2;190;132;255m2[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242m}[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m js[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Tokenize a string of CoffeeScript code, and return the array of tokens.[0m
|
||||
[38;2;248;248;242mexports.tokens [0m[38;2;249;38;114m= [0m[38;2;248;248;242mwithPrettyErrors [0m[3;38;2;253;151;31m(code, options)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m lexer[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtokenize code[0m[38;2;248;248;242m, [0m[38;2;248;248;242moptions[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Parse a string of CoffeeScript code or an array of lexed tokens, and[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m return the AST. You can then compile it by calling `.compile()` on the root,[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m or traverse it by using `.traverseChildren()` with a callback.[0m
|
||||
[38;2;248;248;242mexports.nodes [0m[38;2;249;38;114m= [0m[38;2;248;248;242mwithPrettyErrors [0m[3;38;2;253;151;31m(source, options)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msource [0m[38;2;249;38;114m= [0m[38;2;248;248;242mlexer[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtokenize source[0m[38;2;248;248;242m, [0m[38;2;248;248;242moptions [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;249;38;114mtypeof[0m[38;2;248;248;242m source [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mstring[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m parser[0m[38;2;248;248;242m.[0m[38;2;248;248;242mparse source[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m This file used to export these methods; leave stubs that throw warnings[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m instead. These methods have been moved into `index.coffee` to provide[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m separate entrypoints for Node and non-Node environments, so that static[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m analysis tools don’t choke on Node packages when compiling for a non-Node[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m environment.[0m
|
||||
[38;2;248;248;242mexports.run [0m[38;2;249;38;114m= [0m[38;2;248;248;242mexports.eval [0m[38;2;249;38;114m= [0m[38;2;166;226;46mexports.registe[0m[38;2;166;226;46mr[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mthrow[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mError[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mrequire index.coffee, not this file[0m[38;2;230;219;116m'[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Instantiate a Lexer for our use here.[0m
|
||||
[38;2;248;248;242mlexer [0m[38;2;249;38;114m= [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m [0m[3;38;2;166;226;46mLexer[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m The real Lexer produces a generic stream of tokens. This object provides a[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m thin wrapper around it, compatible with the Jison API. We can then pass it[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m directly as a “Jison lexer.”[0m
|
||||
[38;2;248;248;242mparser.lexer [0m[38;2;249;38;114m=[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242myylloc[0m[38;2;248;248;242m:[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mrange[0m[38;2;248;248;242m:[0m[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242moptions[0m[38;2;248;248;242m:[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mranges[0m[38;2;248;248;242m:[0m[38;2;248;248;242m [0m[38;2;190;132;255myes[0m
|
||||
[38;2;248;248;242m [0m[38;2;166;226;46mle[0m[38;2;166;226;46mx[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtoken [0m[38;2;249;38;114m= [0m[38;2;248;248;242mparser[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtokens[0m[38;2;248;248;242m[[0m[38;2;255;255;255m@pos[0m[38;2;249;38;114m++[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m token[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114m[[0m[38;2;248;248;242mtag[0m[38;2;248;248;242m, [0m[38;2;255;255;255m@yytext[0m[38;2;248;248;242m, [0m[38;2;255;255;255m@yylloc[0m[38;2;249;38;114m] =[0m[38;2;248;248;242m token[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mparser.errorToken [0m[38;2;249;38;114m= [0m[38;2;248;248;242mtoken[0m[38;2;248;248;242m.[0m[38;2;248;248;242morigin [0m[38;2;249;38;114mor[0m[38;2;248;248;242m token[0m
|
||||
[38;2;248;248;242m [0m[38;2;255;255;255m@yylineno[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;255;255;255m@yylloc[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfirst_line[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtag [0m[38;2;249;38;114m= [0m[38;2;230;219;116m'[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m tag[0m
|
||||
[38;2;248;248;242m [0m[38;2;166;226;46msetInpu[0m[38;2;166;226;46mt[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(tokens)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mparser.tokens [0m[38;2;249;38;114m= [0m[38;2;248;248;242mtokens[0m
|
||||
[38;2;248;248;242m [0m[38;2;255;255;255m@pos[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m
|
||||
[38;2;248;248;242m [0m[38;2;166;226;46mupcomingInpu[0m[38;2;166;226;46mt[0m[38;2;249;38;114m:[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m'[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Make all the AST nodes visible to the parser.[0m
|
||||
[38;2;248;248;242mparser.yy [0m[38;2;249;38;114m= [0m[38;2;102;217;239mrequire[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m./nodes[0m[38;2;230;219;116m'[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Override Jison's default error handling function.[0m
|
||||
[38;2;166;226;46mparser.yy.parseErro[0m[38;2;166;226;46mr[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(message, {token})[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Disregard Jison's message, it contains redundant line number information.[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Disregard the token, we take its value directly from the lexer in case[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m the error is caused by a generated token which might refer to its origin.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114m{[0m[38;2;248;248;242merrorToken[0m[38;2;248;248;242m, [0m[38;2;248;248;242mtokens[0m[38;2;249;38;114m} =[0m[38;2;248;248;242m parser[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114m[[0m[38;2;248;248;242merrorTag[0m[38;2;248;248;242m, [0m[38;2;248;248;242merrorText[0m[38;2;248;248;242m, [0m[38;2;248;248;242merrorLoc[0m[38;2;249;38;114m] =[0m[38;2;248;248;242m errorToken[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242merrorText [0m[38;2;249;38;114m= [0m[38;2;249;38;114mswitch[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m errorToken [0m[38;2;249;38;114mis[0m[38;2;248;248;242m tokens[0m[38;2;248;248;242m[[0m[38;2;248;248;242mtokens[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mend of input[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m errorTag [0m[38;2;249;38;114min[0m[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;230;219;116m'[0m[38;2;230;219;116mINDENT[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116mOUTDENT[0m[38;2;230;219;116m'[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mindentation[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m errorTag [0m[38;2;249;38;114min[0m[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;230;219;116m'[0m[38;2;230;219;116mIDENTIFIER[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116mNUMBER[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116mINFINITY[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116mSTRING[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116mSTRING_START[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116mREGEX[0m[38;2;230;219;116m'[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116mREGEX_START[0m[38;2;230;219;116m'[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m errorTag[0m[38;2;248;248;242m.[0m[38;2;248;248;242mreplace[0m[38;2;255;255;255m([0m[38;2;246;170;17m/_START$/[0m[38;2;248;248;242m, [0m[38;2;230;219;116m'[0m[38;2;230;219;116m'[0m[38;2;255;255;255m)[0m[38;2;248;248;242m.[0m[38;2;248;248;242mtoLowerCase[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m helpers[0m[38;2;248;248;242m.[0m[38;2;248;248;242mnameWhitespaceCharacter errorText[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m The second argument has a `loc` property, which should have the location[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m data for this token. Unfortunately, Jison seems to send an outdated `loc`[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m (from the previous token), so we take the location information directly[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m from the lexer.[0m
|
||||
[38;2;248;248;242m helpers[0m[38;2;248;248;242m.[0m[38;2;248;248;242mthrowSyntaxError [0m[38;2;230;219;116m"[0m[38;2;230;219;116munexpected [0m[38;2;230;159;102m#{[0m[38;2;230;219;116merrorText[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m[38;2;248;248;242m, [0m[38;2;248;248;242merrorLoc[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Based on http://v8.googlecode.com/svn/branches/bleeding_edge/src/messages.js[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Modified to handle sourceMap[0m
|
||||
[38;2;166;226;46mformatSourcePositio[0m[38;2;166;226;46mn[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(frame, getSourceMapping)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfilename [0m[38;2;249;38;114m= [0m[38;2;190;132;255mundefined[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfileLocation [0m[38;2;249;38;114m= [0m[38;2;230;219;116m'[0m[38;2;230;219;116m'[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m frame[0m[38;2;248;248;242m.[0m[38;2;248;248;242misNative[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfileLocation [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;219;116mnative[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m frame[0m[38;2;248;248;242m.[0m[38;2;248;248;242misEval[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfilename [0m[38;2;249;38;114m= [0m[38;2;248;248;242mframe[0m[38;2;248;248;242m.[0m[38;2;248;248;242mgetScriptNameOrSourceURL[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfileLocation [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mframe[0m[38;2;230;219;116m.[0m[38;2;230;219;116mgetEvalOrigin[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;230;159;102m}[0m[38;2;230;219;116m, [0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;249;38;114munless[0m[38;2;248;248;242m filename[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfilename [0m[38;2;249;38;114m= [0m[38;2;248;248;242mframe[0m[38;2;248;248;242m.[0m[38;2;248;248;242mgetFileName[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
|
||||
[38;2;248;248;242m filename [0m[38;2;249;38;114mor=[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m<anonymous>[0m[38;2;230;219;116m"[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mline [0m[38;2;249;38;114m= [0m[38;2;248;248;242mframe[0m[38;2;248;248;242m.[0m[38;2;248;248;242mgetLineNumber[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mcolumn [0m[38;2;249;38;114m= [0m[38;2;248;248;242mframe[0m[38;2;248;248;242m.[0m[38;2;248;248;242mgetColumnNumber[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Check for a sourceMap position[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msource [0m[38;2;249;38;114m= [0m[38;2;248;248;242mgetSourceMapping filename[0m[38;2;248;248;242m, [0m[38;2;248;248;242mline[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcolumn[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfileLocation [0m[38;2;249;38;114m=[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m source[0m
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfilename[0m[38;2;230;159;102m}[0m[38;2;230;219;116m:[0m[38;2;230;159;102m#{[0m[38;2;230;219;116msource[0m[38;2;230;219;116m[[0m[38;2;190;132;255m0[0m[38;2;230;219;116m][0m[38;2;230;159;102m}[0m[38;2;230;219;116m:[0m[38;2;230;159;102m#{[0m[38;2;230;219;116msource[0m[38;2;230;219;116m[[0m[38;2;190;132;255m1[0m[38;2;230;219;116m][0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfilename[0m[38;2;230;159;102m}[0m[38;2;230;219;116m:[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mline[0m[38;2;230;159;102m}[0m[38;2;230;219;116m:[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mcolumn[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfunctionName [0m[38;2;249;38;114m= [0m[38;2;248;248;242mframe[0m[38;2;248;248;242m.[0m[38;2;248;248;242mgetFunctionName[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242misConstructor [0m[38;2;249;38;114m= [0m[38;2;248;248;242mframe[0m[38;2;248;248;242m.[0m[38;2;248;248;242misConstructor[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242misMethodCall [0m[38;2;249;38;114m= [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m [0m[38;2;255;255;255m([0m[38;2;248;248;242mframe[0m[38;2;248;248;242m.[0m[38;2;248;248;242misToplevel[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mor[0m[38;2;248;248;242m isConstructor[0m[38;2;255;255;255m)[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m isMethodCall[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mmethodName [0m[38;2;249;38;114m= [0m[38;2;248;248;242mframe[0m[38;2;248;248;242m.[0m[38;2;248;248;242mgetMethodName[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtypeName [0m[38;2;249;38;114m= [0m[38;2;248;248;242mframe[0m[38;2;248;248;242m.[0m[38;2;248;248;242mgetTypeName[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m functionName[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtp [0m[38;2;249;38;114m= [0m[38;2;248;248;242mas [0m[38;2;249;38;114m= [0m[38;2;230;219;116m'[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m typeName [0m[38;2;249;38;114mand[0m[38;2;248;248;242m functionName[0m[38;2;248;248;242m.[0m[38;2;102;217;239mindexOf[0m[38;2;248;248;242m typeName[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mtp [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mtypeName[0m[38;2;230;159;102m}[0m[38;2;230;219;116m.[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m methodName [0m[38;2;249;38;114mand[0m[38;2;248;248;242m functionName[0m[38;2;248;248;242m.[0m[38;2;102;217;239mindexOf[0m[38;2;255;255;255m([0m[38;2;230;219;116m"[0m[38;2;230;219;116m.[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mmethodName[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m[38;2;255;255;255m)[0m[38;2;248;248;242m [0m[38;2;249;38;114misnt[0m[38;2;248;248;242m functionName[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength [0m[38;2;249;38;114m-[0m[38;2;248;248;242m methodName[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mas [0m[38;2;249;38;114m= [0m[38;2;230;219;116m"[0m[38;2;230;219;116m [as [0m[38;2;230;159;102m#{[0m[38;2;230;219;116mmethodName[0m[38;2;230;159;102m}[0m[38;2;230;219;116m][0m[38;2;230;219;116m"[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mtp[0m[38;2;230;159;102m}[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfunctionName[0m[38;2;230;159;102m}[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mas[0m[38;2;230;159;102m}[0m[38;2;230;219;116m ([0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfileLocation[0m[38;2;230;159;102m}[0m[38;2;230;219;116m)[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mtypeName[0m[38;2;230;159;102m}[0m[38;2;230;219;116m.[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mmethodName [0m[38;2;249;38;114mor[0m[38;2;230;219;116m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m<anonymous>[0m[38;2;230;219;116m'[0m[38;2;230;159;102m}[0m[38;2;230;219;116m ([0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfileLocation[0m[38;2;230;159;102m}[0m[38;2;230;219;116m)[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m isConstructor[0m
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mnew [0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfunctionName [0m[38;2;249;38;114mor[0m[38;2;230;219;116m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m<anonymous>[0m[38;2;230;219;116m'[0m[38;2;230;159;102m}[0m[38;2;230;219;116m ([0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfileLocation[0m[38;2;230;159;102m}[0m[38;2;230;219;116m)[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m functionName[0m
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfunctionName[0m[38;2;230;159;102m}[0m[38;2;230;219;116m ([0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfileLocation[0m[38;2;230;159;102m}[0m[38;2;230;219;116m)[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m fileLocation[0m
|
||||
|
||||
[38;2;166;226;46mgetSourceMa[0m[38;2;166;226;46mp[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(filename, line, column)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Skip files that we didn’t compile, like Node system files that appear in[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m the stack trace, as they never have source maps.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;190;132;255mnull[0m[38;2;248;248;242m [0m[38;2;249;38;114munless[0m[38;2;248;248;242m filename [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m<anonymous>[0m[38;2;230;219;116m'[0m[38;2;248;248;242m [0m[38;2;249;38;114mor[0m[38;2;248;248;242m filename[0m[38;2;248;248;242m.[0m[38;2;102;217;239mslice[0m[38;2;255;255;255m([0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m.[0m[38;2;102;217;239mlastIndexOf[0m[38;2;255;255;255m([0m[38;2;230;219;116m'[0m[38;2;230;219;116m.[0m[38;2;230;219;116m'[0m[38;2;255;255;255m)[0m[38;2;255;255;255m)[0m[38;2;248;248;242m [0m[38;2;249;38;114min[0m[38;2;248;248;242m FILE_EXTENSIONS[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m filename [0m[38;2;249;38;114misnt[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m<anonymous>[0m[38;2;230;219;116m'[0m[38;2;248;248;242m [0m[38;2;249;38;114mand[0m[38;2;248;248;242m sourceMaps[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m][0m[38;2;249;38;114m?[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m sourceMaps[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m][0m[38;2;248;248;242m[[0m[38;2;248;248;242msourceMaps[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m][0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m CoffeeScript compiled in a browser or via `CoffeeScript.compile` or `.run`[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m may get compiled with `options.filename` that’s missing, which becomes[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m `<anonymous>`; but the runtime might request the stack trace with the[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m filename of the script file. See if we have a source map cached under[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m `<anonymous>` that matches the error.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m sourceMaps[0m[38;2;248;248;242m[[0m[38;2;230;219;116m'[0m[38;2;230;219;116m<anonymous>[0m[38;2;230;219;116m'[0m[38;2;248;248;242m][0m[38;2;249;38;114m?[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m Work backwards from the most recent anonymous source maps, until we find[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m one that works. This isn’t foolproof; there is a chance that multiple[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m source maps will have line/column pairs that match. But we have no other[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m way to match them. `frame.getFunction().toString()` doesn’t always work,[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m and it’s not foolproof either.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m map [0m[38;2;249;38;114min[0m[38;2;248;248;242m sourceMaps[0m[38;2;248;248;242m[[0m[38;2;230;219;116m'[0m[38;2;230;219;116m<anonymous>[0m[38;2;230;219;116m'[0m[38;2;248;248;242m] [0m[38;2;249;38;114mby[0m[38;2;248;248;242m [0m[38;2;249;38;114m-[0m[38;2;190;132;255m1[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msourceLocation [0m[38;2;249;38;114m= [0m[38;2;248;248;242mmap[0m[38;2;248;248;242m.[0m[38;2;248;248;242msourceLocation [0m[38;2;248;248;242m[[0m[38;2;248;248;242mline [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcolumn [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m map [0m[38;2;249;38;114mif[0m[38;2;248;248;242m sourceLocation[0m[38;2;249;38;114m?[0m[38;2;248;248;242m[[0m[38;2;190;132;255m0[0m[38;2;248;248;242m][0m[38;2;249;38;114m?[0m[38;2;248;248;242m [0m[38;2;249;38;114mand[0m[38;2;248;248;242m sourceLocation[0m[38;2;248;248;242m[[0m[38;2;190;132;255m1[0m[38;2;248;248;242m][0m[38;2;249;38;114m?[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m If all else fails, recompile this source to get a source map. We need the[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m previous section (for `<anonymous>`) despite this option, because after it[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m gets compiled we will still need to look it up from[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m `sourceMaps['<anonymous>']` in order to find and return it. That’s why we[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m start searching from the end in the previous block, because most of the[0m
|
||||
[38;2;248;248;242m [0m[38;2;117;113;94m#[0m[38;2;117;113;94m time the source map we want is the last one.[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m sources[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m][0m[38;2;249;38;114m?[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242manswer [0m[38;2;249;38;114m= [0m[38;2;248;248;242mcompile sources[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m][0m[38;2;248;248;242m[[0m[38;2;248;248;242msources[0m[38;2;248;248;242m[[0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m][0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m][0m[38;2;248;248;242m,[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfilename[0m[38;2;248;248;242m:[0m[38;2;248;248;242m filename[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msourceMap[0m[38;2;248;248;242m:[0m[38;2;248;248;242m [0m[38;2;190;132;255myes[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mliterate[0m[38;2;248;248;242m:[0m[38;2;248;248;242m helpers[0m[38;2;248;248;242m.[0m[38;2;248;248;242misLiterate filename[0m
|
||||
[38;2;248;248;242m answer[0m[38;2;248;248;242m.[0m[38;2;248;248;242msourceMap[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114melse[0m
|
||||
[38;2;248;248;242m [0m[38;2;190;132;255mnull[0m
|
||||
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m Based on [michaelficarra/CoffeeScriptRedux](http://goo.gl/ZTx1p)[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m NodeJS / V8 have no support for transforming positions in stack traces using[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m sourceMap, so we must monkey-patch Error to display CoffeeScript source[0m
|
||||
[38;2;117;113;94m#[0m[38;2;117;113;94m positions.[0m
|
||||
[38;2;166;226;46mError.prepareStackTrac[0m[38;2;166;226;46me[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(err, stack)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;166;226;46mgetSourceMappin[0m[38;2;166;226;46mg[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(filename, line, column)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242msourceMap [0m[38;2;249;38;114m= [0m[38;2;248;248;242mgetSourceMap filename[0m[38;2;248;248;242m, [0m[38;2;248;248;242mline[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcolumn[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242manswer [0m[38;2;249;38;114m= [0m[38;2;248;248;242msourceMap[0m[38;2;248;248;242m.[0m[38;2;248;248;242msourceLocation [0m[38;2;248;248;242m[[0m[38;2;248;248;242mline [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m, [0m[38;2;248;248;242mcolumn [0m[38;2;249;38;114m-[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m] [0m[38;2;249;38;114mif[0m[38;2;248;248;242m sourceMap[0m[38;2;249;38;114m?[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m answer[0m[38;2;249;38;114m?[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;248;248;242manswer[0m[38;2;248;248;242m[[0m[38;2;190;132;255m0[0m[38;2;248;248;242m] [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m, [0m[38;2;248;248;242manswer[0m[38;2;248;248;242m[[0m[38;2;190;132;255m1[0m[38;2;248;248;242m] [0m[38;2;249;38;114m+[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m] [0m[38;2;249;38;114melse[0m[38;2;248;248;242m [0m[38;2;190;132;255mnull[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mframes [0m[38;2;249;38;114m= [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m frame [0m[38;2;249;38;114min[0m[38;2;248;248;242m stack[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mbreak[0m[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m frame[0m[38;2;248;248;242m.[0m[38;2;248;248;242mgetFunction[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m[38;2;248;248;242m exports[0m[38;2;248;248;242m.[0m[38;2;248;248;242mrun[0m
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m at [0m[38;2;230;159;102m#{[0m[38;2;230;219;116mformatSourcePosition frame[0m[38;2;230;219;116m, [0m[38;2;230;219;116mgetSourceMapping[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m
|
||||
|
||||
[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;159;102m#{[0m[38;2;230;219;116merr[0m[38;2;230;219;116m.[0m[38;2;102;217;239mtoString[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;230;159;102m}[0m[38;2;190;132;255m\n[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mframes[0m[38;2;230;219;116m.[0m[38;2;102;217;239mjoin[0m[38;2;230;219;116m [0m[38;2;230;219;116m'[0m[38;2;190;132;255m\n[0m[38;2;230;219;116m'[0m[38;2;230;159;102m}[0m[38;2;190;132;255m\n[0m[38;2;230;219;116m"[0m
|
||||
|
||||
[38;2;166;226;46mcheckShebangLin[0m[38;2;166;226;46me[0m[38;2;166;226;46m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(file, input)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mfirstLine [0m[38;2;249;38;114m= [0m[38;2;248;248;242minput[0m[38;2;248;248;242m.[0m[38;2;248;248;242msplit[0m[38;2;255;255;255m([0m[38;2;246;170;17m/$/m[0m[38;2;255;255;255m)[0m[38;2;248;248;242m[[0m[38;2;190;132;255m0[0m[38;2;248;248;242m][0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242mrest [0m[38;2;249;38;114m= [0m[38;2;248;248;242mfirstLine[0m[38;2;249;38;114m?[0m[38;2;248;248;242m.[0m[38;2;248;248;242mmatch[0m[38;2;255;255;255m([0m[38;2;246;170;17m/^#!\s*([^\s]+\s*)(.*)/[0m[38;2;255;255;255m)[0m
|
||||
[38;2;248;248;242m [0m[38;2;248;248;242margs [0m[38;2;249;38;114m= [0m[38;2;248;248;242mrest[0m[38;2;249;38;114m?[0m[38;2;248;248;242m[[0m[38;2;190;132;255m2[0m[38;2;248;248;242m][0m[38;2;249;38;114m?[0m[38;2;248;248;242m.[0m[38;2;248;248;242msplit[0m[38;2;255;255;255m([0m[38;2;246;170;17m/\s/[0m[38;2;255;255;255m)[0m[38;2;248;248;242m.[0m[38;2;102;217;239mfilter[0m[38;2;248;248;242m [0m[3;38;2;253;151;31m(s)[0m[38;2;248;248;242m [0m[3;38;2;102;217;239m->[0m[38;2;248;248;242m s [0m[38;2;249;38;114misnt[0m[38;2;248;248;242m [0m[38;2;230;219;116m'[0m[38;2;230;219;116m'[0m
|
||||
[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m args[0m[38;2;249;38;114m?[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlength [0m[38;2;249;38;114m>[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m
|
||||
[38;2;248;248;242m console[0m[38;2;248;248;242m.[0m[38;2;102;217;239merror[0m[38;2;248;248;242m [0m[38;2;230;219;116m'''[0m
|
||||
[38;2;230;219;116m The script to be run begins with a shebang line with more than one[0m
|
||||
[38;2;230;219;116m argument. This script will fail on platforms such as Linux which only[0m
|
||||
[38;2;230;219;116m allow a single argument.[0m
|
||||
[38;2;230;219;116m [0m[38;2;230;219;116m'''[0m
|
||||
[38;2;248;248;242m console[0m[38;2;248;248;242m.[0m[38;2;102;217;239merror[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mThe shebang line was: '[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfirstLine[0m[38;2;230;159;102m}[0m[38;2;230;219;116m' in file '[0m[38;2;230;159;102m#{[0m[38;2;230;219;116mfile[0m[38;2;230;159;102m}[0m[38;2;230;219;116m'[0m[38;2;230;219;116m"[0m
|
||||
[38;2;248;248;242m console[0m[38;2;248;248;242m.[0m[38;2;102;217;239merror[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mThe arguments were: [0m[38;2;230;159;102m#{[0m[38;2;230;219;116mJSON[0m[38;2;230;219;116m.[0m[38;2;230;219;116mstringify args[0m[38;2;230;159;102m}[0m[38;2;230;219;116m"[0m
|
26
tests/syntax-tests/source/CoffeeScript/LICENSE.md
Normal file
26
tests/syntax-tests/source/CoffeeScript/LICENSE.md
Normal file
@ -0,0 +1,26 @@
|
||||
The `coffeescript.coffee` file has been added from https://github.com/jashkenas/coffeescript under the following license:
|
||||
|
||||
```text
|
||||
Copyright (c) 2009-2018 Jeremy Ashkenas
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
```
|
391
tests/syntax-tests/source/CoffeeScript/coffeescript.coffee
Normal file
391
tests/syntax-tests/source/CoffeeScript/coffeescript.coffee
Normal file
@ -0,0 +1,391 @@
|
||||
# CoffeeScript can be used both on the server, as a command-line compiler based
|
||||
# on Node.js/V8, or to run CoffeeScript directly in the browser. This module
|
||||
# contains the main entry functions for tokenizing, parsing, and compiling
|
||||
# source CoffeeScript into JavaScript.
|
||||
|
||||
{Lexer} = require './lexer'
|
||||
{parser} = require './parser'
|
||||
helpers = require './helpers'
|
||||
SourceMap = require './sourcemap'
|
||||
# Require `package.json`, which is two levels above this file, as this file is
|
||||
# evaluated from `lib/coffeescript`.
|
||||
packageJson = require '../../package.json'
|
||||
|
||||
# The current CoffeeScript version number.
|
||||
exports.VERSION = packageJson.version
|
||||
|
||||
exports.FILE_EXTENSIONS = FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md']
|
||||
|
||||
# Expose helpers for testing.
|
||||
exports.helpers = helpers
|
||||
|
||||
# Function that allows for btoa in both nodejs and the browser.
|
||||
base64encode = (src) -> switch
|
||||
when typeof Buffer is 'function'
|
||||
Buffer.from(src).toString('base64')
|
||||
when typeof btoa is 'function'
|
||||
# The contents of a `<script>` block are encoded via UTF-16, so if any extended
|
||||
# characters are used in the block, btoa will fail as it maxes out at UTF-8.
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
|
||||
# for the gory details, and for the solution implemented here.
|
||||
btoa encodeURIComponent(src).replace /%([0-9A-F]{2})/g, (match, p1) ->
|
||||
String.fromCharCode '0x' + p1
|
||||
else
|
||||
throw new Error('Unable to base64 encode inline sourcemap.')
|
||||
|
||||
# Function wrapper to add source file information to SyntaxErrors thrown by the
|
||||
# lexer/parser/compiler.
|
||||
withPrettyErrors = (fn) ->
|
||||
(code, options = {}) ->
|
||||
try
|
||||
fn.call @, code, options
|
||||
catch err
|
||||
throw err if typeof code isnt 'string' # Support `CoffeeScript.nodes(tokens)`.
|
||||
throw helpers.updateSyntaxError err, code, options.filename
|
||||
|
||||
# For each compiled file, save its source in memory in case we need to
|
||||
# recompile it later. We might need to recompile if the first compilation
|
||||
# didn’t create a source map (faster) but something went wrong and we need
|
||||
# a stack trace. Assuming that most of the time, code isn’t throwing
|
||||
# exceptions, it’s probably more efficient to compile twice only when we
|
||||
# need a stack trace, rather than always generating a source map even when
|
||||
# it’s not likely to be used. Save in form of `filename`: [`(source)`]
|
||||
sources = {}
|
||||
# Also save source maps if generated, in form of `(source)`: [`(source map)`].
|
||||
sourceMaps = {}
|
||||
|
||||
# This is exported to enable an external module to implement caching of
|
||||
# compilation results. When the compiled js source is loaded from cache, the
|
||||
# original coffee code should be added with this method in order to enable the
|
||||
# Error.prepareStackTrace below to correctly adjust the stack trace for the
|
||||
# corresponding file (the source map will be generated on demand).
|
||||
exports.registerCompiled = registerCompiled = (filename, source, sourcemap) ->
|
||||
|
||||
sources[filename] ?= []
|
||||
sources[filename].push source
|
||||
|
||||
if sourcemap?
|
||||
sourceMaps[filename] ?= []
|
||||
sourceMaps[filename].push sourcemap
|
||||
|
||||
# Compile CoffeeScript code to JavaScript, using the Coffee/Jison compiler.
|
||||
#
|
||||
# If `options.sourceMap` is specified, then `options.filename` must also be
|
||||
# specified. All options that can be passed to `SourceMap#generate` may also
|
||||
# be passed here.
|
||||
#
|
||||
# This returns a javascript string, unless `options.sourceMap` is passed,
|
||||
# in which case this returns a `{js, v3SourceMap, sourceMap}`
|
||||
# object, where sourceMap is a sourcemap.coffee#SourceMap object, handy for
|
||||
# doing programmatic lookups.
|
||||
exports.compile = compile = withPrettyErrors (code, options = {}) ->
|
||||
# Clone `options`, to avoid mutating the `options` object passed in.
|
||||
options = Object.assign {}, options
|
||||
# Always generate a source map if no filename is passed in, since without a
|
||||
# a filename we have no way to retrieve this source later in the event that
|
||||
# we need to recompile it to get a source map for `prepareStackTrace`.
|
||||
generateSourceMap = options.sourceMap or options.inlineMap or not options.filename?
|
||||
filename = options.filename or '<anonymous>'
|
||||
|
||||
checkShebangLine filename, code
|
||||
|
||||
map = new SourceMap if generateSourceMap
|
||||
|
||||
tokens = lexer.tokenize code, options
|
||||
|
||||
# Pass a list of referenced variables, so that generated variables won’t get
|
||||
# the same name.
|
||||
options.referencedVars = (
|
||||
token[1] for token in tokens when token[0] is 'IDENTIFIER'
|
||||
)
|
||||
|
||||
# Check for import or export; if found, force bare mode.
|
||||
unless options.bare? and options.bare is yes
|
||||
for token in tokens
|
||||
if token[0] in ['IMPORT', 'EXPORT']
|
||||
options.bare = yes
|
||||
break
|
||||
|
||||
nodes = parser.parse tokens
|
||||
# If all that was requested was a POJO representation of the nodes, e.g.
|
||||
# the abstract syntax tree (AST), we can stop now and just return that
|
||||
# (after fixing the location data for the root/`File`»`Program` node,
|
||||
# which might’ve gotten misaligned from the original source due to the
|
||||
# `clean` function in the lexer).
|
||||
if options.ast
|
||||
nodes.allCommentTokens = helpers.extractAllCommentTokens tokens
|
||||
sourceCodeNumberOfLines = (code.match(/\r?\n/g) or '').length + 1
|
||||
sourceCodeLastLine = /.*$/.exec(code)[0] # `.*` matches all but line break characters.
|
||||
ast = nodes.ast options
|
||||
range = [0, code.length]
|
||||
ast.start = ast.program.start = range[0]
|
||||
ast.end = ast.program.end = range[1]
|
||||
ast.range = ast.program.range = range
|
||||
ast.loc.start = ast.program.loc.start = {line: 1, column: 0}
|
||||
ast.loc.end.line = ast.program.loc.end.line = sourceCodeNumberOfLines
|
||||
ast.loc.end.column = ast.program.loc.end.column = sourceCodeLastLine.length
|
||||
ast.tokens = tokens
|
||||
return ast
|
||||
|
||||
fragments = nodes.compileToFragments options
|
||||
|
||||
currentLine = 0
|
||||
currentLine += 1 if options.header
|
||||
currentLine += 1 if options.shiftLine
|
||||
currentColumn = 0
|
||||
js = ""
|
||||
for fragment in fragments
|
||||
# Update the sourcemap with data from each fragment.
|
||||
if generateSourceMap
|
||||
# Do not include empty, whitespace, or semicolon-only fragments.
|
||||
if fragment.locationData and not /^[;\s]*$/.test fragment.code
|
||||
map.add(
|
||||
[fragment.locationData.first_line, fragment.locationData.first_column]
|
||||
[currentLine, currentColumn]
|
||||
{noReplace: true})
|
||||
newLines = helpers.count fragment.code, "\n"
|
||||
currentLine += newLines
|
||||
if newLines
|
||||
currentColumn = fragment.code.length - (fragment.code.lastIndexOf("\n") + 1)
|
||||
else
|
||||
currentColumn += fragment.code.length
|
||||
|
||||
# Copy the code from each fragment into the final JavaScript.
|
||||
js += fragment.code
|
||||
|
||||
if options.header
|
||||
header = "Generated by CoffeeScript #{@VERSION}"
|
||||
js = "// #{header}\n#{js}"
|
||||
|
||||
if generateSourceMap
|
||||
v3SourceMap = map.generate options, code
|
||||
|
||||
if options.transpile
|
||||
if typeof options.transpile isnt 'object'
|
||||
# This only happens if run via the Node API and `transpile` is set to
|
||||
# something other than an object.
|
||||
throw new Error 'The transpile option must be given an object with options to pass to Babel'
|
||||
|
||||
# Get the reference to Babel that we have been passed if this compiler
|
||||
# is run via the CLI or Node API.
|
||||
transpiler = options.transpile.transpile
|
||||
delete options.transpile.transpile
|
||||
|
||||
transpilerOptions = Object.assign {}, options.transpile
|
||||
|
||||
# See https://github.com/babel/babel/issues/827#issuecomment-77573107:
|
||||
# Babel can take a v3 source map object as input in `inputSourceMap`
|
||||
# and it will return an *updated* v3 source map object in its output.
|
||||
if v3SourceMap and not transpilerOptions.inputSourceMap?
|
||||
transpilerOptions.inputSourceMap = v3SourceMap
|
||||
transpilerOutput = transpiler js, transpilerOptions
|
||||
js = transpilerOutput.code
|
||||
if v3SourceMap and transpilerOutput.map
|
||||
v3SourceMap = transpilerOutput.map
|
||||
|
||||
if options.inlineMap
|
||||
encoded = base64encode JSON.stringify v3SourceMap
|
||||
sourceMapDataURI = "//# sourceMappingURL=data:application/json;base64,#{encoded}"
|
||||
sourceURL = "//# sourceURL=#{options.filename ? 'coffeescript'}"
|
||||
js = "#{js}\n#{sourceMapDataURI}\n#{sourceURL}"
|
||||
|
||||
registerCompiled filename, code, map
|
||||
|
||||
if options.sourceMap
|
||||
{
|
||||
js
|
||||
sourceMap: map
|
||||
v3SourceMap: JSON.stringify v3SourceMap, null, 2
|
||||
}
|
||||
else
|
||||
js
|
||||
|
||||
# Tokenize a string of CoffeeScript code, and return the array of tokens.
|
||||
exports.tokens = withPrettyErrors (code, options) ->
|
||||
lexer.tokenize code, options
|
||||
|
||||
# Parse a string of CoffeeScript code or an array of lexed tokens, and
|
||||
# return the AST. You can then compile it by calling `.compile()` on the root,
|
||||
# or traverse it by using `.traverseChildren()` with a callback.
|
||||
exports.nodes = withPrettyErrors (source, options) ->
|
||||
source = lexer.tokenize source, options if typeof source is 'string'
|
||||
parser.parse source
|
||||
|
||||
# This file used to export these methods; leave stubs that throw warnings
|
||||
# instead. These methods have been moved into `index.coffee` to provide
|
||||
# separate entrypoints for Node and non-Node environments, so that static
|
||||
# analysis tools don’t choke on Node packages when compiling for a non-Node
|
||||
# environment.
|
||||
exports.run = exports.eval = exports.register = ->
|
||||
throw new Error 'require index.coffee, not this file'
|
||||
|
||||
# Instantiate a Lexer for our use here.
|
||||
lexer = new Lexer
|
||||
|
||||
# The real Lexer produces a generic stream of tokens. This object provides a
|
||||
# thin wrapper around it, compatible with the Jison API. We can then pass it
|
||||
# directly as a “Jison lexer.”
|
||||
parser.lexer =
|
||||
yylloc:
|
||||
range: []
|
||||
options:
|
||||
ranges: yes
|
||||
lex: ->
|
||||
token = parser.tokens[@pos++]
|
||||
if token
|
||||
[tag, @yytext, @yylloc] = token
|
||||
parser.errorToken = token.origin or token
|
||||
@yylineno = @yylloc.first_line
|
||||
else
|
||||
tag = ''
|
||||
tag
|
||||
setInput: (tokens) ->
|
||||
parser.tokens = tokens
|
||||
@pos = 0
|
||||
upcomingInput: -> ''
|
||||
|
||||
# Make all the AST nodes visible to the parser.
|
||||
parser.yy = require './nodes'
|
||||
|
||||
# Override Jison's default error handling function.
|
||||
parser.yy.parseError = (message, {token}) ->
|
||||
# Disregard Jison's message, it contains redundant line number information.
|
||||
# Disregard the token, we take its value directly from the lexer in case
|
||||
# the error is caused by a generated token which might refer to its origin.
|
||||
{errorToken, tokens} = parser
|
||||
[errorTag, errorText, errorLoc] = errorToken
|
||||
|
||||
errorText = switch
|
||||
when errorToken is tokens[tokens.length - 1]
|
||||
'end of input'
|
||||
when errorTag in ['INDENT', 'OUTDENT']
|
||||
'indentation'
|
||||
when errorTag in ['IDENTIFIER', 'NUMBER', 'INFINITY', 'STRING', 'STRING_START', 'REGEX', 'REGEX_START']
|
||||
errorTag.replace(/_START$/, '').toLowerCase()
|
||||
else
|
||||
helpers.nameWhitespaceCharacter errorText
|
||||
|
||||
# The second argument has a `loc` property, which should have the location
|
||||
# data for this token. Unfortunately, Jison seems to send an outdated `loc`
|
||||
# (from the previous token), so we take the location information directly
|
||||
# from the lexer.
|
||||
helpers.throwSyntaxError "unexpected #{errorText}", errorLoc
|
||||
|
||||
# Based on http://v8.googlecode.com/svn/branches/bleeding_edge/src/messages.js
|
||||
# Modified to handle sourceMap
|
||||
formatSourcePosition = (frame, getSourceMapping) ->
|
||||
filename = undefined
|
||||
fileLocation = ''
|
||||
|
||||
if frame.isNative()
|
||||
fileLocation = "native"
|
||||
else
|
||||
if frame.isEval()
|
||||
filename = frame.getScriptNameOrSourceURL()
|
||||
fileLocation = "#{frame.getEvalOrigin()}, " unless filename
|
||||
else
|
||||
filename = frame.getFileName()
|
||||
|
||||
filename or= "<anonymous>"
|
||||
|
||||
line = frame.getLineNumber()
|
||||
column = frame.getColumnNumber()
|
||||
|
||||
# Check for a sourceMap position
|
||||
source = getSourceMapping filename, line, column
|
||||
fileLocation =
|
||||
if source
|
||||
"#{filename}:#{source[0]}:#{source[1]}"
|
||||
else
|
||||
"#{filename}:#{line}:#{column}"
|
||||
|
||||
functionName = frame.getFunctionName()
|
||||
isConstructor = frame.isConstructor()
|
||||
isMethodCall = not (frame.isToplevel() or isConstructor)
|
||||
|
||||
if isMethodCall
|
||||
methodName = frame.getMethodName()
|
||||
typeName = frame.getTypeName()
|
||||
|
||||
if functionName
|
||||
tp = as = ''
|
||||
if typeName and functionName.indexOf typeName
|
||||
tp = "#{typeName}."
|
||||
if methodName and functionName.indexOf(".#{methodName}") isnt functionName.length - methodName.length - 1
|
||||
as = " [as #{methodName}]"
|
||||
|
||||
"#{tp}#{functionName}#{as} (#{fileLocation})"
|
||||
else
|
||||
"#{typeName}.#{methodName or '<anonymous>'} (#{fileLocation})"
|
||||
else if isConstructor
|
||||
"new #{functionName or '<anonymous>'} (#{fileLocation})"
|
||||
else if functionName
|
||||
"#{functionName} (#{fileLocation})"
|
||||
else
|
||||
fileLocation
|
||||
|
||||
getSourceMap = (filename, line, column) ->
|
||||
# Skip files that we didn’t compile, like Node system files that appear in
|
||||
# the stack trace, as they never have source maps.
|
||||
return null unless filename is '<anonymous>' or filename.slice(filename.lastIndexOf('.')) in FILE_EXTENSIONS
|
||||
|
||||
if filename isnt '<anonymous>' and sourceMaps[filename]?
|
||||
return sourceMaps[filename][sourceMaps[filename].length - 1]
|
||||
# CoffeeScript compiled in a browser or via `CoffeeScript.compile` or `.run`
|
||||
# may get compiled with `options.filename` that’s missing, which becomes
|
||||
# `<anonymous>`; but the runtime might request the stack trace with the
|
||||
# filename of the script file. See if we have a source map cached under
|
||||
# `<anonymous>` that matches the error.
|
||||
else if sourceMaps['<anonymous>']?
|
||||
# Work backwards from the most recent anonymous source maps, until we find
|
||||
# one that works. This isn’t foolproof; there is a chance that multiple
|
||||
# source maps will have line/column pairs that match. But we have no other
|
||||
# way to match them. `frame.getFunction().toString()` doesn’t always work,
|
||||
# and it’s not foolproof either.
|
||||
for map in sourceMaps['<anonymous>'] by -1
|
||||
sourceLocation = map.sourceLocation [line - 1, column - 1]
|
||||
return map if sourceLocation?[0]? and sourceLocation[1]?
|
||||
|
||||
# If all else fails, recompile this source to get a source map. We need the
|
||||
# previous section (for `<anonymous>`) despite this option, because after it
|
||||
# gets compiled we will still need to look it up from
|
||||
# `sourceMaps['<anonymous>']` in order to find and return it. That’s why we
|
||||
# start searching from the end in the previous block, because most of the
|
||||
# time the source map we want is the last one.
|
||||
if sources[filename]?
|
||||
answer = compile sources[filename][sources[filename].length - 1],
|
||||
filename: filename
|
||||
sourceMap: yes
|
||||
literate: helpers.isLiterate filename
|
||||
answer.sourceMap
|
||||
else
|
||||
null
|
||||
|
||||
# Based on [michaelficarra/CoffeeScriptRedux](http://goo.gl/ZTx1p)
|
||||
# NodeJS / V8 have no support for transforming positions in stack traces using
|
||||
# sourceMap, so we must monkey-patch Error to display CoffeeScript source
|
||||
# positions.
|
||||
Error.prepareStackTrace = (err, stack) ->
|
||||
getSourceMapping = (filename, line, column) ->
|
||||
sourceMap = getSourceMap filename, line, column
|
||||
answer = sourceMap.sourceLocation [line - 1, column - 1] if sourceMap?
|
||||
if answer? then [answer[0] + 1, answer[1] + 1] else null
|
||||
|
||||
frames = for frame in stack
|
||||
break if frame.getFunction() is exports.run
|
||||
" at #{formatSourcePosition frame, getSourceMapping}"
|
||||
|
||||
"#{err.toString()}\n#{frames.join '\n'}\n"
|
||||
|
||||
checkShebangLine = (file, input) ->
|
||||
firstLine = input.split(/$/m)[0]
|
||||
rest = firstLine?.match(/^#!\s*([^\s]+\s*)(.*)/)
|
||||
args = rest?[2]?.split(/\s/).filter (s) -> s isnt ''
|
||||
if args?.length > 1
|
||||
console.error '''
|
||||
The script to be run begins with a shebang line with more than one
|
||||
argument. This script will fail on platforms such as Linux which only
|
||||
allow a single argument.
|
||||
'''
|
||||
console.error "The shebang line was: '#{firstLine}' in file '#{file}'"
|
||||
console.error "The arguments were: #{JSON.stringify args}"
|
Loading…
x
Reference in New Issue
Block a user