From 0e5f8b6e56249b600715827c968d4ad4f1e0257a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 11 Aug 2017 19:03:55 -0400 Subject: [PATCH] deshadow indirectly-imported namespaces (#1488) --- src/ast/scopes/ModuleScope.js | 12 +++++++++++- .../samples/deshadowed-namespaced-import/_config.js | 3 +++ .../samples/deshadowed-namespaced-import/foo.js | 2 ++ .../samples/deshadowed-namespaced-import/main.js | 10 ++++++++++ .../samples/deshadowed-namespaced-import/ns.js | 3 +++ 5 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/function/samples/deshadowed-namespaced-import/_config.js create mode 100644 test/function/samples/deshadowed-namespaced-import/foo.js create mode 100644 test/function/samples/deshadowed-namespaced-import/main.js create mode 100644 test/function/samples/deshadowed-namespaced-import/ns.js diff --git a/src/ast/scopes/ModuleScope.js b/src/ast/scopes/ModuleScope.js index 1da09aae483..ec9b1c157b8 100644 --- a/src/ast/scopes/ModuleScope.js +++ b/src/ast/scopes/ModuleScope.js @@ -20,8 +20,18 @@ export default class ModuleScope extends Scope { forOwn( this.module.imports, specifier => { if ( specifier.module.isExternal ) return; + const addDeclaration = declaration => { + if ( declaration.isNamespace ) { + declaration.module.getExports().forEach( name => { + addDeclaration( declaration.module.traceExport(name) ); + }); + } + + names.add( declaration.name ); + }; + specifier.module.getExports().forEach( name => { - names.add( specifier.module.traceExport(name).name ); + addDeclaration( specifier.module.traceExport(name) ); }); if ( specifier.name !== '*' ) { diff --git a/test/function/samples/deshadowed-namespaced-import/_config.js b/test/function/samples/deshadowed-namespaced-import/_config.js new file mode 100644 index 00000000000..caf19b703cc --- /dev/null +++ b/test/function/samples/deshadowed-namespaced-import/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: '#1488' +}; \ No newline at end of file diff --git a/test/function/samples/deshadowed-namespaced-import/foo.js b/test/function/samples/deshadowed-namespaced-import/foo.js new file mode 100644 index 00000000000..ab9d11e7d27 --- /dev/null +++ b/test/function/samples/deshadowed-namespaced-import/foo.js @@ -0,0 +1,2 @@ +import * as ns from './ns.js'; +export { ns }; \ No newline at end of file diff --git a/test/function/samples/deshadowed-namespaced-import/main.js b/test/function/samples/deshadowed-namespaced-import/main.js new file mode 100644 index 00000000000..3178bf05289 --- /dev/null +++ b/test/function/samples/deshadowed-namespaced-import/main.js @@ -0,0 +1,10 @@ +import { ns } from './foo.js'; + +assert.equal((() => { + function foo() { + return ns.foo(); + } + + return foo(); +})(), 42); + diff --git a/test/function/samples/deshadowed-namespaced-import/ns.js b/test/function/samples/deshadowed-namespaced-import/ns.js new file mode 100644 index 00000000000..19ae356d4ec --- /dev/null +++ b/test/function/samples/deshadowed-namespaced-import/ns.js @@ -0,0 +1,3 @@ +export function foo() { + return 42; +} \ No newline at end of file