| // Test ambigious export * statements. |
| |
| "use strict"; |
| |
| load(libdir + "asserts.js"); |
| load(libdir + "dummyModuleResolveHook.js"); |
| |
| function checkModuleEval(source, result) { |
| let m = parseModule(source); |
| m.declarationInstantiation(); |
| assertEq(m.evaluation(), result); |
| } |
| |
| function checkModuleSyntaxError(source) { |
| let m = parseModule(source); |
| assertThrowsInstanceOf(() => m.declarationInstantiation(), SyntaxError); |
| } |
| |
| let a = moduleRepo['a'] = parseModule("export var a = 1; export var b = 2;"); |
| let b = moduleRepo['b'] = parseModule("export var b = 3; export var c = 4;"); |
| let c = moduleRepo['c'] = parseModule("export * from 'a'; export * from 'b';"); |
| c.declarationInstantiation(); |
| c.evaluation(); |
| |
| // Check importing/exporting non-ambiguous name works. |
| checkModuleEval("import { a } from 'c'; a;", 1); |
| checkModuleEval("export { a } from 'c';", undefined); |
| |
| // Check importing/exporting ambiguous name is a syntax error. |
| checkModuleSyntaxError("import { b } from 'c';"); |
| checkModuleSyntaxError("export { b } from 'c';"); |
| |
| // Check that namespace objects include only non-ambiguous names. |
| let m = parseModule("import * as ns from 'c'; ns;"); |
| m.declarationInstantiation(); |
| let ns = m.evaluation(); |
| let names = Object.keys(ns); |
| assertEq(names.length, 2); |
| assertEq('a' in ns, true); |
| assertEq('b' in ns, false); |
| assertEq('c' in ns, true); |