|
1 | 1 | import { oneOf } from '@zardoy/utils' |
2 | 2 | import { getParameterListParts } from './completions/snippetForFunctionCall' |
3 | | -import { PrevCompletionsAdditionalData } from './completionsAtPosition' |
| 3 | +import { PrevCompletionMap, PrevCompletionsAdditionalData } from './completionsAtPosition' |
| 4 | +import namespaceAutoImports from './namespaceAutoImports' |
4 | 5 | import { GetConfig } from './types' |
5 | 6 |
|
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) => { |
15 | 8 | if ( |
16 | 9 | c('enableMethodSnippets') && |
17 | 10 | oneOf( |
@@ -65,3 +58,72 @@ export default ( |
65 | 58 | } |
66 | 59 | return prior |
67 | 60 | } |
| 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 | +} |
0 commit comments