Skip to content

Commit 15c69b4

Browse files
committed
refactor: move getCompletionEntryDetails impl into its own file
1 parent 49e6f9c commit 15c69b4

3 files changed

Lines changed: 74 additions & 71 deletions

File tree

typescript/src/completionEntryDetails.ts

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
import { oneOf } from '@zardoy/utils'
22
import { getParameterListParts } from './completions/snippetForFunctionCall'
3-
import { PrevCompletionsAdditionalData } from './completionsAtPosition'
3+
import { PrevCompletionMap, PrevCompletionsAdditionalData } from './completionsAtPosition'
4+
import namespaceAutoImports from './namespaceAutoImports'
45
import { GetConfig } from './types'
56

6-
export default (
7-
languageService: ts.LanguageService,
8-
c: GetConfig,
9-
fileName: string,
10-
position: number,
11-
sourceFile: ts.SourceFile,
12-
prior: ts.CompletionEntryDetails,
13-
{ enableMethodCompletion }: PrevCompletionsAdditionalData,
14-
) => {
7+
const handleMethodSnippets = (prior: ts.CompletionEntryDetails, c: GetConfig, { enableMethodCompletion }: PrevCompletionsAdditionalData) => {
158
if (
169
c('enableMethodSnippets') &&
1710
oneOf(
@@ -65,3 +58,72 @@ export default (
6558
}
6659
return prior
6760
}
61+
62+
export default function completionEntryDetails(
63+
inputArgs: Parameters<ts.LanguageService['getCompletionEntryDetails']>,
64+
languageService: ts.LanguageService,
65+
prevCompletionsMap: PrevCompletionMap,
66+
c: GetConfig,
67+
prevCompletionsAdittionalData: PrevCompletionsAdditionalData,
68+
): ts.CompletionEntryDetails | undefined {
69+
const [fileName, position, entryName, formatOptions, source, preferences, data] = inputArgs
70+
const program = languageService.getProgram()
71+
const sourceFile = program?.getSourceFile(fileName)
72+
if (!program || !sourceFile) return
73+
74+
const { documentationOverride, documentationAppend, detailPrepend } = prevCompletionsMap[entryName] ?? {}
75+
if (documentationOverride) {
76+
return {
77+
name: entryName,
78+
kind: ts.ScriptElementKind.alias,
79+
kindModifiers: '',
80+
displayParts: typeof documentationOverride === 'string' ? [{ kind: 'text', text: documentationOverride }] : documentationOverride,
81+
}
82+
}
83+
const prior = languageService.getCompletionEntryDetails(
84+
fileName,
85+
position,
86+
prevCompletionsMap[entryName]?.originalName || entryName,
87+
formatOptions,
88+
source,
89+
preferences,
90+
data,
91+
)
92+
if (!prior) return
93+
if (source) {
94+
const namespaceImport = namespaceAutoImports(
95+
c,
96+
languageService.getProgram()!.getSourceFile(fileName)!,
97+
source,
98+
preferences ?? {},
99+
formatOptions ?? {},
100+
position,
101+
entryName,
102+
prior,
103+
)
104+
if (namespaceImport) {
105+
const { textChanges, description } = namespaceImport
106+
const namespace = textChanges[0]!.newText.slice(0, -1)
107+
// todo-low think of cleanin up builtin code actions descriptions
108+
prior.codeActions = [
109+
// ...(prior.codeActions ?? []),
110+
{
111+
description: description,
112+
changes: [
113+
{
114+
fileName,
115+
textChanges,
116+
},
117+
],
118+
},
119+
]
120+
}
121+
}
122+
if (detailPrepend) {
123+
prior.displayParts = [{ kind: 'text', text: detailPrepend }, ...prior.displayParts]
124+
}
125+
if (documentationAppend) {
126+
prior.documentation = [...(prior.documentation ?? []), { kind: 'text', text: documentationAppend }]
127+
}
128+
return handleMethodSnippets(prior, c, prevCompletionsAdittionalData)
129+
}

typescript/src/decorateProxy.ts

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -78,66 +78,7 @@ export const decorateLanguageService = (
7878
return result.completions
7979
}
8080

81-
proxy.getCompletionEntryDetails = (fileName, position, entryName, formatOptions, source, preferences, data) => {
82-
const program = languageService.getProgram()
83-
const sourceFile = program?.getSourceFile(fileName)
84-
if (!program || !sourceFile) return
85-
const { documentationOverride, documentationAppend, detailPrepend } = prevCompletionsMap[entryName] ?? {}
86-
if (documentationOverride) {
87-
return {
88-
name: entryName,
89-
kind: ts.ScriptElementKind.alias,
90-
kindModifiers: '',
91-
displayParts: typeof documentationOverride === 'string' ? [{ kind: 'text', text: documentationOverride }] : documentationOverride,
92-
}
93-
}
94-
const prior = languageService.getCompletionEntryDetails(
95-
fileName,
96-
position,
97-
prevCompletionsMap[entryName]?.originalName || entryName,
98-
formatOptions,
99-
source,
100-
preferences,
101-
data,
102-
)
103-
if (!prior) return
104-
if (source) {
105-
const namespaceImport = namespaceAutoImports(
106-
c,
107-
languageService.getProgram()!.getSourceFile(fileName)!,
108-
source,
109-
preferences ?? {},
110-
formatOptions ?? {},
111-
position,
112-
entryName,
113-
prior,
114-
)
115-
if (namespaceImport) {
116-
const { textChanges, description } = namespaceImport
117-
const namespace = textChanges[0]!.newText.slice(0, -1)
118-
// todo-low think of cleanin up builtin code actions descriptions
119-
prior.codeActions = [
120-
// ...(prior.codeActions ?? []),
121-
{
122-
description: description,
123-
changes: [
124-
{
125-
fileName,
126-
textChanges,
127-
},
128-
],
129-
},
130-
]
131-
}
132-
}
133-
if (detailPrepend) {
134-
prior.displayParts = [{ kind: 'text', text: detailPrepend }, ...prior.displayParts]
135-
}
136-
if (documentationAppend) {
137-
prior.documentation = [...(prior.documentation ?? []), { kind: 'text', text: documentationAppend }]
138-
}
139-
return completionEntryDetails(languageService, c, fileName, position, sourceFile, prior, prevCompletionsAdittionalData)
140-
}
81+
proxy.getCompletionEntryDetails = (...inputArgs) => completionEntryDetails(inputArgs, languageService, prevCompletionsMap, c, prevCompletionsAdittionalData)
14182

14283
decorateCodeActions(proxy, languageService, c)
14384
decorateCodeFixes(proxy, languageService, c, languageServiceHost)

typescript/test/completions.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ test('In Keyword Completions', () => {
494494
if ('/*|*/' in a) {}
495495
`)
496496
const completion = pickObj(getCompletionsAtPosition(pos!, { shouldHave: true })!, 'entriesSorted', 'prevCompletionsMap')
497-
// TODO this test is bad case of demonstrating how it can be used with string in union (IT SHOULDNT!)
497+
// this test is bad case of demonstrating how it can be used with string in union (IT SHOULDNT!)
498498
// but it is here to ensure this is no previous crash issue, indexes are correct when used only with objects
499499
expect(completion).toMatchInlineSnapshot(`
500500
{

0 commit comments

Comments
 (0)