@@ -112,20 +112,20 @@ namespace ts.refactor.convertArrowFunctionOrFunctionExpression {
112
112
113
113
function getFunctionInfo ( file : SourceFile , startPosition : number , program : Program ) : FunctionInfo | undefined {
114
114
const token = getTokenAtPosition ( file , startPosition ) ;
115
-
116
- const arrowFunc = getArrowFunctionFromVariableDeclaration ( token . parent ) ;
117
- if ( arrowFunc && ! containingThis ( arrowFunc . body ) ) return { selectedVariableDeclaration : true , func : arrowFunc } ;
118
-
119
- const maybeFunc = getContainingFunction ( token ) ;
120
115
const typeChecker = program . getTypeChecker ( ) ;
116
+ const func = tryGetFunctionFromVariableDeclaration ( file , typeChecker , token . parent ) ;
117
+ if ( func && ! containingThis ( func . body ) ) {
118
+ return { selectedVariableDeclaration : true , func } ;
119
+ }
121
120
121
+ const maybeFunc = getContainingFunction ( token ) ;
122
122
if (
123
123
maybeFunc &&
124
124
( isFunctionExpression ( maybeFunc ) || isArrowFunction ( maybeFunc ) ) &&
125
125
! rangeContainsRange ( maybeFunc . body , token ) &&
126
126
! containingThis ( maybeFunc . body )
127
127
) {
128
- if ( ( isFunctionExpression ( maybeFunc ) && maybeFunc . name && FindAllReferences . Core . isSymbolReferencedInFile ( maybeFunc . name , typeChecker , file ) ) ) return undefined ;
128
+ if ( isFunctionExpression ( maybeFunc ) && isFunctionReferencedInFile ( file , typeChecker , maybeFunc ) ) return undefined ;
129
129
return { selectedVariableDeclaration : false , func : maybeFunc } ;
130
130
}
131
131
@@ -136,13 +136,16 @@ namespace ts.refactor.convertArrowFunctionOrFunctionExpression {
136
136
return isVariableDeclaration ( parent ) || ( isVariableDeclarationList ( parent ) && parent . declarations . length === 1 ) ;
137
137
}
138
138
139
- function getArrowFunctionFromVariableDeclaration ( parent : Node ) : ArrowFunction | undefined {
140
- if ( ! isSingleVariableDeclaration ( parent ) ) return undefined ;
141
- const variableDeclaration = isVariableDeclaration ( parent ) ? parent : parent . declarations [ 0 ] ;
142
-
139
+ function tryGetFunctionFromVariableDeclaration ( sourceFile : SourceFile , typeChecker : TypeChecker , parent : Node ) : ArrowFunction | FunctionExpression | undefined {
140
+ if ( ! isSingleVariableDeclaration ( parent ) ) {
141
+ return undefined ;
142
+ }
143
+ const variableDeclaration = isVariableDeclaration ( parent ) ? parent : first ( parent . declarations ) ;
143
144
const initializer = variableDeclaration . initializer ;
144
- if ( ! initializer || ! isArrowFunction ( initializer ) ) return undefined ;
145
- return initializer ;
145
+ if ( initializer && ( isArrowFunction ( initializer ) || isFunctionExpression ( initializer ) && ! isFunctionReferencedInFile ( sourceFile , typeChecker , initializer ) ) ) {
146
+ return initializer ;
147
+ }
148
+ return undefined ;
146
149
}
147
150
148
151
function convertToBlock ( body : ConciseBody ) : Block {
@@ -213,4 +216,8 @@ namespace ts.refactor.convertArrowFunctionOrFunctionExpression {
213
216
function canBeConvertedToExpression ( body : Block , head : Statement ) : head is ReturnStatement {
214
217
return body . statements . length === 1 && ( ( isReturnStatement ( head ) && ! ! head . expression ) ) ;
215
218
}
219
+
220
+ function isFunctionReferencedInFile ( sourceFile : SourceFile , typeChecker : TypeChecker , node : FunctionExpression ) : boolean {
221
+ return ! ! node . name && FindAllReferences . Core . isSymbolReferencedInFile ( node . name , typeChecker , sourceFile ) ;
222
+ }
216
223
}
0 commit comments