Skip to content

Adds a failing test for System JS compilation. #3376

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions tests/baselines/reference/systemModuleEnum.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//// [systemModuleEnum.ts]

export enum Foo {}

export module Bar {
export var baz = (): any => {}
}


//// [systemModuleEnum.js]
System.register([], function(exports_1) {
var Foo, Bar;
return {
setters:[],
execute: function() {
(function (Foo) {
})(Foo || (Foo = {}));
exports_1("Foo", Foo);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The compiler does not generate a semicolon at the end of this line, however it appears to be necessary. I am guessing that the JS runtime is seeing an attempt to call a function on exports_1("Foo", Foo)(...), since the following function is wrapped in parenthesis. The semicolon tells the runtime that a new expression is starting on line 19.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right JS treats it as call statement. I think you can just add a semicolon to this line and you can submit a fix 👍

if (compilerOptions.module === ModuleKind.System && (node.flags & NodeFlags.Export)) {
   // write the call to exporter for enum
   writeLine();
   write(`${exportFunctionForFile}("`);
   emitDeclarationName(node);
   write(`", `);
   emitDeclarationName(node);
   write(")"); // here
}

https://github.com/Microsoft/TypeScript/blob/master/src/compiler/emitter.ts#L4506

(function (Bar) {
Bar.baz = function () { };
})(Bar = Bar || (Bar = {}));
exports_1("Bar", Bar);
}
}
});
12 changes: 12 additions & 0 deletions tests/baselines/reference/systemModuleEnum.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
=== tests/cases/compiler/systemModuleEnum.ts ===

export enum Foo {}
>Foo : Symbol(Foo, Decl(systemModuleEnum.ts, 0, 0))

export module Bar {
>Bar : Symbol(Bar, Decl(systemModuleEnum.ts, 1, 18))

export var baz = (): any => {}
>baz : Symbol(baz, Decl(systemModuleEnum.ts, 4, 11))
}

13 changes: 13 additions & 0 deletions tests/baselines/reference/systemModuleEnum.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
=== tests/cases/compiler/systemModuleEnum.ts ===

export enum Foo {}
>Foo : Foo

export module Bar {
>Bar : typeof Bar

export var baz = (): any => {}
>baz : () => any
>(): any => {} : () => any
}

7 changes: 7 additions & 0 deletions tests/cases/compiler/systemModuleEnum.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// @module: system

export enum Foo {}

export module Bar {
export var baz = (): any => {}
}