From a5a63e3033060f9454bfbafbb03fd0945e6dc1c2 Mon Sep 17 00:00:00 2001 From: Colin Wang Date: Wed, 7 Jul 2021 01:18:12 +0800 Subject: [PATCH] fix: accept duplicated import/variable in different module (#13527) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Huáng Jùnliàng --- packages/babel-traverse/src/scope/index.ts | 10 ++++++++++ .../input.js | 18 ++++++++++++++++++ .../options.json | 3 +++ .../output.js | 16 ++++++++++++++++ .../input.ts | 16 ++++++++++++++++ .../options.json | 4 ++++ .../output.mjs | 15 +++++++++++++++ 7 files changed, 82 insertions(+) create mode 100644 packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/input.js create mode 100644 packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/options.json create mode 100644 packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/output.js create mode 100644 packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/input.ts create mode 100644 packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/options.json create mode 100644 packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/output.mjs diff --git a/packages/babel-traverse/src/scope/index.ts b/packages/babel-traverse/src/scope/index.ts index 98c7bc6a38..c77a0b3e8a 100644 --- a/packages/babel-traverse/src/scope/index.ts +++ b/packages/babel-traverse/src/scope/index.ts @@ -202,6 +202,9 @@ const collectorVisitor: Visitor = { // delegate block scope handling to the `BlockScoped` method if (path.isBlockScoped()) return; + // delegate import handing to the `ImportDeclaration` method + if (path.isImportDeclaration()) return; + // this will be hit again once we traverse into it after this iteration if (path.isExportDeclaration()) return; @@ -211,6 +214,13 @@ const collectorVisitor: Visitor = { parent.registerDeclaration(path); }, + ImportDeclaration(path) { + // import may only appear in the top level or inside a module/namespace (for TS/flow) + const parent = path.scope.getBlockParent(); + + parent.registerDeclaration(path); + }, + ReferencedIdentifier(path, state) { state.references.push(path); }, diff --git a/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/input.js b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/input.js new file mode 100644 index 0000000000..2b62c754ba --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/input.js @@ -0,0 +1,18 @@ +// @flow + +type T = string; +declare module 'test' { + import type { JSONSchema7 } from 'json-schema'; + declare var a: number; + declare function foo(a: JSONSchema7): string; + declare export function concatPath(dirA: string, dirB: T): string; + declare export class A {} +} + +declare module 'test/submodule' { + import type { JSONSchema7 } from 'json-schema'; + declare var a: number; + declare function foo(a: JSONSchema7): string; + declare export function concatPath(dirA: string, dirB: string): string; + declare export class A {} +} diff --git a/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/options.json b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/options.json new file mode 100644 index 0000000000..68e1a85e7d --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["syntax-flow"] +} diff --git a/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/output.js b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/output.js new file mode 100644 index 0000000000..2c53a4cc67 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-flow/output.js @@ -0,0 +1,16 @@ +// @flow +type T = string; +declare module 'test' { + import type { JSONSchema7 } from 'json-schema'; + declare var a: number; + declare function foo(a: JSONSchema7): string; + declare export function concatPath(dirA: string, dirB: T): string; + declare export class A {} +} +declare module 'test/submodule' { + import type { JSONSchema7 } from 'json-schema'; + declare var a: number; + declare function foo(a: JSONSchema7): string; + declare export function concatPath(dirA: string, dirB: string): string; + declare export class A {} +} diff --git a/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/input.ts b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/input.ts new file mode 100644 index 0000000000..c592c6cb3e --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/input.ts @@ -0,0 +1,16 @@ +type T = number; +declare module 'test' { + import type { JSONSchema7 } from 'json-schema'; + import { bar } from "baz"; + export { fooBar } from "baz"; + let foo: JSONSchema7; + // can reference type outsider module + let baz: T; +} + +declare module 'test/submodule' { + import type { JSONSchema7 } from 'json-schema'; + import { bar } from "baz"; + export { fooBar } from "baz"; + let foo: JSONSchema7; +} diff --git a/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/options.json b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/options.json new file mode 100644 index 0000000000..2e01a44685 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["syntax-typescript"], + "sourceType": "module" +} diff --git a/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/output.mjs b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/output.mjs new file mode 100644 index 0000000000..ef3bc38db9 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/regression/duplicate-variable-in-different-module-ts/output.mjs @@ -0,0 +1,15 @@ +type T = number; +declare module 'test' { + import type { JSONSchema7 } from 'json-schema'; + import { bar } from "baz"; + export { fooBar } from "baz"; + let foo: JSONSchema7; // can reference type outsider module + + let baz: T; +} +declare module 'test/submodule' { + import type { JSONSchema7 } from 'json-schema'; + import { bar } from "baz"; + export { fooBar } from "baz"; + let foo: JSONSchema7; +}