@@ -91,7 +91,6 @@ import {
9191 hasEffectiveModifier ,
9292 hasEffectiveReadonlyModifier ,
9393 hasExtension ,
94- HasInferredType ,
9594 hasJSDocNodes ,
9695 HasModifiers ,
9796 hasSyntacticModifier ,
@@ -818,7 +817,21 @@ export function transformDeclarations(context: TransformationContext) {
818817 return factory . createTypeReferenceNode ( "invalid" ) ;
819818 }
820819
821- function ensureType ( node : HasInferredType | ExportAssignment , type : TypeNode | undefined , ignorePrivate ?: boolean ) : TypeNode | undefined {
820+ type HasInferredType =
821+ | FunctionDeclaration
822+ | MethodDeclaration
823+ | GetAccessorDeclaration
824+ | BindingElement
825+ | ConstructSignatureDeclaration
826+ | VariableDeclaration
827+ | MethodSignature
828+ | CallSignatureDeclaration
829+ | ParameterDeclaration
830+ | PropertyDeclaration
831+ | PropertySignature
832+ | ExportAssignment ;
833+
834+ function ensureType ( node : HasInferredType , type : TypeNode | undefined , ignorePrivate ?: boolean ) : TypeNode | undefined {
822835 if ( ! ignorePrivate && hasEffectiveModifier ( node , ModifierFlags . Private ) ) {
823836 // Private nodes emit no types (except private parameter properties, whose parameter types are actually visible)
824837 return ;
@@ -926,10 +939,10 @@ export function transformDeclarations(context: TransformationContext) {
926939 }
927940 return diag ;
928941 }
929- function transformExpressionToTypeNode ( node : Expression , inferenceFlags : InitializeTransformNarrowBehavior = InitializeTransformNarrowBehavior . None ) : TypeNode | undefined {
942+ function typeFromExpression ( node : Expression , inferenceFlags : InitializeTransformNarrowBehavior = InitializeTransformNarrowBehavior . None ) : TypeNode | undefined {
930943 switch ( node . kind ) {
931944 case SyntaxKind . ParenthesizedExpression :
932- return transformExpressionToTypeNode ( ( node as ParenthesizedExpression ) . expression , inferenceFlags & InitializeTransformNarrowBehavior . NotKeepLiterals ) ;
945+ return typeFromExpression ( ( node as ParenthesizedExpression ) . expression , inferenceFlags & InitializeTransformNarrowBehavior . NotKeepLiterals ) ;
933946 case SyntaxKind . Identifier :
934947 if ( resolver . isUndefinedIdentifier ( node as Identifier ) ) {
935948 return createUndefinedTypeNode ( ) ;
@@ -944,12 +957,12 @@ export function transformDeclarations(context: TransformationContext) {
944957 }
945958 case SyntaxKind . ArrowFunction :
946959 case SyntaxKind . FunctionExpression :
947- return transformFunctionExpressionOrArrowFunction ( node as ArrowFunction | FunctionExpression ) ;
960+ return typeFromFunctionExpressionLike ( node as ArrowFunction | FunctionExpression ) ;
948961 case SyntaxKind . TypeAssertionExpression :
949962 case SyntaxKind . AsExpression :
950963 const asExpression = node as AsExpression | TypeAssertion ;
951964 if ( isTypeReferenceNode ( asExpression . type ) && isConstTypeReference ( asExpression . type ) ) {
952- return transformExpressionToTypeNode ( asExpression . expression , InitializeTransformNarrowBehavior . AsConst ) ;
965+ return typeFromExpression ( asExpression . expression , InitializeTransformNarrowBehavior . AsConst ) ;
953966 }
954967 else {
955968 const type = asExpression . type ;
@@ -962,32 +975,32 @@ export function transformDeclarations(context: TransformationContext) {
962975 const unaryExpression = node as PrefixUnaryExpression ;
963976 if ( isPrimitiveLiteralValue ( unaryExpression ) ) {
964977 if ( unaryExpression . operand . kind === SyntaxKind . BigIntLiteral ) {
965- return transformPrimitiveLiteralToType ( unaryExpression , SyntaxKind . BigIntKeyword , inferenceFlags ) ;
978+ return typeFromPrimitiveLiteral ( unaryExpression , SyntaxKind . BigIntKeyword , inferenceFlags ) ;
966979 }
967980 if ( unaryExpression . operand . kind === SyntaxKind . NumericLiteral ) {
968- return transformPrimitiveLiteralToType ( unaryExpression , SyntaxKind . NumberKeyword , inferenceFlags ) ;
981+ return typeFromPrimitiveLiteral ( unaryExpression , SyntaxKind . NumberKeyword , inferenceFlags ) ;
969982 }
970983 }
971984 break ;
972985 case SyntaxKind . NumericLiteral :
973- return transformPrimitiveLiteralToType ( node as NumericLiteral , SyntaxKind . NumberKeyword , inferenceFlags ) ;
986+ return typeFromPrimitiveLiteral ( node as NumericLiteral , SyntaxKind . NumberKeyword , inferenceFlags ) ;
974987 case SyntaxKind . TemplateExpression :
975988 if ( ! ( inferenceFlags & InitializeTransformNarrowBehavior . AsConstOrKeepLiterals ) ) {
976989 return factory . createKeywordTypeNode ( SyntaxKind . StringKeyword ) ;
977990 }
978991 break ;
979992 case SyntaxKind . NoSubstitutionTemplateLiteral :
980993 case SyntaxKind . StringLiteral :
981- return transformPrimitiveLiteralToType ( node as StringLiteral | NoSubstitutionTemplateLiteral , SyntaxKind . StringKeyword , inferenceFlags ) ;
994+ return typeFromPrimitiveLiteral ( node as StringLiteral | NoSubstitutionTemplateLiteral , SyntaxKind . StringKeyword , inferenceFlags ) ;
982995 case SyntaxKind . BigIntLiteral :
983- return transformPrimitiveLiteralToType ( node as BigIntLiteral , SyntaxKind . BigIntKeyword , inferenceFlags ) ;
996+ return typeFromPrimitiveLiteral ( node as BigIntLiteral , SyntaxKind . BigIntKeyword , inferenceFlags ) ;
984997 case SyntaxKind . TrueKeyword :
985998 case SyntaxKind . FalseKeyword :
986- return transformPrimitiveLiteralToType ( node as TrueLiteral | FalseLiteral , SyntaxKind . BooleanKeyword , inferenceFlags ) ;
999+ return typeFromPrimitiveLiteral ( node as TrueLiteral | FalseLiteral , SyntaxKind . BooleanKeyword , inferenceFlags ) ;
9871000 case SyntaxKind . ArrayLiteralExpression :
988- return transformArrayLiteralToType ( node as ArrayLiteralExpression , inferenceFlags ) ;
1001+ return typeFromArrayLiteral ( node as ArrayLiteralExpression , inferenceFlags ) ;
9891002 case SyntaxKind . ObjectLiteralExpression :
990- return transformObjectLiteralExpressionToType ( node as ObjectLiteralExpression , inferenceFlags ) ;
1003+ return typeFromObjectLiteral ( node as ObjectLiteralExpression , inferenceFlags ) ;
9911004 }
9921005 return undefined ;
9931006 }
@@ -1035,13 +1048,13 @@ export function transformDeclarations(context: TransformationContext) {
10351048 }
10361049 switch ( node . kind ) {
10371050 case SyntaxKind . Parameter :
1038- typeNode = transformParameterInitializerToTypeNode ( node , type ) ;
1051+ typeNode = typeFromParameter ( node , type ) ;
10391052 break ;
10401053 case SyntaxKind . VariableDeclaration :
1041- typeNode = transformVariableInitializerToTypeNode ( node , type ) ;
1054+ typeNode = typeFromVariable ( node , type ) ;
10421055 break ;
10431056 case SyntaxKind . PropertyDeclaration :
1044- typeNode = transformPropertyToTypeNode ( node , type ) ;
1057+ typeNode = typeFromProperty ( node , type ) ;
10451058 break ;
10461059 case SyntaxKind . GetAccessor :
10471060 const allAccessors = resolver . getAllAccessorDeclarations ( node ) ;
@@ -1077,7 +1090,7 @@ export function transformDeclarations(context: TransformationContext) {
10771090 }
10781091 break ;
10791092 case SyntaxKind . ExportAssignment :
1080- typeNode = transformExpressionToTypeNode ( node . expression , InitializeTransformNarrowBehavior . KeepLiterals ) ?? typeInferenceForExpression ( node . expression , createExpressionError ) ;
1093+ typeNode = typeFromExpression ( node . expression , InitializeTransformNarrowBehavior . KeepLiterals ) ?? typeInferenceForExpression ( node . expression , createExpressionError ) ;
10811094 break ;
10821095 default :
10831096 Debug . assertNever ( node , `Node needs to be an inferrable type found ${ Debug . formatSyntaxKind ( ( node as Node ) . kind ) } ` ) ;
@@ -1090,7 +1103,7 @@ export function transformDeclarations(context: TransformationContext) {
10901103 }
10911104 return typeNode ;
10921105 }
1093- function transformFunctionExpressionOrArrowFunction ( fnNode : FunctionExpression | ArrowFunction ) {
1106+ function typeFromFunctionExpressionLike ( fnNode : FunctionExpression | ArrowFunction ) {
10941107 const oldEnclosingDeclaration = enclosingDeclaration ;
10951108 enclosingDeclaration = fnNode ;
10961109
@@ -1112,7 +1125,7 @@ export function transformDeclarations(context: TransformationContext) {
11121125 }
11131126 return true ;
11141127 }
1115- function transformArrayLiteralToType ( arrayLiteral : ArrayLiteralExpression , inferenceFlags : InitializeTransformNarrowBehavior ) {
1128+ function typeFromArrayLiteral ( arrayLiteral : ArrayLiteralExpression , inferenceFlags : InitializeTransformNarrowBehavior ) {
11161129 if ( ! ( inferenceFlags & InitializeTransformNarrowBehavior . AsConst ) ) {
11171130 return typeInferenceForExpression ( arrayLiteral , createArrayLiteralError ) ;
11181131 }
@@ -1128,7 +1141,7 @@ export function transformDeclarations(context: TransformationContext) {
11281141 ) ;
11291142 }
11301143 else {
1131- const elementType = transformExpressionToTypeNode ( element , inferenceFlags & InitializeTransformNarrowBehavior . NotKeepLiterals ) ?? typeInferenceForExpression ( element , createExpressionError ) ;
1144+ const elementType = typeFromExpression ( element , inferenceFlags & InitializeTransformNarrowBehavior . NotKeepLiterals ) ?? typeInferenceForExpression ( element , createExpressionError ) ;
11321145 elementTypesInfo . push ( elementType ) ;
11331146 }
11341147 }
@@ -1165,7 +1178,7 @@ export function transformDeclarations(context: TransformationContext) {
11651178 }
11661179 return result ;
11671180 }
1168- function transformObjectLiteralExpressionToType ( objectLiteral : ObjectLiteralExpression , inferenceFlags : InitializeTransformNarrowBehavior ) {
1181+ function typeFromObjectLiteral ( objectLiteral : ObjectLiteralExpression , inferenceFlags : InitializeTransformNarrowBehavior ) {
11691182 if ( ! canGetTypeFromObjectLiteral ( objectLiteral ) ) return typeInferenceForExpression ( objectLiteral , /*diagMessage*/ undefined ) ;
11701183
11711184 const properties : TypeElement [ ] = [ ] ;
@@ -1205,14 +1218,14 @@ export function transformDeclarations(context: TransformationContext) {
12051218 let newProp ;
12061219 switch ( prop . kind ) {
12071220 case SyntaxKind . MethodDeclaration :
1208- newProp = transformMethodDeclarationToSignature ( prop , name , inferenceFlags ) ;
1221+ newProp = typeFromMethodDeclaration ( prop , name , inferenceFlags ) ;
12091222 break ;
12101223 case SyntaxKind . PropertyAssignment :
1211- newProp = transformPropertyAssignment ( prop , name , inferenceFlags ) ;
1224+ newProp = typeFromPropertyAssignment ( prop , name , inferenceFlags ) ;
12121225 break ;
12131226 case SyntaxKind . SetAccessor :
12141227 case SyntaxKind . GetAccessor :
1215- newProp = transformAccessor ( prop , name ) ;
1228+ newProp = typeFromAccessor ( prop , name ) ;
12161229 break ;
12171230 }
12181231 if ( newProp ) {
@@ -1224,19 +1237,19 @@ export function transformDeclarations(context: TransformationContext) {
12241237 return factory . createTypeLiteralNode ( properties ) ;
12251238 }
12261239
1227- function transformPropertyAssignment ( prop : PropertyAssignment , name : PropertyName , inferenceFlags : InitializeTransformNarrowBehavior ) {
1240+ function typeFromPropertyAssignment ( prop : PropertyAssignment , name : PropertyName , inferenceFlags : InitializeTransformNarrowBehavior ) {
12281241 const modifiers = inferenceFlags & InitializeTransformNarrowBehavior . AsConst ?
12291242 [ factory . createModifier ( SyntaxKind . ReadonlyKeyword ) ] :
12301243 [ ] ;
1231- const typeNode = transformExpressionToTypeNode ( prop . initializer , inferenceFlags & InitializeTransformNarrowBehavior . NotKeepLiterals ) ?? typeInferenceForVariableLike ( prop , p => createExpressionError ( p . initializer ) ) ;
1244+ const typeNode = typeFromExpression ( prop . initializer , inferenceFlags & InitializeTransformNarrowBehavior . NotKeepLiterals ) ?? typeInferenceForVariableLike ( prop , p => createExpressionError ( p . initializer ) ) ;
12321245 return factory . createPropertySignature (
12331246 modifiers ,
12341247 name ,
12351248 /*questionToken*/ undefined ,
12361249 typeNode ,
12371250 ) ;
12381251 }
1239- function transformMethodDeclarationToSignature ( method : MethodDeclaration , name : PropertyName , inferenceFlags : InitializeTransformNarrowBehavior ) {
1252+ function typeFromMethodDeclaration ( method : MethodDeclaration , name : PropertyName , inferenceFlags : InitializeTransformNarrowBehavior ) {
12401253 const oldEnclosingDeclaration = enclosingDeclaration ;
12411254 enclosingDeclaration = method ;
12421255 try {
@@ -1274,7 +1287,7 @@ export function transformDeclarations(context: TransformationContext) {
12741287 }
12751288 }
12761289
1277- function transformAccessor ( accessor : GetAccessorDeclaration | SetAccessorDeclaration , name : PropertyName ) {
1290+ function typeFromAccessor ( accessor : GetAccessorDeclaration | SetAccessorDeclaration , name : PropertyName ) {
12781291 const allAccessors = resolver . getAllAccessorDeclarations ( accessor ) ;
12791292 const getAccessorType = allAccessors . getAccessor && getTypeAnnotationFromAccessor ( allAccessors . getAccessor ) ;
12801293 const setAccessorType = allAccessors . setAccessor && getTypeAnnotationFromAccessor ( allAccessors . setAccessor ) ;
@@ -1323,7 +1336,7 @@ export function transformDeclarations(context: TransformationContext) {
13231336 return factory . createKeywordTypeNode ( SyntaxKind . AnyKeyword ) ;
13241337 }
13251338 }
1326- function transformPrimitiveLiteralToType ( node : PrimitiveLiteral , baseType : string | KeywordTypeSyntaxKind , narrowBehavior : InitializeTransformNarrowBehavior ) {
1339+ function typeFromPrimitiveLiteral ( node : PrimitiveLiteral , baseType : string | KeywordTypeSyntaxKind , narrowBehavior : InitializeTransformNarrowBehavior ) {
13271340 if ( narrowBehavior & InitializeTransformNarrowBehavior . AsConstOrKeepLiterals ) {
13281341 return factory . createLiteralTypeNode ( clonePrimitiveLiteralValue ( node ) ) ;
13291342 }
@@ -1351,7 +1364,7 @@ export function transformDeclarations(context: TransformationContext) {
13511364 factory . createKeywordTypeNode ( SyntaxKind . UndefinedKeyword ) ,
13521365 ] ) ;
13531366 }
1354- function transformVariableInitializerToTypeNode ( node : VariableDeclaration , type : TypeNode | undefined ) {
1367+ function typeFromVariable ( node : VariableDeclaration , type : TypeNode | undefined ) {
13551368 const firstDeclaration = node . symbol . valueDeclaration ;
13561369 // Use first declaration of variable for the type
13571370 if ( node !== firstDeclaration && firstDeclaration && isVariableDeclaration ( firstDeclaration ) ) {
@@ -1389,13 +1402,13 @@ export function transformDeclarations(context: TransformationContext) {
13891402 return typeInferenceForVariableLike ( node , /*diagMessage*/ undefined ) ;
13901403 }
13911404 else {
1392- return transformExpressionToTypeNode ( node . initializer , node . parent . flags & NodeFlags . Const ? InitializeTransformNarrowBehavior . KeepLiterals : InitializeTransformNarrowBehavior . None )
1405+ return typeFromExpression ( node . initializer , node . parent . flags & NodeFlags . Const ? InitializeTransformNarrowBehavior . KeepLiterals : InitializeTransformNarrowBehavior . None )
13931406 ?? typeInferenceForVariableLike ( node , createVariableOrPropertyError ) ;
13941407 }
13951408 }
13961409 return typeInferenceForVariableLike ( node , createVariableOrPropertyError ) ;
13971410 }
1398- function transformParameterInitializerToTypeNode ( node : ParameterDeclaration , type : TypeNode | undefined ) {
1411+ function typeFromParameter ( node : ParameterDeclaration , type : TypeNode | undefined ) {
13991412 const addUndefined = resolver . requiresAddingImplicitUndefined ( node ) ;
14001413 if ( addUndefined || ( ! type && ! ( node . initializer && isIdentifier ( node . name ) ) ) ) {
14011414 if ( isolatedDeclarations ) {
@@ -1406,19 +1419,19 @@ export function transformDeclarations(context: TransformationContext) {
14061419 return visitTypeNode ( type ) ;
14071420 }
14081421 else if ( node . initializer ) {
1409- return transformExpressionToTypeNode ( node . initializer ) ?? typeInferenceForVariableLike ( node , n => createExpressionError ( n . initializer ! ) ) ;
1422+ return typeFromExpression ( node . initializer ) ?? typeInferenceForVariableLike ( node , n => createExpressionError ( n . initializer ! ) ) ;
14101423 }
14111424 return typeInferenceForVariableLike ( node , createParameterError , addUndefined ) ;
14121425 }
1413- function transformPropertyToTypeNode ( node : PropertyDeclaration , type : TypeNode | undefined ) {
1426+ function typeFromProperty ( node : PropertyDeclaration , type : TypeNode | undefined ) {
14141427 if ( type ) {
14151428 return visitTypeNode ( type ) ;
14161429 }
14171430 else if ( node . initializer ) {
14181431 let resultNode ;
14191432 const optionalFlags = isOptionalDeclaration ( node ) ? InitializeTransformNarrowBehavior . NoTypeReferences : InitializeTransformNarrowBehavior . None ;
14201433 const readonlyFlags = hasEffectiveReadonlyModifier ( node ) ? InitializeTransformNarrowBehavior . KeepLiterals : InitializeTransformNarrowBehavior . None ;
1421- resultNode = transformExpressionToTypeNode ( node . initializer , optionalFlags | readonlyFlags ) ?? typeInferenceForVariableLike ( node , createVariableOrPropertyError ) ;
1434+ resultNode = typeFromExpression ( node . initializer , optionalFlags | readonlyFlags ) ?? typeInferenceForVariableLike ( node , createVariableOrPropertyError ) ;
14221435 if ( optionalFlags && resultNode ) {
14231436 resultNode = addUndefinedInUnion ( resultNode ) ;
14241437 }
0 commit comments