Make export binding more robust

This changes the way we discover the kind of export in the case of
an export declaration.  This might be exporting a module member, as in

    let x = 42;
    export { x as y };

or it could be exporting an entire module previously imported, as in

    import * as other from "other";
    export { other };

In each case, we must emit a proper fully qualified token.

Our logic for detecting these cases was a bit busted previously.  We
now rely on real symbolic information rather than doing hokey name lookups.
This commit is contained in:
joeduffy 2017-02-13 11:37:23 -08:00
parent a668db2e2c
commit a2653093db
26 changed files with 1136 additions and 925 deletions

View file

@ -1023,8 +1023,8 @@ export class Transformer {
kind: ast.moduleKind,
name: ident(this.getModuleName(modtok)),
imports: this.currentModuleImportTokens,
members: this.currentModuleMembers,
exports: this.currentModuleExports,
members: this.currentModuleMembers,
});
}
finally {
@ -1072,7 +1072,6 @@ export class Transformer {
private async transformExportStatement(
modtok: tokens.ModuleToken, node: ts.Statement): Promise<ModuleElement[]> {
let elements: ModuleElement[] = await this.transformModuleDeclarationStatement(modtok, node);
// Default exports get the special name "default"; all others will just reuse the element name.
@ -1093,8 +1092,14 @@ export class Transformer {
else {
let exports: ast.Export[] = [];
for (let element of elements) {
if (ast.isDefinition(<ast.Node>element)) {
let member = <ast.ModuleMember>element;
let member: ast.ModuleMember | undefined;
if (isVariableDeclaration(element)) {
member = (<VariableDeclaration<ast.ModuleProperty>>element).variable;
}
else if (ast.isDefinition(<ast.Node>element)) {
member = <ast.ModuleMember>element;
}
if (member) {
let id: tokens.Name = member.name.ident;
exports.push(this.withLocation(node, <ast.Export>{
kind: ast.exportKind,
@ -1132,10 +1137,6 @@ export class Transformer {
let source: string = this.transformStringLiteral(spec).value;
sourceModule = this.resolveModuleReferenceByName(source);
}
else {
// If there is no module specifier, we are exporting from the current compilation module.
sourceModule = tokens.selfModule;
}
if (node.exportClause) {
// This is an export declaration of the form
@ -1150,65 +1151,54 @@ export class Transformer {
//
// For every export clause, we will issue a top-level MuIL re-export AST node.
for (let exportClause of node.exportClause.elements) {
let name: ast.Identifier = this.transformIdentifier(exportClause.name);
let srcname: ast.Identifier = this.transformIdentifier(exportClause.name);
let dstname: ast.Identifier = srcname;
if (exportClause.propertyName) {
// The export is being renamed (`<propertyName> as <name>`). This yields an export node, even for
// elements exported from the current module.
let propertyName: ast.Identifier = this.transformIdentifier(exportClause.propertyName);
exports.push(this.withLocation(exportClause, <ast.Export>{
kind: ast.exportKind,
name: name,
referent: this.withLocation(exportClause.propertyName, <ast.Token>{
kind: ast.tokenKind,
tok: await this.createModuleRefMemberToken(sourceModule, propertyName.ident),
}),
}));
// The export is being renamed (`export <propertyName> as <name>`). This yields an export node,
// even for elements exported from the current module.
srcname = this.transformIdentifier(exportClause.propertyName);
}
// If this is an export from another module, create an export definition. Otherwise, for exports
// referring to ambient elements inside of the current module, we need to do a bitt of investigation.
let reftok: tokens.Token | undefined;
if (sourceModule) {
reftok = await this.createModuleRefMemberToken(sourceModule, srcname.ident);
}
else {
// If this is an export from another module, create an export definition. Otherwise, for exports
// from within the same module, just look up the definition and change its accessibility to public.
if (sourceModule) {
exports.push(this.withLocation(exportClause, <ast.Export>{
kind: ast.exportKind,
name: name,
referent: this.withLocation(exportClause.name, <ast.Token>{
kind: ast.tokenKind,
tok: await this.createModuleRefMemberToken(sourceModule, name.ident),
}),
}));
let expsym: ts.Symbol | undefined = this.checker().getSymbolAtLocation(exportClause.name);
contract.assert(!!expsym);
if (expsym.flags & ts.SymbolFlags.Alias) {
expsym = this.checker().getAliasedSymbol(expsym);
}
if (expsym.flags & (ts.SymbolFlags.ValueModule | ts.SymbolFlags.NamespaceModule)) {
// If this is a module symbol, then we are rexporting an import, e.g.:
// import * as other from "other";
// export {other};
// Create a fully qualified token for that other module using the one we used on import.
contract.assert(!!this.currentModuleImports);
let modref: ModuleReference | undefined = this.currentModuleImports!.get(srcname.ident);
contract.assert(!!modref);
reftok = await this.createModuleToken(modref!);
}
else {
// Otherwise, it must be a module member, e.g. an exported class, interface, or variable.
contract.assert(!!this.currentModuleToken);
contract.assert(!!this.currentModuleMembers);
contract.assert(!!this.currentModuleImports);
contract.assert(!!this.currentModuleImportTokens);
// First look for a module member, for reexporting classes, interfaces, and variables.
let reftok: tokens.Token | undefined;
let member: ast.ModuleMember | undefined = this.currentModuleMembers![name.ident];
if (member) {
contract.assert(!!this.currentModuleToken);
reftok = this.createModuleMemberToken(this.currentModuleToken!, name.ident);
}
else {
// If that failed, look for a known import. This enables reexporting whole modules, e.g.:
// import * as other from "other";
// export {other};
contract.assert(!!this.currentModuleImports);
let modref: ModuleReference | undefined = this.currentModuleImports!.get(name.ident);
contract.assert(!!modref);
reftok = await this.createModuleToken(modref!);
}
contract.assert(!!reftok, "Expected either a member or import match for export name");
exports.push(this.withLocation(exportClause, <ast.Export>{
kind: ast.exportKind,
name: name,
referent: this.withLocation(exportClause, <ast.Token>{
kind: ast.tokenKind,
tok: reftok,
}),
}));
contract.assert(!!this.currentModuleMembers![srcname.ident]);
reftok = this.createModuleMemberToken(this.currentModuleToken!, srcname.ident);
}
}
contract.assert(!!reftok, "Expected either a member or import match for export name");
exports.push(this.withLocation(exportClause, <ast.Export>{
kind: ast.exportKind,
name: dstname,
referent: this.copyLocation(srcname, <ast.Token>{
kind: ast.tokenKind,
tok: reftok,
}),
}));
}
}
else {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"a1": {
"kind": "ModuleProperty",
@ -5283,7 +5284,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"a": {
"kind": "ModuleProperty",
@ -289,7 +290,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
".main": {
"kind": "ModuleMethod",
@ -21,7 +22,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
".main": {
"kind": "ModuleMethod",
@ -21,7 +22,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"C": {
"kind": "Class",
@ -1762,7 +1763,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"au": {
"kind": "ModuleProperty",
@ -1318,7 +1319,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"modprop": {
"kind": "ModuleProperty",
@ -1570,7 +1571,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"B": {
"kind": "Class",
@ -753,7 +754,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"C": {
"kind": "Class",
@ -52,7 +53,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,50 +8,6 @@
"ident": "index"
},
"imports": [],
"members": {
"C": {
"kind": "Class",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"members": {},
"abstract": false,
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 2,
"column": 2
}
}
},
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"exports": {
"C": {
"kind": "Export",
@ -98,6 +54,50 @@
}
}
},
"members": {
"C": {
"kind": "Class",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"members": {},
"abstract": false,
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 2,
"column": 2
}
}
},
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,30 @@
"ident": "index"
},
"imports": [],
"exports": {
"default": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "default"
},
"referent": {
"kind": "Token",
"tok": "class_exp_def_1:index:default"
},
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 2,
"column": 2
}
}
}
},
"members": {
"default": {
"kind": "Class",
@ -41,30 +65,6 @@
}
}
},
"exports": {
"default": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "default"
},
"referent": {
"kind": "Token",
"tok": "class_exp_def_1:index:default"
},
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 2,
"column": 2
}
}
}
},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,140 @@
"ident": "other"
},
"imports": [],
"exports": {
"D": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "D",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"referent": {
"kind": "Token",
"tok": "export:other:D",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 18
}
}
},
"J": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "J",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "export:other:J",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 1
},
"end": {
"line": 2,
"column": 22
}
}
},
"w": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "w",
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 13
}
}
},
"referent": {
"kind": "Token",
"tok": "export:other:w",
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 13
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 1
},
"end": {
"line": 3,
"column": 19
}
}
}
},
"members": {
"D": {
"kind": "Class",
@ -202,96 +336,6 @@
}
}
},
"exports": {
"D": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "D",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"referent": {
"kind": "Token",
"tok": "export:other:D",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 18
}
}
},
"J": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "J",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "export:other:J",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 1
},
"end": {
"line": 2,
"column": 22
}
}
}
},
"loc": {
"file": "other.ts",
"start": {
@ -327,6 +371,184 @@
}
}
],
"exports": {
"other": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "other",
"loc": {
"file": "index.ts",
"start": {
"line": 3,
"column": 9
},
"end": {
"line": 3,
"column": 14
}
}
},
"referent": {
"kind": "Token",
"tok": "export:other",
"loc": {
"file": "index.ts",
"start": {
"line": 3,
"column": 9
},
"end": {
"line": 3,
"column": 14
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 3,
"column": 9
},
"end": {
"line": 3,
"column": 14
}
}
},
"C": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 9
},
"end": {
"line": 9,
"column": 10
}
}
},
"referent": {
"kind": "Token",
"tok": "export:index:C",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 9
},
"end": {
"line": 9,
"column": 10
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 9
},
"end": {
"line": 9,
"column": 10
}
}
},
"I": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 12
},
"end": {
"line": 9,
"column": 13
}
}
},
"referent": {
"kind": "Token",
"tok": "export:index:I",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 12
},
"end": {
"line": 9,
"column": 13
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 12
},
"end": {
"line": 9,
"column": 13
}
}
},
"v": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "v",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 15
},
"end": {
"line": 9,
"column": 16
}
}
},
"referent": {
"kind": "Token",
"tok": "export:index:v",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 15
},
"end": {
"line": 9,
"column": 16
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 15
},
"end": {
"line": 9,
"column": 16
}
}
}
},
"members": {
"C": {
"kind": "Class",
@ -521,184 +743,6 @@
}
}
},
"exports": {
"other": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "other",
"loc": {
"file": "index.ts",
"start": {
"line": 3,
"column": 9
},
"end": {
"line": 3,
"column": 14
}
}
},
"referent": {
"kind": "Token",
"tok": "export:index:other",
"loc": {
"file": "index.ts",
"start": {
"line": 3,
"column": 9
},
"end": {
"line": 3,
"column": 14
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 3,
"column": 9
},
"end": {
"line": 3,
"column": 14
}
}
},
"C": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 9
},
"end": {
"line": 9,
"column": 10
}
}
},
"referent": {
"kind": "Token",
"tok": "export:index:C",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 9
},
"end": {
"line": 9,
"column": 10
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 9
},
"end": {
"line": 9,
"column": 10
}
}
},
"I": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 12
},
"end": {
"line": 9,
"column": 13
}
}
},
"referent": {
"kind": "Token",
"tok": "export:index:I",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 12
},
"end": {
"line": 9,
"column": 13
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 12
},
"end": {
"line": 9,
"column": 13
}
}
},
"v": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "v",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 15
},
"end": {
"line": 9,
"column": 16
}
}
},
"referent": {
"kind": "Token",
"tok": "export:index:v",
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 15
},
"end": {
"line": 9,
"column": 16
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 9,
"column": 15
},
"end": {
"line": 9,
"column": 16
}
}
}
},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"foo": {
"kind": "ModuleMethod",
@ -133,7 +134,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,52 @@
"ident": "other"
},
"imports": [],
"exports": {
"foo": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "foo",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 20
}
}
},
"referent": {
"kind": "Token",
"tok": "modules/func_cross_call:other:foo",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 20
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 3,
"column": 2
}
}
}
},
"members": {
"foo": {
"kind": "ModuleMethod",
@ -66,52 +112,6 @@
}
}
},
"exports": {
"foo": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "foo",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 20
}
}
},
"referent": {
"kind": "Token",
"tok": "modules/func_cross_call:other:foo",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 20
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 3,
"column": 2
}
}
}
},
"loc": {
"file": "other.ts",
"start": {
@ -147,6 +147,7 @@
}
}
],
"exports": {},
"members": {
".init": {
"kind": "ModuleMethod",
@ -230,7 +231,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,52 @@
"ident": "index"
},
"imports": [],
"exports": {
"foo": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "foo",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 20
}
}
},
"referent": {
"kind": "Token",
"tok": "func_exp_1:index:foo",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 20
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 3,
"column": 2
}
}
}
},
"members": {
"foo": {
"kind": "ModuleMethod",
@ -133,52 +179,6 @@
}
}
},
"exports": {
"foo": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "foo",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 20
}
}
},
"referent": {
"kind": "Token",
"tok": "func_exp_1:index:foo",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 20
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 3,
"column": 2
}
}
}
},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,30 @@
"ident": "index"
},
"imports": [],
"exports": {
"default": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "default"
},
"referent": {
"kind": "Token",
"tok": "func_def_exp_1:index:default"
},
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 3,
"column": 2
}
}
}
},
"members": {
"default": {
"kind": "ModuleMethod",
@ -122,30 +146,6 @@
}
}
},
"exports": {
"default": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "default"
},
"referent": {
"kind": "Token",
"tok": "func_def_exp_1:index:default"
},
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 3,
"column": 2
}
}
}
},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"I": {
"kind": "Class",
@ -52,7 +53,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,50 +8,6 @@
"ident": "index"
},
"imports": [],
"members": {
"I": {
"kind": "Class",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 18
},
"end": {
"line": 1,
"column": 19
}
}
},
"members": {},
"interface": true,
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 2,
"column": 2
}
}
},
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"exports": {
"I": {
"kind": "Export",
@ -98,6 +54,50 @@
}
}
},
"members": {
"I": {
"kind": "Class",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 18
},
"end": {
"line": 1,
"column": 19
}
}
},
"members": {},
"interface": true,
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 2,
"column": 2
}
}
},
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"A": {
"kind": "Class",
@ -219,7 +220,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,140 @@
"ident": "other"
},
"imports": [],
"exports": {
"C": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport:other:C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 18
}
}
},
"I": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport:other:I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 1
},
"end": {
"line": 2,
"column": 22
}
}
},
"v": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "v",
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 13
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport:other:v",
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 13
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 1
},
"end": {
"line": 3,
"column": 19
}
}
}
},
"members": {
"C": {
"kind": "Class",
@ -202,96 +336,6 @@
}
}
},
"exports": {
"C": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport:other:C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 18
}
}
},
"I": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport:other:I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 1
},
"end": {
"line": 2,
"column": 22
}
}
}
},
"loc": {
"file": "other.ts",
"start": {
@ -311,19 +355,6 @@
"ident": "index"
},
"imports": [],
"members": {
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"exports": {
"C": {
"kind": "Export",
@ -458,6 +489,19 @@
}
}
},
"members": {
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,140 @@
"ident": "other"
},
"imports": [],
"exports": {
"C": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_all:other:C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 18
}
}
},
"I": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_all:other:I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 1
},
"end": {
"line": 2,
"column": 22
}
}
},
"v": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "v",
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 13
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_all:other:v",
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 13
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 1
},
"end": {
"line": 3,
"column": 19
}
}
}
},
"members": {
"C": {
"kind": "Class",
@ -202,96 +336,6 @@
}
}
},
"exports": {
"C": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_all:other:C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 18
}
}
},
"I": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_all:other:I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 1
},
"end": {
"line": 2,
"column": 22
}
}
}
},
"loc": {
"file": "other.ts",
"start": {
@ -311,19 +355,6 @@
"ident": "index"
},
"imports": [],
"members": {
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"exports": {
"C": {
"kind": "Export",
@ -425,6 +456,19 @@
}
}
},
"members": {
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,140 @@
"ident": "other"
},
"imports": [],
"exports": {
"C": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_rename:other:C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 18
}
}
},
"I": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_rename:other:I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 1
},
"end": {
"line": 2,
"column": 22
}
}
},
"v": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "v",
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 13
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_rename:other:v",
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 12
},
"end": {
"line": 3,
"column": 13
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 3,
"column": 1
},
"end": {
"line": 3,
"column": 19
}
}
}
},
"members": {
"C": {
"kind": "Class",
@ -202,96 +336,6 @@
}
}
},
"exports": {
"C": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_rename:other:C",
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 15
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 18
}
}
},
"I": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "reexport_rename:other:I",
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 18
},
"end": {
"line": 2,
"column": 19
}
}
},
"loc": {
"file": "other.ts",
"start": {
"line": 2,
"column": 1
},
"end": {
"line": 2,
"column": 22
}
}
}
},
"loc": {
"file": "other.ts",
"start": {
@ -311,19 +355,6 @@
"ident": "index"
},
"imports": [],
"members": {
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"exports": {
"D": {
"kind": "Export",
@ -458,6 +489,19 @@
}
}
},
"members": {
".main": {
"kind": "ModuleMethod",
"name": {
"kind": "Identifier",
"ident": ".main"
},
"body": {
"kind": "Block",
"statements": []
}
}
},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,7 @@
"ident": "index"
},
"imports": [],
"exports": {},
"members": {
"x": {
"kind": "ModuleProperty",
@ -140,7 +141,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,52 @@
"ident": "index"
},
"imports": [],
"exports": {
"x": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "x",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 13
}
}
},
"referent": {
"kind": "Token",
"tok": "var_exp_1:index:x",
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 13
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 19
}
}
}
},
"members": {
"x": {
"kind": "ModuleProperty",
@ -140,7 +186,6 @@
}
}
},
"exports": {},
"loc": {
"file": "index.ts",
"start": {

View file

@ -8,6 +8,52 @@
"ident": "index"
},
"imports": [],
"exports": {
"Point": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "Point",
"loc": {
"file": "index.ts",
"start": {
"line": 4,
"column": 14
},
"end": {
"line": 4,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "scenarios/point:index:Point",
"loc": {
"file": "index.ts",
"start": {
"line": 4,
"column": 14
},
"end": {
"line": 4,
"column": 19
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 4,
"column": 1
},
"end": {
"line": 16,
"column": 2
}
}
}
},
"members": {
"Point": {
"kind": "Class",
@ -858,52 +904,6 @@
}
}
},
"exports": {
"Point": {
"kind": "Export",
"name": {
"kind": "Identifier",
"ident": "Point",
"loc": {
"file": "index.ts",
"start": {
"line": 4,
"column": 14
},
"end": {
"line": 4,
"column": 19
}
}
},
"referent": {
"kind": "Token",
"tok": "scenarios/point:index:Point",
"loc": {
"file": "index.ts",
"start": {
"line": 4,
"column": 14
},
"end": {
"line": 4,
"column": 19
}
}
},
"loc": {
"file": "index.ts",
"start": {
"line": 4,
"column": 1
},
"end": {
"line": 16,
"column": 2
}
}
}
},
"loc": {
"file": "index.ts",
"start": {