@@ -247,41 +247,69 @@ namespace ts.codefix {
247
247
) ;
248
248
}
249
249
250
- export function createMethodFromCallExpression (
250
+ export function createSignatureDeclarationFromCallExpression (
251
+ kind : SyntaxKind . MethodDeclaration | SyntaxKind . FunctionDeclaration ,
251
252
context : CodeFixContextBase ,
252
253
importAdder : ImportAdder ,
253
254
call : CallExpression ,
254
- methodName : string ,
255
+ name : Identifier ,
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
+ ) {
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 (
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
+ return factory . createMethodDeclaration (
289
+ /*decorators*/ undefined ,
290
+ modifiers ,
291
+ asteriskToken ,
292
+ name ,
293
+ /*questionToken*/ undefined ,
294
+ typeParameters ,
295
+ parameters ,
296
+ type ,
297
+ isInterfaceDeclaration ( contextNode ) ? undefined : createStubbedMethodBody ( quotePreference )
298
+ ) ;
299
+ }
300
+ return factory . createFunctionDeclaration (
272
301
/*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 ) ;
302
+ modifiers ,
303
+ asteriskToken ,
304
+ name ,
305
+ typeParameters ,
306
+ parameters ,
307
+ type ,
308
+ createStubbedBody ( Diagnostics . Function_not_implemented . message , quotePreference )
309
+ ) ;
282
310
}
283
311
284
- export function typeToAutoImportableTypeNode ( checker : TypeChecker , importAdder : ImportAdder , type : Type , contextNode : Node , scriptTarget : ScriptTarget , flags ?: NodeBuilderFlags , tracker ?: SymbolTracker ) : TypeNode | undefined {
312
+ export function typeToAutoImportableTypeNode ( checker : TypeChecker , importAdder : ImportAdder , type : Type , contextNode : Node | undefined , scriptTarget : ScriptTarget , flags ?: NodeBuilderFlags , tracker ?: SymbolTracker ) : TypeNode | undefined {
285
313
const typeNode = checker . typeToTypeNode ( type , contextNode , flags , tracker ) ;
286
314
if ( typeNode && isImportTypeNode ( typeNode ) ) {
287
315
const importableReference = tryGetAutoImportableReferenceFromTypeNode ( typeNode , scriptTarget ) ;
@@ -381,14 +409,18 @@ namespace ts.codefix {
381
409
createStubbedMethodBody ( quotePreference ) ) ;
382
410
}
383
411
384
- function createStubbedMethodBody ( quotePreference : QuotePreference ) : Block {
412
+ function createStubbedMethodBody ( quotePreference : QuotePreference ) {
413
+ return createStubbedBody ( Diagnostics . Method_not_implemented . message , quotePreference ) ;
414
+ }
415
+
416
+ export function createStubbedBody ( text : string , quotePreference : QuotePreference ) : Block {
385
417
return factory . createBlock (
386
418
[ factory . createThrowStatement (
387
419
factory . createNewExpression (
388
420
factory . createIdentifier ( "Error" ) ,
389
421
/*typeArguments*/ undefined ,
390
422
// TODO Handle auto quote preference.
391
- [ factory . createStringLiteral ( "Method not implemented." , /*isSingleQuote*/ quotePreference === QuotePreference . Single ) ] ) ) ] ,
423
+ [ factory . createStringLiteral ( text , /*isSingleQuote*/ quotePreference === QuotePreference . Single ) ] ) ) ] ,
392
424
/*multiline*/ true ) ;
393
425
}
394
426
0 commit comments