From dff098e77b67954ca0fbb6ed803561ebf09358cf Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 15 Sep 2015 06:31:51 +0100 Subject: [PATCH] rename errorWithNode to buildCodeFrameError and when erroring on dynamic nodes try and estimate a location --- .../src/transformation/file/index.js | 30 +++++++++++++++---- .../src/transformation/helpers/define-map.js | 2 +- .../src/transformation/modules/_default.js | 4 +-- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index acf1c82fb6..d0b2507e19 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -20,6 +20,15 @@ import * as util from "../../util"; import path from "path"; import * as t from "babel-types"; +var errorVisitor = { + enter(path, state) { + var loc = path.node.loc; + if (loc) { + state.loc = loc; + path.stop(); + } + } +}; export default class File { constructor(opts = {}, pipeline) { this.pipeline = pipeline; @@ -383,17 +392,26 @@ export default class File { return uid; } - errorWithNode(node, msg, Error = SyntaxError) { - var err; + buildCodeFrameError(node, msg, Error = SyntaxError) { var loc = node && (node.loc || node._loc); + + var err = new Error(msg); + if (loc) { - err = new Error(`Line ${loc.start.line}: ${msg}`); err.loc = loc.start; } else { - // todo: find errors with nodes inside to at least point to something - err = new Error("There's been an error on a dynamic node. This is almost certainly an internal error. Please report it."); + traverse(node, errorVisitor, err); + + err.message += " (This is an error on an internal node. Probably an internal error"; + + if (err.loc) { + err.message += ". Location has been estimated."; + } + + err.message += ")"; } - return err; + + return err } mergeSourceMap(map: Object) { diff --git a/packages/babel-core/src/transformation/helpers/define-map.js b/packages/babel-core/src/transformation/helpers/define-map.js index ab7325b897..7f8ae70c93 100644 --- a/packages/babel-core/src/transformation/helpers/define-map.js +++ b/packages/babel-core/src/transformation/helpers/define-map.js @@ -28,7 +28,7 @@ export function push(mutatorMap, node, kind, file) { } if (map.value || map.initializer) { - throw file.errorWithNode(node, "Key conflict with sibling node"); + throw file.buildCodeFrameError(node, "Key conflict with sibling node"); } if (node.value) { diff --git a/packages/babel-core/src/transformation/modules/_default.js b/packages/babel-core/src/transformation/modules/_default.js index 8968597181..73535a5d0e 100644 --- a/packages/babel-core/src/transformation/modules/_default.js +++ b/packages/babel-core/src/transformation/modules/_default.js @@ -37,7 +37,7 @@ export default class DefaultFormatter { var existingScope = this.sourceScopes[source]; if (existingScope && existingScope !== path.scope) { - throw path.errorWithNode(messages.get("modulesDuplicateDeclarations")); + throw path.buildCodeFrameError(messages.get("modulesDuplicateDeclarations")); } this.sourceScopes[source] = path.scope; @@ -180,7 +180,7 @@ export default class DefaultFormatter { checkExportIdentifier(node) { if (t.isIdentifier(node, { name: "__esModule" })) { - throw this.file.errorWithNode(node, messages.get("modulesIllegalExportName", node.name)); + throw this.file.buildCodeFrameError(node, messages.get("modulesIllegalExportName", node.name)); } }