Skip to content

Commit da98720

Browse files
author
Ilya Golovin
committed
feat(asSuggestions): add asSuggestions
1 parent 15bee04 commit da98720

3 files changed

Lines changed: 31 additions & 0 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { findChildContainingExactPosition } from '../utils'
2+
import { sharedCompletionContext } from './sharedContext'
3+
4+
export default () => {
5+
const typeChecker = sharedCompletionContext.program.getTypeChecker()
6+
const { position, fullText, prior } = sharedCompletionContext
7+
if (!fullText.slice(0, position - 1).endsWith('as')) return
8+
const node = findChildContainingExactPosition(sharedCompletionContext.sourceFile, position - 2)
9+
if (!node || !ts.isAsExpression(node)) return
10+
const typeAtLocation = typeChecker.getTypeAtLocation(node.expression)
11+
const type = typeChecker.typeToString(typeAtLocation)
12+
const widenType = typeChecker.typeToString(typeChecker.getBaseTypeOfLiteralType(typeAtLocation))
13+
14+
if (type !== widenType) {
15+
prior.entries.push({
16+
kind: ts.ScriptElementKind.unknown,
17+
name: widenType,
18+
sortText: '!',
19+
})
20+
}
21+
prior.entries.push({
22+
kind: ts.ScriptElementKind.unknown,
23+
name: type,
24+
sortText: '!',
25+
})
26+
}

typescript/src/completions/sharedContext.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ export const sharedCompletionContext = {} as unknown as Readonly<{
1414
c: GetConfig
1515
formatOptions: ts.FormatCodeSettings
1616
preferences: ts.UserPreferences
17+
fullText: string
1718
// languageServiceHost: ts.LanguageServiceHost
1819
}>

typescript/src/completionsAtPosition.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import stringTemplateTypeCompletions from './completions/stringTemplateType'
3131
import localityBonus from './completions/localityBonus'
3232
import functionCompletions from './completions/functionCompletions'
3333
import staticHintSuggestions from './completions/staticHintSuggestions'
34+
import asSuggestions from './completions/asSuggestions'
3435

3536
export type PrevCompletionMap = Record<
3637
string,
@@ -139,6 +140,7 @@ export const getCompletionsAtPosition = (
139140
formatOptions: formatOptions || {},
140141
preferences: options || {},
141142
prior: prior!,
143+
fullText: sourceFile.getFullText(),
142144
} satisfies typeof sharedCompletionContext)
143145

144146
if (node && !hasSuggestions && ensurePrior() && prior) {
@@ -296,9 +298,11 @@ export const getCompletionsAtPosition = (
296298
if (c('improveJsxCompletions') && leftNode) prior.entries = improveJsxCompletions(prior.entries, leftNode, position, sourceFile, c('jsxCompletionsMap'))
297299

298300
prior.entries = localityBonus(prior.entries) ?? prior.entries
301+
asSuggestions()
299302
prior.entries.push(...(staticHintSuggestions() ?? []))
300303

301304
const processedEntries = new Set<ts.CompletionEntry>()
305+
302306
for (const rule of c('replaceSuggestions')) {
303307
if (rule.filter?.fileNamePattern) {
304308
// todo replace with something better

0 commit comments

Comments
 (0)