Skip to content

Commit e6c5c9c

Browse files
committed
feat: add more suggestions by additionalTypesSuggestions (not controlled by setting)
1 parent b4b6481 commit e6c5c9c

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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
3+
const typeChecker = program.getTypeChecker()
4+
const { constraint } = leftNode.parent.parent
5+
if (!constraint) return
6+
const type = typeChecker.getTypeAtLocation(constraint)
7+
if (!(type.flags & ts.TypeFlags.Union)) return
8+
const { types } = (type as any) ?? {}
9+
const values: string[] = types.map(({ value }) => (typeof value === 'string' ? value : undefined)).filter(Boolean)
10+
return values.map(
11+
(value): ts.CompletionEntry => ({
12+
name: value,
13+
kind: ts.ScriptElementKind.string,
14+
sortText: '',
15+
}),
16+
)
17+
}

typescript/src/completionsAtPosition.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import arrayMethods from './completions/arrayMethods'
1212
import prepareTextForEmmet from './specialCommands/prepareTextForEmmet'
1313
import objectLiteralHelpers from './completions/objectLiteralHelpers'
1414
import switchCaseExcludeCovered from './completions/switchCaseExcludeCovered'
15+
import additionalTypesSuggestions from './completions/additionalTypesSuggestions'
1516

1617
export type PrevCompletionMap = Record<string, { originalName?: string; documentationOverride?: string | ts.SymbolDisplayPart[] }>
1718

@@ -40,6 +41,7 @@ export const getCompletionsAtPosition = (
4041
if (!prior) prior = { entries: [], isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: false }
4142
return true
4243
}
44+
const hasSuggestions = prior && prior.entries.filter(({ kind }) => kind !== ts.ScriptElementKind.warning).length !== 0
4345
const node = findChildContainingPosition(ts, sourceFile, position)
4446
/** node that is one character behind
4547
* useful as in most cases we work with node that is behind the cursor */
@@ -87,9 +89,10 @@ export const getCompletionsAtPosition = (
8789
// #endregion
8890
}
8991
}
90-
const addSignatureAccessCompletions = prior?.entries.filter(({ kind }) => kind !== ts.ScriptElementKind.warning).length
91-
? []
92-
: indexSignatureAccessCompletions(position, node, scriptSnapshot, sourceFile, program)
92+
if (leftNode && !hasSuggestions && ensurePrior() && prior) {
93+
prior.entries = additionalTypesSuggestions(prior.entries, program, leftNode) ?? prior.entries
94+
}
95+
const addSignatureAccessCompletions = hasSuggestions ? [] : indexSignatureAccessCompletions(position, node, scriptSnapshot, sourceFile, program)
9396
if (addSignatureAccessCompletions.length && ensurePrior() && prior) {
9497
prior.entries = [...prior.entries, ...addSignatureAccessCompletions]
9598
}

0 commit comments

Comments
 (0)