Skip to content

Commit 3a23ba8

Browse files
committed
fix #1140
1 parent 94581f0 commit 3a23ba8

11 files changed

+141
-24
lines changed

src/compiler.ts

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ import {
8585
PropertyPrototype,
8686
IndexSignature,
8787
File,
88-
mangleInternalName
88+
mangleInternalName,
89+
Namespace
8990
} from "./program";
9091

9192
import {
@@ -724,7 +725,6 @@ export class Compiler extends DiagnosticEmitter {
724725
// just traverse members below
725726
case ElementKind.ENUM:
726727
case ElementKind.NAMESPACE:
727-
case ElementKind.FILE:
728728
case ElementKind.TYPEDEFINITION:
729729
case ElementKind.INDEXSIGNATURE: break;
730730

@@ -738,22 +738,24 @@ export class Compiler extends DiagnosticEmitter {
738738
? INSTANCE_DELIMITER
739739
: STATIC_DELIMITER
740740
);
741-
if (
742-
element.kind == ElementKind.NAMESPACE ||
743-
element.kind == ElementKind.FILE
744-
) {
745-
// for (let member of members.values()) {
746-
for (let _values = Map_values(members), i = 0, k = _values.length; i < k; ++i) {
747-
let member = unchecked(_values[i]);
748-
if (!member.is(CommonFlags.EXPORT)) continue;
749-
this.ensureModuleExport(member.name, member, subPrefix);
741+
if (element.kind == ElementKind.NAMESPACE) {
742+
let implicitExport = element.is(CommonFlags.SCOPED);
743+
// for (let [memberName, member] of members) {
744+
for (let _keys = Map_keys(members), i = 0, k = _keys.length; i < k; ++i) {
745+
let memberName = unchecked(_keys[i]);
746+
let member = assert(members.get(memberName));
747+
if (implicitExport || member.is(CommonFlags.EXPORT)) {
748+
this.ensureModuleExport(memberName, member, subPrefix);
749+
}
750750
}
751751
} else {
752-
// for (let member of members.values()) {
753-
for (let _values = Map_values(members), i = 0, k = _values.length; i < k; ++i) {
754-
let member = unchecked(_values[i]);
755-
if (member.is(CommonFlags.PRIVATE)) continue;
756-
this.ensureModuleExport(member.name, member, subPrefix);
752+
// for (let [memberName, member] of members) {
753+
for (let _keys = Map_keys(members), i = 0, k = _keys.length; i < k; ++i) {
754+
let memberName = unchecked(_keys[i]);
755+
let member = assert(members.get(memberName));
756+
if (!member.is(CommonFlags.PRIVATE)) {
757+
this.ensureModuleExport(memberName, member, subPrefix);
758+
}
757759
}
758760
}
759761
}
@@ -829,10 +831,10 @@ export class Compiler extends DiagnosticEmitter {
829831
this.compileElement(element);
830832
}
831833
}
832-
var starExports = file.exportsStar;
833-
if (starExports) {
834-
for (let i = 0, k = starExports.length; i < k; ++i) {
835-
let exportStar = unchecked(starExports[i]);
834+
var exportsStar = file.exportsStar;
835+
if (exportsStar) {
836+
for (let i = 0, k = exportsStar.length; i < k; ++i) {
837+
let exportStar = unchecked(exportsStar[i]);
836838
this.compileFile(exportStar);
837839
this.compileExports(exportStar);
838840
}

src/definitions.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,9 @@ export class TSDBuilder extends ExportsWalker {
409409
visitEnum(name: string, element: Enum): void {
410410
var sb = this.sb;
411411
indent(sb, this.indentLevel++);
412-
sb.push("export enum ");
412+
sb.push("export ");
413+
if (element.is(CommonFlags.CONST)) sb.push("const ");
414+
sb.push("enum ");
413415
sb.push(name);
414416
sb.push(" {\n");
415417
var members = element.members;
@@ -510,7 +512,9 @@ export class TSDBuilder extends ExportsWalker {
510512
// for (let member of instanceMembers.values()) {
511513
for (let _values = Map_values(instanceMembers), i = 0, k = _values.length; i < k; ++i) {
512514
let member = unchecked(_values[i]);
513-
this.visitElement(member.name, member);
515+
if (member.parent == element) { // own member
516+
this.visitElement(member.name, member);
517+
}
514518
}
515519
}
516520
indent(sb, --this.indentLevel);

src/program.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2467,6 +2467,13 @@ export class File extends Element {
24672467
var declaration = this.program.makeNativeNamespaceDeclaration(name);
24682468
declaration.name = localIdentifier;
24692469
var ns = new Namespace(name, parent, declaration);
2470+
ns.set(CommonFlags.SCOPED);
2471+
this.copyExportsToNamespace(ns);
2472+
return ns;
2473+
}
2474+
2475+
/** Recursively copies the exports of this file to the specified namespace. */
2476+
private copyExportsToNamespace(ns: Namespace): void {
24702477
var exports = this.exports;
24712478
if (exports) {
24722479
// for (let [memberName, member] of exports) {
@@ -2476,7 +2483,12 @@ export class File extends Element {
24762483
ns.add(memberName, member);
24772484
}
24782485
}
2479-
return ns;
2486+
var exportsStar = this.exportsStar;
2487+
if (exportsStar) {
2488+
for (let i = 0, k = exportsStar.length; i < k; ++i) {
2489+
exportsStar[i].copyExportsToNamespace(ns);
2490+
}
2491+
}
24802492
}
24812493
}
24822494

tests/compiler/exportstar.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"asc_flags": [
3+
"--runtime none"
4+
]
5+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
(module
2+
(type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
3+
(type $none_=>_none (func))
4+
(memory $0 0)
5+
(global $export/a i32 (i32.const 1))
6+
(global $export/b i32 (i32.const 2))
7+
(global $export/c i32 (i32.const 3))
8+
(export "memory" (memory $0))
9+
(export "add" (func $export/add))
10+
(export "sub" (func $export/sub))
11+
(export "renamed_mul" (func $export/mul))
12+
(export "a" (global $export/a))
13+
(export "b" (global $export/b))
14+
(export "renamed_c" (global $export/c))
15+
(export "ns.two" (func $export/ns.one))
16+
(export "default.two" (func $export/ns.one))
17+
(func $export/add (; 0 ;) (param $0 i32) (param $1 i32) (result i32)
18+
local.get $0
19+
local.get $1
20+
i32.add
21+
)
22+
(func $export/sub (; 1 ;) (param $0 i32) (param $1 i32) (result i32)
23+
local.get $0
24+
local.get $1
25+
i32.sub
26+
)
27+
(func $export/mul (; 2 ;) (param $0 i32) (param $1 i32) (result i32)
28+
local.get $0
29+
local.get $1
30+
i32.mul
31+
)
32+
(func $export/ns.one (; 3 ;)
33+
nop
34+
)
35+
)

tests/compiler/exportstar.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./export";
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
(module
2+
(type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
3+
(type $none_=>_none (func))
4+
(memory $0 0)
5+
(table $0 1 funcref)
6+
(global $export/a i32 (i32.const 1))
7+
(global $export/b i32 (i32.const 2))
8+
(global $export/c i32 (i32.const 3))
9+
(export "memory" (memory $0))
10+
(export "add" (func $export/add))
11+
(export "sub" (func $export/sub))
12+
(export "renamed_mul" (func $export/mul))
13+
(export "a" (global $export/a))
14+
(export "b" (global $export/b))
15+
(export "renamed_c" (global $export/c))
16+
(export "ns.two" (func $export/ns.two))
17+
(export "default.two" (func $export/ns.two))
18+
(func $export/add (; 0 ;) (param $0 i32) (param $1 i32) (result i32)
19+
local.get $0
20+
local.get $1
21+
i32.add
22+
)
23+
(func $export/sub (; 1 ;) (param $0 i32) (param $1 i32) (result i32)
24+
local.get $0
25+
local.get $1
26+
i32.sub
27+
)
28+
(func $export/mul (; 2 ;) (param $0 i32) (param $1 i32) (result i32)
29+
local.get $0
30+
local.get $1
31+
i32.mul
32+
)
33+
(func $export/ns.one (; 3 ;)
34+
nop
35+
)
36+
(func $export/ns.two (; 4 ;)
37+
nop
38+
)
39+
)

tests/compiler/reexport.optimized.wat

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@
1717
(export "renamed_add" (func $export/add))
1818
(export "rerenamed_sub" (func $export/mul))
1919
(export "renamed_ns.two" (func $export/ns.one))
20+
(export "exportstar.add" (func $export/add))
21+
(export "exportstar.sub" (func $export/sub))
22+
(export "exportstar.renamed_mul" (func $export/mul))
23+
(export "exportstar.a" (global $export/a))
24+
(export "exportstar.b" (global $export/b))
25+
(export "exportstar.renamed_c" (global $export/c))
26+
(export "exportstar.ns.two" (func $export/ns.one))
27+
(export "exportstar.default.two" (func $export/ns.one))
2028
(start $~start)
2129
(func $export/add (; 0 ;) (param $0 i32) (param $1 i32) (result i32)
2230
local.get $0

tests/compiler/reexport.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,6 @@ export {
2424
imported_add(1, 2) + imported_sub(3, 4);
2525

2626
export { ns as renamed_ns } from "./export";
27+
28+
import * as exportstar from "./exportstar";
29+
export { exportstar };

tests/compiler/reexport.untouched.wat

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@
1818
(export "renamed_add" (func $export/add))
1919
(export "rerenamed_sub" (func $export/mul))
2020
(export "renamed_ns.two" (func $export/ns.two))
21+
(export "exportstar.add" (func $export/add))
22+
(export "exportstar.sub" (func $export/sub))
23+
(export "exportstar.renamed_mul" (func $export/mul))
24+
(export "exportstar.a" (global $export/a))
25+
(export "exportstar.b" (global $export/b))
26+
(export "exportstar.renamed_c" (global $export/c))
27+
(export "exportstar.ns.two" (func $export/ns.two))
28+
(export "exportstar.default.two" (func $export/ns.two))
2129
(start $~start)
2230
(func $export/add (; 0 ;) (param $0 i32) (param $1 i32) (result i32)
2331
local.get $0

tests/compiler/wasi-snapshot-preview1.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
subscription_fd_readwrite,
99
signal,
1010
prestat_dir
11-
} from "bindings/wasi_snapshot_preview1";
11+
} from "bindings/wasi";
1212

1313
import { Target } from "shared/target";
1414

0 commit comments

Comments
 (0)