From 804969cc43c6a5add34b65b3878ef4c90cb5bd4c Mon Sep 17 00:00:00 2001 From: Erlend Tobiassen Date: Thu, 19 Dec 2019 21:49:33 +0100 Subject: [PATCH 1/6] Bug replication test --- packages/babel-traverse/test/scope.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/babel-traverse/test/scope.js b/packages/babel-traverse/test/scope.js index aa7c0dba2752..9c5b901d826f 100644 --- a/packages/babel-traverse/test/scope.js +++ b/packages/babel-traverse/test/scope.js @@ -270,6 +270,13 @@ describe("scope", () => { column: 32, }); }); + + it("reference paths after crawl", function() { + const path = getPath("class a { build() { return new a(); } }; a;"); + path.scope.crawl(); + const referencePaths = path.scope.bindings.a.referencePaths; + expect(referencePaths).toHaveLength(2); + }); }); describe("duplicate bindings", () => { From 48a779066134b348a32a1a00f17fc4272117719f Mon Sep 17 00:00:00 2001 From: Erlend Tobiassen Date: Thu, 19 Dec 2019 22:34:27 +0100 Subject: [PATCH 2/6] Simplify test --- packages/babel-traverse/test/scope.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/babel-traverse/test/scope.js b/packages/babel-traverse/test/scope.js index 9c5b901d826f..3cccb0a8fa63 100644 --- a/packages/babel-traverse/test/scope.js +++ b/packages/babel-traverse/test/scope.js @@ -272,10 +272,10 @@ describe("scope", () => { }); it("reference paths after crawl", function() { - const path = getPath("class a { build() { return new a(); } }; a;"); + const path = getPath("class a { build() { return new a(); } }"); path.scope.crawl(); const referencePaths = path.scope.bindings.a.referencePaths; - expect(referencePaths).toHaveLength(2); + expect(referencePaths).toHaveLength(1); }); }); From 5c0b0ac93932d3d956831298c0a06761d61ccb97 Mon Sep 17 00:00:00 2001 From: Erlend Tobiassen Date: Tue, 14 Jan 2020 22:56:07 +0100 Subject: [PATCH 3/6] Fixes #10896 --- packages/babel-traverse/src/scope/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 9f9d78667336..1ec8e1d25a16 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -136,7 +136,7 @@ const collectorVisitor = { if (!id) return; const name = id.name; - path.scope.bindings[name] = path.scope.getBinding(name); + path.scope.bindings[name] = path.scope.parent.getBinding(name); }, Block(path) { From 63a12f2b2ca178a0f65a994cfcd4b657bfcdf6f3 Mon Sep 17 00:00:00 2001 From: Erlend Tobiassen Date: Wed, 15 Jan 2020 10:12:52 +0100 Subject: [PATCH 4/6] Merge path.crawl `ClassDeclaration` and `Declaration` visitors Merged to avoid subtle assumption that `Declaration` is called before `ClassDeclaration` --- packages/babel-traverse/src/scope/index.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 1ec8e1d25a16..e0c4bf4f7f37 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -72,6 +72,14 @@ const collectorVisitor = { const parent = path.scope.getFunctionParent() || path.scope.getProgramParent(); 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; + + path.scope.bindings[name] = parent.getBinding(name); + } }, ReferencedIdentifier(path, state) { @@ -131,14 +139,6 @@ const collectorVisitor = { scope.getBlockParent().registerDeclaration(path); }, - ClassDeclaration(path) { - const id = path.node.id; - if (!id) return; - - const name = id.name; - path.scope.bindings[name] = path.scope.parent.getBinding(name); - }, - Block(path) { const paths = path.get("body"); for (const bodyPath of (paths: Array)) { From 92b41926135c5bb38280ad1937782d4756a98fb5 Mon Sep 17 00:00:00 2001 From: Erlend Tobiassen Date: Sat, 18 Jan 2020 19:35:26 +0100 Subject: [PATCH 5/6] Move registartion of class id in crawl to BlockScoped --- packages/babel-traverse/src/scope/index.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index e0c4bf4f7f37..7ba6793be3c7 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -72,14 +72,6 @@ const collectorVisitor = { const parent = path.scope.getFunctionParent() || path.scope.getProgramParent(); 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; - - path.scope.bindings[name] = parent.getBinding(name); - } }, ReferencedIdentifier(path, state) { @@ -136,7 +128,17 @@ const collectorVisitor = { BlockScoped(path) { let scope = path.scope; if (scope.path === path) scope = scope.parent; - scope.getBlockParent().registerDeclaration(path); + + 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; + + path.scope.bindings[name] = path.scope.parent.getBinding(name); + } }, Block(path) { From 725e959b6cb26a904a9e74fb5c510fe6d7ceb823 Mon Sep 17 00:00:00 2001 From: Erlend Tobiassen Date: Sat, 18 Jan 2020 21:31:07 +0100 Subject: [PATCH 6/6] Add some assertions to crawl test --- packages/babel-traverse/test/scope.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/babel-traverse/test/scope.js b/packages/babel-traverse/test/scope.js index 716ad57f52c9..d4115b1c9e86 100644 --- a/packages/babel-traverse/test/scope.js +++ b/packages/babel-traverse/test/scope.js @@ -290,11 +290,18 @@ describe("scope", () => { }); }); - it("reference paths after crawl", function() { + it("class identifier available in class scope after crawl", function() { const path = getPath("class a { build() { return new a(); } }"); + path.scope.crawl(); - const referencePaths = path.scope.bindings.a.referencePaths; + + 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); }); });