@@ -247,41 +247,51 @@ namespace ts.codefix {
247247 ) ;
248248 }
249249
250- export function createMethodFromCallExpression (
250+ export function createFunctionFromCallExpression < T extends FunctionDeclaration | MethodDeclaration > (
251+ kind : T [ "kind" ] | SyntaxKind . MethodDeclaration ,
251252 context : CodeFixContextBase ,
252253 importAdder : ImportAdder ,
253254 call : CallExpression ,
254- methodName : string ,
255+ name : Identifier | string ,
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+ ) : T {
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 (
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 ;
282292 }
283293
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 {
285295 const typeNode = checker . typeToTypeNode ( type , contextNode , flags , tracker ) ;
286296 if ( typeNode && isImportTypeNode ( typeNode ) ) {
287297 const importableReference = tryGetAutoImportableReferenceFromTypeNode ( typeNode , scriptTarget ) ;
@@ -381,14 +391,18 @@ namespace ts.codefix {
381391 createStubbedMethodBody ( quotePreference ) ) ;
382392 }
383393
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 {
385399 return factory . createBlock (
386400 [ factory . createThrowStatement (
387401 factory . createNewExpression (
388402 factory . createIdentifier ( "Error" ) ,
389403 /*typeArguments*/ undefined ,
390404 // TODO Handle auto quote preference.
391- [ factory . createStringLiteral ( "Method not implemented." , /*isSingleQuote*/ quotePreference === QuotePreference . Single ) ] ) ) ] ,
405+ [ factory . createStringLiteral ( text , /*isSingleQuote*/ quotePreference === QuotePreference . Single ) ] ) ) ] ,
392406 /*multiline*/ true ) ;
393407 }
394408
0 commit comments