From 5b9ebd19d5f81e1e4ee0decdb73d73701f9374ea Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Sun, 7 Mar 2010 22:08:24 -0500 Subject: [PATCH] adding source file information to all coffeescript compiles --- lib/coffee-script.js | 13 ++++++++++--- lib/command.js | 15 +++++++++------ src/coffee-script.coffee | 12 ++++++++---- src/command.coffee | 10 ++++++---- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/lib/coffee-script.js b/lib/coffee-script.js index 4d420380..5e7b2554 100644 --- a/lib/coffee-script.js +++ b/lib/coffee-script.js @@ -22,7 +22,14 @@ // Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison // compiler. exports.compile = function compile(code, options) { - return (parser.parse(lexer.tokenize(code))).compile(options); + try { + return (parser.parse(lexer.tokenize(code))).compile(options); + } catch (err) { + if (options.source) { + err.message = "In " + (options.source) + ", " + (err.message); + } + throw err; + } }; // Tokenize a string of CoffeeScript code, and return the array of tokens. exports.tokens = function tokens(code) { @@ -38,9 +45,9 @@ // setting `__filename`, `__dirname`, and relative `require()`. exports.run = function run(code, source, options) { var __dirname, __filename; - __filename = source; + options = options || {}; + module.filename = (__filename = (options.source = source)); __dirname = path.dirname(source); - module.filename = source; return eval(exports.compile(code, options)); }; // The real Lexer produces a generic stream of tokens. This object provides a diff --git a/lib/command.js b/lib/command.js index cacd0c42..56a0ac29 100644 --- a/lib/command.js +++ b/lib/command.js @@ -90,7 +90,7 @@ } else if (o.run) { return CoffeeScript.run(code, source, compile_options()); } else { - js = CoffeeScript.compile(code, compile_options()); + js = CoffeeScript.compile(code, compile_options(source)); if (o.compile) { return write_js(source, js); } else if (o.lint) { @@ -119,7 +119,7 @@ } }); return process.stdio.addListener('close', function() { - return process.stdio.write(CoffeeScript.compile(code, compile_options())); + return process.stdio.write(CoffeeScript.compile(code, compile_options('stdio'))); }); }; // Watch a list of source CoffeeScript files using `fs.watchFile`, recompiling @@ -203,10 +203,13 @@ return sources = options.arguments.slice(2, options.arguments.length); }; // The compile-time options to pass to the CoffeeScript compiler. - compile_options = function compile_options() { - return options['no-wrap'] ? { - no_wrap: true - } : {}; + compile_options = function compile_options(source) { + var o; + o = { + source: source + }; + o['no-wrap'] = options['no-wrap']; + return o; }; // Print the `--help` usage message and exit. usage = function usage() { diff --git a/src/coffee-script.coffee b/src/coffee-script.coffee index eede926f..62d274d8 100644 --- a/src/coffee-script.coffee +++ b/src/coffee-script.coffee @@ -23,7 +23,11 @@ exports.VERSION: '0.5.4' # Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison # compiler. exports.compile: (code, options) -> - (parser.parse lexer.tokenize code).compile options + try + (parser.parse lexer.tokenize code).compile options + catch err + err.message: "In ${options.source}, ${err.message}" if options.source + throw err # Tokenize a string of CoffeeScript code, and return the array of tokens. exports.tokens: (code) -> @@ -38,9 +42,9 @@ exports.nodes: (code) -> # Compile and execute a string of CoffeeScript (on the server), correctly # setting `__filename`, `__dirname`, and relative `require()`. exports.run: (code, source, options) -> - __filename: source - __dirname: path.dirname source - module.filename: source + options ||= {} + module.filename: __filename: options.source: source + __dirname: path.dirname source eval exports.compile code, options # The real Lexer produces a generic stream of tokens. This object provides a diff --git a/src/command.coffee b/src/command.coffee index e439e7bd..60bf0b42 100644 --- a/src/command.coffee +++ b/src/command.coffee @@ -80,7 +80,7 @@ compile_script: (source, code) -> else if o.nodes then puts CoffeeScript.nodes(code).toString() else if o.run then CoffeeScript.run code, source, compile_options() else - js: CoffeeScript.compile code, compile_options() + js: CoffeeScript.compile code, compile_options(source) if o.compile then write_js source, js else if o.lint then lint js else if o.print or o.eval then print js @@ -95,7 +95,7 @@ compile_stdio: -> process.stdio.addListener 'data', (string) -> code += string if string process.stdio.addListener 'close', -> - process.stdio.write CoffeeScript.compile code, compile_options() + process.stdio.write CoffeeScript.compile code, compile_options('stdio') # Watch a list of source CoffeeScript files using `fs.watchFile`, recompiling # them every time the files are updated. May be used in combination with other @@ -143,8 +143,10 @@ parse_options: -> sources: options.arguments[2...options.arguments.length] # The compile-time options to pass to the CoffeeScript compiler. -compile_options: -> - if options['no-wrap'] then {no_wrap: true} else {} +compile_options: (source) -> + o: {source: source} + o['no-wrap']: options['no-wrap'] + o # Print the `--help` usage message and exit. usage: ->