@@ -5278,9 +5278,11 @@ const _super = (function (geti, seti) {
52785278
52795279 function emitClassLikeDeclarationForES6AndHigher ( node : ClassLikeDeclaration ) {
52805280 let decoratedClassAlias : string ;
5281- const thisNodeIsDecorated = nodeIsDecorated ( node ) ;
5281+ const isHoistedDeclarationInSystemModule = shouldHoistDeclarationInSystemJsModule ( node ) ;
5282+ const isDecorated = nodeIsDecorated ( node ) ;
5283+ const rewriteAsClassExpression = isDecorated || isHoistedDeclarationInSystemModule ;
52825284 if ( node . kind === SyntaxKind . ClassDeclaration ) {
5283- if ( thisNodeIsDecorated ) {
5285+ if ( rewriteAsClassExpression ) {
52845286 // When we emit an ES6 class that has a class decorator, we must tailor the
52855287 // emit to certain specific cases.
52865288 //
@@ -5361,7 +5363,10 @@ const _super = (function (geti, seti) {
53615363 // [Example 4]
53625364 //
53635365
5364- if ( resolver . getNodeCheckFlags ( node ) & NodeCheckFlags . ClassWithBodyScopedClassBinding ) {
5366+ // NOTE: we reuse the same rewriting logic for cases when targeting ES6 and module kind is System.
5367+ // Because of hoisting top level class declaration need to be emitted as class expressions.
5368+ // Double bind case is only required if node is decorated.
5369+ if ( isDecorated && resolver . getNodeCheckFlags ( node ) & NodeCheckFlags . ClassWithBodyScopedClassBinding ) {
53655370 decoratedClassAlias = unescapeIdentifier ( makeUniqueName ( node . name ? node . name . text : "default" ) ) ;
53665371 decoratedClassAliases [ getNodeId ( node ) ] = decoratedClassAlias ;
53675372 write ( `let ${ decoratedClassAlias } ;` ) ;
@@ -5372,7 +5377,9 @@ const _super = (function (geti, seti) {
53725377 write ( "export " ) ;
53735378 }
53745379
5375- write ( "let " ) ;
5380+ if ( ! isHoistedDeclarationInSystemModule ) {
5381+ write ( "let " ) ;
5382+ }
53765383 emitDeclarationName ( node ) ;
53775384 if ( decoratedClassAlias !== undefined ) {
53785385 write ( ` = ${ decoratedClassAlias } ` ) ;
@@ -5416,7 +5423,7 @@ const _super = (function (geti, seti) {
54165423 // emit name if
54175424 // - node has a name
54185425 // - this is default export with static initializers
5419- if ( node . name || ( node . flags & NodeFlags . Default && ( staticProperties . length > 0 || modulekind !== ModuleKind . ES6 ) && ! thisNodeIsDecorated ) ) {
5426+ if ( node . name || ( node . flags & NodeFlags . Default && ( staticProperties . length > 0 || modulekind !== ModuleKind . ES6 ) && ! rewriteAsClassExpression ) ) {
54205427 write ( " " ) ;
54215428 emitDeclarationName ( node ) ;
54225429 }
@@ -5436,7 +5443,7 @@ const _super = (function (geti, seti) {
54365443 writeLine ( ) ;
54375444 emitToken ( SyntaxKind . CloseBraceToken , node . members . end ) ;
54385445
5439- if ( thisNodeIsDecorated ) {
5446+ if ( rewriteAsClassExpression ) {
54405447 decoratedClassAliases [ getNodeId ( node ) ] = undefined ;
54415448 write ( ";" ) ;
54425449 }
@@ -5476,7 +5483,7 @@ const _super = (function (geti, seti) {
54765483 // module), export it
54775484 if ( node . flags & NodeFlags . Default ) {
54785485 // if this is a top level default export of decorated class, write the export after the declaration.
5479- if ( thisNodeIsDecorated ) {
5486+ if ( isDecorated ) {
54805487 writeLine ( ) ;
54815488 write ( "export default " ) ;
54825489 emitDeclarationName ( node ) ;
0 commit comments