diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 9f9d78667336..7ba6793be3c7 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -128,15 +128,17 @@ const collectorVisitor = { BlockScoped(path) { let scope = path.scope; if (scope.path === path) scope = scope.parent; - scope.getBlockParent().registerDeclaration(path); - }, - ClassDeclaration(path) { - const id = path.node.id; - if (!id) return; + const parent = scope.getBlockParent(); + parent.registerDeclaration(path); + + // Register class identifier in class' scope if this is a class declaration. + if (path.isClassDeclaration() && path.node.id) { + const id = path.node.id; + const name = id.name; - const name = id.name; - path.scope.bindings[name] = path.scope.getBinding(name); + path.scope.bindings[name] = path.scope.parent.getBinding(name); + } }, Block(path) { diff --git a/packages/babel-traverse/test/scope.js b/packages/babel-traverse/test/scope.js index b796dbf682f5..d4115b1c9e86 100644 --- a/packages/babel-traverse/test/scope.js +++ b/packages/babel-traverse/test/scope.js @@ -289,6 +289,20 @@ describe("scope", () => { column: 32, }); }); + + it("class identifier available in class scope after crawl", function() { + const path = getPath("class a { build() { return new a(); } }"); + + path.scope.crawl(); + + let referencePaths = path.scope.bindings.a.referencePaths; + expect(referencePaths).toHaveLength(1); + + referencePaths = path.get("body[0]").scope.bindings.a.referencePaths; + expect(referencePaths).toHaveLength(1); + + expect(path.scope.bindings.a).toBe(path.get("body[0]").scope.bindings.a); + }); }); describe("duplicate bindings", () => {