@@ -247,41 +247,51 @@ namespace ts.codefix {
247
247
) ;
248
248
}
249
249
250
- export function createMethodFromCallExpression (
250
+ export function createFunctionFromCallExpression < T extends FunctionDeclaration | MethodDeclaration > (
251
+ kind : T [ "kind" ] | SyntaxKind . MethodDeclaration ,
251
252
context : CodeFixContextBase ,
252
253
importAdder : ImportAdder ,
253
254
call : CallExpression ,
254
- methodName : string ,
255
+ name : Identifier | string ,
255
256
modifierFlags : ModifierFlags ,
256
- contextNode : Node ,
257
- inJs : boolean
258
- ) : MethodDeclaration {
259
- const body = ! isInterfaceDeclaration ( contextNode ) ;
260
- const { typeArguments, arguments : args , parent } = call ;
257
+ contextNode : Node
258
+ ) : T {
259
+ const quotePreference = getQuotePreference ( context . sourceFile , context . preferences ) ;
261
260
const scriptTarget = getEmitScriptTarget ( context . program . getCompilerOptions ( ) ) ;
262
- const checker = context . program . getTypeChecker ( ) ;
263
261
const tracker = getNoopSymbolTrackerWithResolver ( context ) ;
264
- const types = map ( args , arg =>
265
- typeToAutoImportableTypeNode ( checker , importAdder , checker . getBaseTypeOfLiteralType ( checker . getTypeAtLocation ( arg ) ) , contextNode , scriptTarget , /*flags*/ undefined , tracker ) ) ;
262
+ const checker = context . program . getTypeChecker ( ) ;
263
+ const isJs = isInJSFile ( contextNode ) ;
264
+ const { typeArguments, arguments : args , parent } = call ;
265
+
266
+ const contextualType = isJs ? undefined : checker . getContextualType ( call ) ;
266
267
const names = map ( args , arg =>
267
268
isIdentifier ( arg ) ? arg . text : isPropertyAccessExpression ( arg ) && isIdentifier ( arg . name ) ? arg . name . text : undefined ) ;
268
- const contextualType = checker . getContextualType ( call ) ;
269
- const returnType = ( inJs || ! contextualType ) ? undefined : checker . typeToTypeNode ( contextualType , contextNode , /*flags*/ undefined , tracker ) ;
270
- const quotePreference = getQuotePreference ( context . sourceFile , context . preferences ) ;
271
- return factory . createMethodDeclaration (
272
- /*decorators*/ undefined ,
273
- /*modifiers*/ modifierFlags ? factory . createNodeArray ( factory . createModifiersFromModifierFlags ( modifierFlags ) ) : undefined ,
274
- /*asteriskToken*/ isYieldExpression ( parent ) ? factory . createToken ( SyntaxKind . AsteriskToken ) : undefined ,
275
- methodName ,
276
- /*questionToken*/ undefined ,
277
- /*typeParameters*/ inJs ? undefined : map ( typeArguments , ( _ , i ) =>
278
- factory . createTypeParameterDeclaration ( CharacterCodes . T + typeArguments ! . length - 1 <= CharacterCodes . Z ? String . fromCharCode ( CharacterCodes . T + i ) : `T${ i } ` ) ) ,
279
- /*parameters*/ createDummyParameters ( args . length , names , types , /*minArgumentCount*/ undefined , inJs ) ,
280
- /*type*/ returnType ,
281
- body ? createStubbedMethodBody ( quotePreference ) : undefined ) ;
269
+ const types = isJs ? [ ] : map ( args , arg =>
270
+ typeToAutoImportableTypeNode ( checker , importAdder , checker . getBaseTypeOfLiteralType ( checker . getTypeAtLocation ( arg ) ) , contextNode , scriptTarget , /*flags*/ undefined , tracker ) ) ;
271
+
272
+ const modifiers = modifierFlags
273
+ ? factory . createNodeArray ( factory . createModifiersFromModifierFlags ( modifierFlags ) )
274
+ : undefined ;
275
+ const asteriskToken = isYieldExpression ( parent )
276
+ ? factory . createToken ( SyntaxKind . AsteriskToken )
277
+ : undefined ;
278
+ const typeParameters = isJs || typeArguments === undefined
279
+ ? undefined
280
+ : map ( typeArguments , ( _ , i ) =>
281
+ factory . createTypeParameterDeclaration ( CharacterCodes . T + typeArguments . length - 1 <= CharacterCodes . Z ? String . fromCharCode ( CharacterCodes . T + i ) : `T${ i } ` ) ) ;
282
+ const parameters = createDummyParameters ( args . length , names , types , /*minArgumentCount*/ undefined , isJs ) ;
283
+ const type = isJs || contextualType === undefined
284
+ ? undefined
285
+ : checker . typeToTypeNode ( contextualType , contextNode , /*flags*/ undefined , tracker ) ;
286
+
287
+ if ( kind === SyntaxKind . MethodDeclaration ) {
288
+ const body = isInterfaceDeclaration ( contextNode ) ? undefined : createStubbedMethodBody ( quotePreference ) ;
289
+ return factory . createMethodDeclaration ( /*decorators*/ undefined , modifiers , asteriskToken , name , /*questionToken*/ undefined , typeParameters , parameters , type , body ) as T ;
290
+ }
291
+ return factory . createFunctionDeclaration ( /*decorators*/ undefined , modifiers , asteriskToken , name , typeParameters , parameters , type , createStubbedBody ( "Function not implemented." , quotePreference ) ) as T ;
282
292
}
283
293
284
- export function typeToAutoImportableTypeNode ( checker : TypeChecker , importAdder : ImportAdder , type : Type , contextNode : Node , scriptTarget : ScriptTarget , flags ?: NodeBuilderFlags , tracker ?: SymbolTracker ) : TypeNode | undefined {
294
+ export function typeToAutoImportableTypeNode ( checker : TypeChecker , importAdder : ImportAdder , type : Type , contextNode : Node | undefined , scriptTarget : ScriptTarget , flags ?: NodeBuilderFlags , tracker ?: SymbolTracker ) : TypeNode | undefined {
285
295
const typeNode = checker . typeToTypeNode ( type , contextNode , flags , tracker ) ;
286
296
if ( typeNode && isImportTypeNode ( typeNode ) ) {
287
297
const importableReference = tryGetAutoImportableReferenceFromTypeNode ( typeNode , scriptTarget ) ;
@@ -381,14 +391,18 @@ namespace ts.codefix {
381
391
createStubbedMethodBody ( quotePreference ) ) ;
382
392
}
383
393
384
- function createStubbedMethodBody ( quotePreference : QuotePreference ) : Block {
394
+ function createStubbedMethodBody ( quotePreference : QuotePreference ) {
395
+ return createStubbedBody ( "Method not implemented." , quotePreference ) ;
396
+ }
397
+
398
+ export function createStubbedBody ( text : string , quotePreference : QuotePreference ) : Block {
385
399
return factory . createBlock (
386
400
[ factory . createThrowStatement (
387
401
factory . createNewExpression (
388
402
factory . createIdentifier ( "Error" ) ,
389
403
/*typeArguments*/ undefined ,
390
404
// TODO Handle auto quote preference.
391
- [ factory . createStringLiteral ( "Method not implemented." , /*isSingleQuote*/ quotePreference === QuotePreference . Single ) ] ) ) ] ,
405
+ [ factory . createStringLiteral ( text , /*isSingleQuote*/ quotePreference === QuotePreference . Single ) ] ) ) ] ,
392
406
/*multiline*/ true ) ;
393
407
}
394
408
0 commit comments