@@ -594,12 +594,11 @@ namespace ts {
594
594
emitLines ( node . statements ) ;
595
595
}
596
596
597
- // Return a temp variable name to be used in `export default` statements.
597
+ // Return a temp variable name to be used in `export default`/`export class ... extends` statements.
598
598
// The temp name will be of the form _default_counter.
599
599
// Note that export default is only allowed at most once in a module, so we
600
600
// do not need to keep track of created temp names.
601
- function getExportDefaultTempVariableName ( ) : string {
602
- const baseName = "_default" ;
601
+ function getExportTempVariableName ( baseName : string ) : string {
603
602
if ( ! currentIdentifiers . has ( baseName ) ) {
604
603
return baseName ;
605
604
}
@@ -613,24 +612,31 @@ namespace ts {
613
612
}
614
613
}
615
614
615
+ function emitTempVariableDeclaration ( expr : Expression , baseName : string , diagnostic : SymbolAccessibilityDiagnostic ) : string {
616
+ const tempVarName = getExportTempVariableName ( baseName ) ;
617
+ if ( ! noDeclare ) {
618
+ write ( "declare " ) ;
619
+ }
620
+ write ( "var " ) ;
621
+ write ( tempVarName ) ;
622
+ write ( ": " ) ;
623
+ writer . getSymbolAccessibilityDiagnostic = ( ) => diagnostic ;
624
+ resolver . writeTypeOfExpression ( expr , enclosingDeclaration , TypeFormatFlags . UseTypeOfFunction | TypeFormatFlags . UseTypeAliasValue , writer ) ;
625
+ write ( ";" ) ;
626
+ writeLine ( ) ;
627
+ return tempVarName ;
628
+ }
629
+
616
630
function emitExportAssignment ( node : ExportAssignment ) {
617
631
if ( node . expression . kind === SyntaxKind . Identifier ) {
618
632
write ( node . isExportEquals ? "export = " : "export default " ) ;
619
633
writeTextOfNode ( currentText , node . expression ) ;
620
634
}
621
635
else {
622
- // Expression
623
- const tempVarName = getExportDefaultTempVariableName ( ) ;
624
- if ( ! noDeclare ) {
625
- write ( "declare " ) ;
626
- }
627
- write ( "var " ) ;
628
- write ( tempVarName ) ;
629
- write ( ": " ) ;
630
- writer . getSymbolAccessibilityDiagnostic = getDefaultExportAccessibilityDiagnostic ;
631
- resolver . writeTypeOfExpression ( node . expression , enclosingDeclaration , TypeFormatFlags . UseTypeOfFunction | TypeFormatFlags . UseTypeAliasValue , writer ) ;
632
- write ( ";" ) ;
633
- writeLine ( ) ;
636
+ const tempVarName = emitTempVariableDeclaration ( node . expression , "_default" , {
637
+ diagnosticMessage : Diagnostics . Default_export_of_the_module_has_or_is_using_private_name_0 ,
638
+ errorNode : node
639
+ } ) ;
634
640
write ( node . isExportEquals ? "export = " : "export default " ) ;
635
641
write ( tempVarName ) ;
636
642
}
@@ -644,13 +650,6 @@ namespace ts {
644
650
// write each of these declarations asynchronously
645
651
writeAsynchronousModuleElements ( nodes ) ;
646
652
}
647
-
648
- function getDefaultExportAccessibilityDiagnostic ( ) : SymbolAccessibilityDiagnostic {
649
- return {
650
- diagnosticMessage : Diagnostics . Default_export_of_the_module_has_or_is_using_private_name_0 ,
651
- errorNode : node
652
- } ;
653
- }
654
653
}
655
654
656
655
function isModuleElementVisible ( node : Declaration ) {
@@ -1113,7 +1112,11 @@ namespace ts {
1113
1112
else {
1114
1113
writer . getSymbolAccessibilityDiagnostic = getHeritageClauseVisibilityError ;
1115
1114
errorNameNode = className ;
1116
- resolver . writeBaseConstructorTypeOfClass ( < ClassLikeDeclaration > enclosingDeclaration , enclosingDeclaration , TypeFormatFlags . UseTypeOfFunction | TypeFormatFlags . UseTypeAliasValue , writer ) ;
1115
+ resolver . writeBaseConstructorTypeOfClass (
1116
+ enclosingDeclaration as ClassLikeDeclaration ,
1117
+ enclosingDeclaration ,
1118
+ TypeFormatFlags . UseTypeOfFunction | TypeFormatFlags . UseTypeAliasValue ,
1119
+ writer ) ;
1117
1120
errorNameNode = undefined ;
1118
1121
}
1119
1122
@@ -1151,21 +1154,39 @@ namespace ts {
1151
1154
}
1152
1155
}
1153
1156
1157
+ const prevEnclosingDeclaration = enclosingDeclaration ;
1158
+ enclosingDeclaration = node ;
1159
+ const baseTypeNode = getClassExtendsHeritageClauseElement ( node ) ;
1160
+ let tempVarName : string ;
1161
+ if ( isNonNullExpression ( baseTypeNode ) ) {
1162
+ tempVarName = emitTempVariableDeclaration ( baseTypeNode . expression , `_${ node . name . text } _intersection_base` , {
1163
+ diagnosticMessage : Diagnostics . extends_clause_of_exported_class_0_has_or_is_using_private_name_1 ,
1164
+ errorNode : baseTypeNode ,
1165
+ typeName : node . name
1166
+ } ) ;
1167
+ }
1168
+
1154
1169
emitJsDocComments ( node ) ;
1155
1170
emitModuleElementDeclarationFlags ( node ) ;
1156
1171
if ( hasModifier ( node , ModifierFlags . Abstract ) ) {
1157
1172
write ( "abstract " ) ;
1158
1173
}
1159
-
1160
1174
write ( "class " ) ;
1161
1175
writeTextOfNode ( currentText , node . name ) ;
1162
- const prevEnclosingDeclaration = enclosingDeclaration ;
1163
- enclosingDeclaration = node ;
1164
1176
emitTypeParameters ( node . typeParameters ) ;
1165
- const baseTypeNode = getClassExtendsHeritageClauseElement ( node ) ;
1166
1177
if ( baseTypeNode ) {
1167
- node . name ;
1168
- emitHeritageClause ( node . name , [ baseTypeNode ] , /*isImplementsList*/ false ) ;
1178
+ if ( isNonNullExpression ( baseTypeNode ) ) {
1179
+ write ( " extends " ) ;
1180
+ write ( tempVarName ) ;
1181
+ if ( baseTypeNode . typeArguments ) {
1182
+ write ( "<" ) ;
1183
+ emitCommaList ( baseTypeNode . typeArguments , emitType ) ;
1184
+ write ( ">" ) ;
1185
+ }
1186
+ }
1187
+ else {
1188
+ emitHeritageClause ( node . name , [ baseTypeNode ] , /*isImplementsList*/ false ) ;
1189
+ }
1169
1190
}
1170
1191
emitHeritageClause ( node . name , getClassImplementsHeritageClauseElements ( node ) , /*isImplementsList*/ true ) ;
1171
1192
write ( " {" ) ;
@@ -1201,6 +1222,10 @@ namespace ts {
1201
1222
enclosingDeclaration = prevEnclosingDeclaration ;
1202
1223
}
1203
1224
1225
+ function isNonNullExpression ( node : ExpressionWithTypeArguments ) {
1226
+ return node && ! isEntityNameExpression ( node . expression ) && node . expression . kind !== SyntaxKind . NullKeyword ;
1227
+ }
1228
+
1204
1229
function emitPropertyDeclaration ( node : Declaration ) {
1205
1230
if ( hasDynamicName ( node ) ) {
1206
1231
return ;
0 commit comments