From 01356191d48a27a4cc75505c095cd18c6b578f60 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Fri, 13 Nov 2015 16:55:54 -0800 Subject: [PATCH] avoid revisiting classes - #2694 --- .../src/index.js | 10 ++++++- .../test/fixtures/regression/2694/actual.js | 8 +++++ .../test/fixtures/regression/2694/expected.js | 29 +++++++++++++++++++ .../fixtures/regression/2694/options.json | 4 +++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/actual.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/expected.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/options.json diff --git a/packages/babel-plugin-transform-es2015-classes/src/index.js b/packages/babel-plugin-transform-es2015-classes/src/index.js index 9dc92babbb..bc7dff95eb 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/index.js +++ b/packages/babel-plugin-transform-es2015-classes/src/index.js @@ -3,6 +3,9 @@ import VanillaTransformer from "./vanilla"; import nameFunction from "babel-helper-function-name"; export default function ({ types: t }) { + // todo: investigate traversal requeueing + let VISITED = Symbol(); + return { visitor: { ClassDeclaration(path) { @@ -21,8 +24,13 @@ export default function ({ types: t }) { }, ClassExpression(path, state) { + let { node } = path; + if (node[VISITED]) return; + let inferred = nameFunction(path); - if (inferred && inferred !== path.node) return path.replaceWith(inferred); + if (inferred && inferred !== node) return path.replaceWith(inferred); + + node[VISITED] = true; let Constructor = VanillaTransformer; if (state.opts.loose) Constructor = LooseTransformer; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/actual.js new file mode 100644 index 0000000000..3098dd77c3 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/actual.js @@ -0,0 +1,8 @@ +import BaseFoo from './BaseFoo'; + +export default class SubFoo extends BaseFoo { + static talk() { + super.talk(); + console.log('SubFoo.talk'); + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/expected.js new file mode 100644 index 0000000000..4bcd62d51c --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/expected.js @@ -0,0 +1,29 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _BaseFoo2 = require('./BaseFoo'); + +var _BaseFoo3 = babelHelpers.interopRequireDefault(_BaseFoo2); + +var SubFoo = (function (_BaseFoo) { + babelHelpers.inherits(SubFoo, _BaseFoo); + + function SubFoo() { + babelHelpers.classCallCheck(this, SubFoo); + return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(SubFoo).apply(this, arguments)); + } + + babelHelpers.createClass(SubFoo, null, [{ + key: 'talk', + value: function talk() { + babelHelpers.get(Object.getPrototypeOf(SubFoo), 'talk', this).call(this); + console.log('SubFoo.talk'); + } + }]); + return SubFoo; +})(_BaseFoo3.default); + +exports.default = SubFoo; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/options.json b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/options.json new file mode 100644 index 0000000000..4713c96921 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/2694/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["external-helpers-2"], + "presets": ["es2015"] +}