From 78dd051449f5e72c5bd2b923d442ba7534b9f142 Mon Sep 17 00:00:00 2001 From: Yongxu Ren Date: Tue, 27 Dec 2016 11:52:51 -0500 Subject: [PATCH] Rewrite Hub as interface #5047 --- .../babel-core/src/transformation/file/index.js | 14 +++++++++++++- .../src/index.js | 3 ++- packages/babel-traverse/src/hub.js | 11 ++++++----- packages/babel-traverse/src/index.js | 4 ++-- packages/babel-traverse/src/path/index.js | 8 ++------ packages/babel-traverse/src/path/introspection.js | 7 ++++++- packages/babel-traverse/src/scope/index.js | 11 +++++++---- 7 files changed, 38 insertions(+), 20 deletions(-) diff --git a/packages/babel-core/src/transformation/file/index.js b/packages/babel-core/src/transformation/file/index.js index 01d5b7efc9d3..c5bb4d2beb32 100644 --- a/packages/babel-core/src/transformation/file/index.js +++ b/packages/babel-core/src/transformation/file/index.js @@ -99,7 +99,19 @@ export default class File extends Store { this.code = ""; this.shebang = ""; - this.hub = new Hub(this); + this.hub = { + mark: (type: string, message: string, loc: Object) => { + this.metadata.marked.push({ + type, + message, + loc + }); + }, + addHelper: this.addHelper.bind(this), + getCode: () => this.code, + getScope: () => this.scope, + buildError: this.buildCodeFrameError.bind(this) + }; } static helpers: Array; diff --git a/packages/babel-plugin-transform-react-jsx-source/src/index.js b/packages/babel-plugin-transform-react-jsx-source/src/index.js index cd296af979a0..7abad76c1f93 100644 --- a/packages/babel-plugin-transform-react-jsx-source/src/index.js +++ b/packages/babel-plugin-transform-react-jsx-source/src/index.js @@ -50,7 +50,8 @@ export default function ({ types: t }) { : null; const fileNameIdentifier = path.scope.generateUidIdentifier(FILE_NAME_VAR); - path.hub.file.scope.push({id: fileNameIdentifier, init: t.stringLiteral(fileName)}); + const scope = path.hub.getScope(); + scope && scope.push({id: fileNameIdentifier, init: t.stringLiteral(fileName)}); state.fileNameIdentifier = fileNameIdentifier; } diff --git a/packages/babel-traverse/src/hub.js b/packages/babel-traverse/src/hub.js index f05eaa813680..2992ac2c31ef 100644 --- a/packages/babel-traverse/src/hub.js +++ b/packages/babel-traverse/src/hub.js @@ -1,6 +1,7 @@ -export default class Hub { - constructor(file, options) { - this.file = file; - this.options = options; - } +export type Hub = { + mark: (type: string, message: string) => void; + addHelper: (name: string) => Object; + getScope: () => Object; + getCode: () => string; + buildError:(node: Object, msg: string, Error: Error) => Error; } diff --git a/packages/babel-traverse/src/index.js b/packages/babel-traverse/src/index.js index 6a3d4660a4b7..14119ee2ba4e 100644 --- a/packages/babel-traverse/src/index.js +++ b/packages/babel-traverse/src/index.js @@ -9,7 +9,8 @@ import * as cache from "./cache"; export { default as NodePath } from "./path"; export { default as Scope } from "./scope"; -export { default as Hub } from "./hub"; +import type Hub from "./hub"; +export type { Hub }; export { visitors }; export default function traverse( @@ -39,7 +40,6 @@ traverse.explode = visitors.explode; traverse.NodePath = require("./path"); traverse.Scope = require("./scope"); -traverse.Hub = require("./hub"); traverse.cheap = function (node, enter) { return t.traverseFast(node, enter); diff --git a/packages/babel-traverse/src/path/index.js b/packages/babel-traverse/src/path/index.js index 1b5b58919018..2ac183d46254 100644 --- a/packages/babel-traverse/src/path/index.js +++ b/packages/babel-traverse/src/path/index.js @@ -116,7 +116,7 @@ export default class NodePath { } buildCodeFrameError(msg: string, Error: typeof Error = SyntaxError): Error { - return this.hub.file.buildCodeFrameError(this.node, msg, Error); + return this.hub.buildError(this.node, msg, Error); } traverse(visitor: Object, state?: any) { @@ -124,11 +124,7 @@ export default class NodePath { } mark(type: string, message: string) { - this.hub.file.metadata.marked.push({ - type, - message, - loc: this.node.loc - }); + this.hub.mark && this.hub.mark(type, message, this.node.loc); } set(key: string, node: Object) { diff --git a/packages/babel-traverse/src/path/introspection.js b/packages/babel-traverse/src/path/introspection.js index be7a2755c537..25db388ebb4b 100644 --- a/packages/babel-traverse/src/path/introspection.js +++ b/packages/babel-traverse/src/path/introspection.js @@ -235,7 +235,12 @@ export function referencesImport(moduleSource, importName) { export function getSource() { let node = this.node; if (node.end) { - return this.hub.file.code.slice(node.start, node.end); + const code = this.hub.getCode(); + if (code) { + return code.slice(node.start, node.end); + } else { + return ""; + } } else { return ""; } diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 83e80df926a8..333346f0e810 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -350,7 +350,11 @@ export default class Scope { if (!duplicate) duplicate = local.kind === "param" && (kind === "let" || kind === "const"); if (duplicate) { - throw this.hub.file.buildCodeFrameError(id, messages.get("scopeDuplicateDeclaration", name), TypeError); + if (this.hub.buildError) { + throw this.hub.buildError(id, messages.get("scopeDuplicateDeclaration", name), TypeError); + } else { + throw new TypeError(messages.get("scopeDuplicateDeclaration", name)); + } } } @@ -389,7 +393,6 @@ export default class Scope { } toArray(node: Object, i?: number) { - let file = this.hub.file; if (t.isIdentifier(node)) { let binding = this.getBinding(node.name); @@ -423,9 +426,9 @@ export default class Scope { } else if (i) { args.push(t.numericLiteral(i)); helperName = "slicedToArray"; - // TODO if (this.hub.file.isLoose("es6.forOf")) helperName += "-loose"; + // TODO if (this.hub.isLoose("es6.forOf")) helperName += "-loose"; } - return t.callExpression(file.addHelper(helperName), args); + return t.callExpression(this.hub.addHelper(helperName), args); } hasLabel(name: string) {