Skip to content

Commit 0a74910

Browse files
committed
feat: Omit<..., ""> suggestions
1 parent 150a064 commit 0a74910

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

typescript/src/completions/additionalTypesSuggestions.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,33 @@
1-
export default (entries: ts.CompletionEntry[], program: ts.Program, leftNode: ts.Node) => {
2-
if (!ts.isStringLiteral(leftNode) || !ts.isTypeParameterDeclaration(leftNode.parent.parent) || leftNode.parent.parent.default !== leftNode.parent) return
1+
export default (entries: ts.CompletionEntry[], program: ts.Program, node: ts.Node) => {
2+
if (!ts.isStringLiteral(node)) return
33
const typeChecker = program.getTypeChecker()
4-
const { constraint } = leftNode.parent.parent
4+
if (ts.isLiteralTypeNode(node.parent)) {
5+
node = node.parent
6+
const previousValues: string[] = []
7+
if (node.parent.kind === ts.SyntaxKind.UnionType) {
8+
;(node.parent as ts.UnionTypeNode).types.forEach(type => {
9+
if (ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal)) {
10+
previousValues.push(type.literal.text)
11+
}
12+
})
13+
node = node.parent
14+
}
15+
if (ts.isTypeReferenceNode(node.parent) && node.parent.typeName.getText() === 'Omit' && node.parent.typeArguments?.[1] === node) {
16+
// Omit<..., '|'> suggestions
17+
const type = typeChecker.getTypeFromTypeNode(node.parent.typeArguments[0]!)
18+
type.getProperties().forEach(({ name }) => {
19+
if (previousValues.includes(name)) return
20+
entries.push({
21+
name,
22+
kind: ts.ScriptElementKind.string,
23+
sortText: '',
24+
})
25+
})
26+
return
27+
}
28+
}
29+
if (!ts.isTypeParameterDeclaration(node.parent) || node.parent.default !== node) return
30+
const { constraint } = node.parent
531
if (!constraint) return
632
const type = typeChecker.getTypeAtLocation(constraint)
733
if (!(type.flags & ts.TypeFlags.Union)) return

typescript/src/completionsAtPosition.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ export const getCompletionsAtPosition = (
9696
}
9797
// #endregion
9898
}
99-
if (leftNode && !hasSuggestions && ensurePrior() && prior) {
100-
prior.entries = additionalTypesSuggestions(prior.entries, program, leftNode) ?? prior.entries
99+
if (node && !hasSuggestions && ensurePrior() && prior) {
100+
prior.entries = additionalTypesSuggestions(prior.entries, program, node) ?? prior.entries
101101
}
102102
const addSignatureAccessCompletions = hasSuggestions ? [] : indexSignatureAccessCompletions(position, node, scriptSnapshot, sourceFile, program)
103103
if (addSignatureAccessCompletions.length && ensurePrior() && prior) {

typescript/src/globals.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import('ts-expose-internals')
33
declare let ts: typeof import('typescript')
44
declare let tsFull: typeof import('typescript-full')
55

6+
declare type FullChecker = import('typescript-full').TypeChecker
7+
declare type FullSourceFile = import('typescript-full').SourceFile
8+
69
// declare type ts = import('typescript')
710
// export {}
811
// export * from 'typescript'

0 commit comments

Comments
 (0)