Skip to content

Commit 6493a3a

Browse files
committed
feat: experiments.changeKindToFunction (disabled by default), change arrow functions to method kind in completions. More docs coming soon
1 parent 6c349d9 commit 6493a3a

3 files changed

Lines changed: 61 additions & 2 deletions

File tree

src/configurationType.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,11 @@ export type Configuration = {
443443
* @default false
444444
*/
445445
'experiments.excludeNonJsxCompletions': boolean
446+
/**
447+
* Wether to change funcntion completions to function kind
448+
* @default false
449+
*/
450+
'experiments.changeKindToFunction': boolean
446451
/**
447452
* Map *symbol - array of modules* to change sorting of imports - first available takes precedence in auto import code fixes (+ import all action)
448453
*
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { oneOf } from '@zardoy/utils'
2+
import { sharedCompletionContext } from './sharedContext'
3+
4+
export default (entries: ts.CompletionEntry[]) => {
5+
const { languageService } = sharedCompletionContext
6+
7+
const typeChecker = languageService.getProgram()!.getTypeChecker()!
8+
let timeSpend = 0
9+
const newEntries = entries.map(entry => {
10+
const patch = (): ts.CompletionEntry | undefined => {
11+
const { kind } = entry
12+
if (
13+
!oneOf(
14+
kind,
15+
ts.ScriptElementKind.alias,
16+
ts.ScriptElementKind.memberVariableElement,
17+
ts.ScriptElementKind.variableElement,
18+
ts.ScriptElementKind.localVariableElement,
19+
ts.ScriptElementKind.constElement,
20+
ts.ScriptElementKind.variableElement,
21+
)
22+
) {
23+
return
24+
}
25+
const symbol = entry['symbol'] as ts.Symbol | undefined
26+
if (!symbol) return
27+
const { valueDeclaration } = symbol
28+
if (!valueDeclaration) return
29+
30+
const dateNow = Date.now()
31+
const type = typeChecker.getTypeOfSymbolAtLocation(symbol, valueDeclaration)
32+
const signatures = typeChecker.getSignaturesOfType(type, ts.SignatureKind.Call)
33+
timeSpend += Date.now() - dateNow
34+
if (signatures.length === 0) return
35+
36+
return { ...entry, kind: ts.ScriptElementKind.functionElement }
37+
}
38+
39+
return patch() ?? entry
40+
})
41+
42+
// remove logging once stable
43+
console.log('changeKindToFunction time:', timeSpend)
44+
45+
return newEntries
46+
}

typescript/src/completionsAtPosition.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import escapeStringRegexp from 'escape-string-regexp'
2626
import addSourceDefinition from './completions/addSourceDefinition'
2727
import { sharedCompletionContext } from './completions/sharedContext'
2828
import displayImportedInfo from './completions/displayImportedInfo'
29+
import changeKindToFunction from './completions/changeKindToFunction'
2930

3031
export type PrevCompletionMap = Record<
3132
string,
@@ -345,8 +346,15 @@ export const getCompletionsAtPosition = (
345346
})
346347
}
347348

348-
if (prior.isGlobalCompletion) prior.entries = markOrRemoveGlobalCompletions(prior.entries, position, languageService, c) ?? prior.entries
349-
if (exactNode) prior.entries = filterJsxElements(prior.entries, exactNode, position, languageService, c) ?? prior.entries
349+
if (prior.isGlobalCompletion) {
350+
prior.entries = markOrRemoveGlobalCompletions(prior.entries, position, languageService, c) ?? prior.entries
351+
}
352+
if (exactNode) {
353+
prior.entries = filterJsxElements(prior.entries, exactNode, position, languageService, c) ?? prior.entries
354+
}
355+
if (c('experiments.changeKindToFunction')) {
356+
prior.entries = changeKindToFunction(prior.entries)
357+
}
350358

351359
if (c('correctSorting.enable')) {
352360
prior.entries = prior.entries.map(({ ...entry }, index) => ({

0 commit comments

Comments
 (0)