@@ -30,10 +30,10 @@ export default (entries: ts.CompletionEntry[], _node: ts.Node | undefined, posit
3030 if ( postfixRemoveLength === undefined ) return entries
3131 const nodeBeforeDot = findChildContainingPosition ( ts , sourceFile , position - postfixRemoveLength - 1 )
3232 if ( ! nodeBeforeDot ) return entries
33- if ( ! ts . isIdentifier ( nodeBeforeDot ) ) return entries
34- const cleanSourceText = nodeBeforeDot . text . replace ( / ^ (?: a l l ) ? ( .+ ?) (?: L i s t ) ? $ / , '$1' )
35- let inferredName = singular ( cleanSourceText )
33+ const cleanSourceText = getItemNameFromNode ( nodeBeforeDot ) ?. replace ( / ^ (?: a l l ) ? ( .+ ?) (?: L i s t ) ? $ / , '$1' )
34+ let inferredName = cleanSourceText && singular ( cleanSourceText )
3635 const defaultItemName = c ( 'arrayMethodsSnippets.defaultItemName' )
36+ // both can be undefined
3737 if ( inferredName === cleanSourceText ) {
3838 if ( defaultItemName === false ) return entries
3939 inferredName = defaultItemName
@@ -50,3 +50,15 @@ export default (entries: ts.CompletionEntry[], _node: ts.Node | undefined, posit
5050 }
5151 } )
5252}
53+
54+ const getItemNameFromNode = ( node : ts . Node ) => {
55+ if ( ts . isIdentifier ( node ) ) return node . text
56+ if ( ts . isCallExpression ( node ) && ts . isPropertyAccessExpression ( node . parent ) ) {
57+ node = node . parent
58+ while ( ts . isCallExpression ( node ) || ts . isPropertyAccessExpression ( node ) ) {
59+ node = node . expression
60+ if ( ts . isIdentifier ( node ) ) return node . text
61+ }
62+ }
63+ return undefined
64+ }
0 commit comments