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; +}