@@ -247,41 +247,69 @@ namespace ts.codefix {
247247 ) ;
248248 }
249249
250- export function createMethodFromCallExpression (
250+ export function createSignatureDeclarationFromCallExpression (
251+ kind : SyntaxKind . MethodDeclaration | SyntaxKind . FunctionDeclaration ,
251252 context : CodeFixContextBase ,
252253 importAdder : ImportAdder ,
253254 call : CallExpression ,
254- methodName : string ,
255+ name : Identifier ,
255256 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 ) ;
261260 const scriptTarget = getEmitScriptTarget ( context . program . getCompilerOptions ( ) ) ;
262- const checker = context . program . getTypeChecker ( ) ;
263261 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 ) ;
266267 const names = map ( args , arg =>
267268 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 (
272301 /*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+ ) ;
282310 }
283311
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 {
285313 const typeNode = checker . typeToTypeNode ( type , contextNode , flags , tracker ) ;
286314 if ( typeNode && isImportTypeNode ( typeNode ) ) {
287315 const importableReference = tryGetAutoImportableReferenceFromTypeNode ( typeNode , scriptTarget ) ;
@@ -381,14 +409,18 @@ namespace ts.codefix {
381409 createStubbedMethodBody ( quotePreference ) ) ;
382410 }
383411
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 {
385417 return factory . createBlock (
386418 [ factory . createThrowStatement (
387419 factory . createNewExpression (
388420 factory . createIdentifier ( "Error" ) ,
389421 /*typeArguments*/ undefined ,
390422 // TODO Handle auto quote preference.
391- [ factory . createStringLiteral ( "Method not implemented." , /*isSingleQuote*/ quotePreference === QuotePreference . Single ) ] ) ) ] ,
423+ [ factory . createStringLiteral ( text , /*isSingleQuote*/ quotePreference === QuotePreference . Single ) ] ) ) ] ,
392424 /*multiline*/ true ) ;
393425 }
394426
0 commit comments