1
1
/* @internal */
2
2
namespace ts . Completions {
3
+ export type Log = ( message : string ) => void ;
4
+
3
5
export enum SortText {
4
6
LocalDeclarationPriority = "0" ,
5
7
LocationPriority = "1" ,
@@ -8,9 +10,28 @@ namespace ts.Completions {
8
10
SuggestedClassMembers = "4" ,
9
11
GlobalsOrKeywords = "5" ,
10
12
AutoImportSuggestions = "6" ,
11
- JavascriptIdentifiers = "7"
13
+ JavascriptIdentifiers = "7" ,
14
+ DeprecatedLocalDeclarationPriority = "8" ,
15
+ DeprecatedLocationPriority = "9" ,
16
+ DeprecatedOptionalMember = "10" ,
17
+ DeprecatedMemberDeclaredBySpreadAssignment = "11" ,
18
+ DeprecatedSuggestedClassMembers = "12" ,
19
+ DeprecatedGlobalsOrKeywords = "13" ,
20
+ DeprecatedAutoImportSuggestions = "14"
21
+ }
22
+
23
+ enum SortTextId {
24
+ LocalDeclarationPriority ,
25
+ LocationPriority ,
26
+ OptionalMember ,
27
+ MemberDeclaredBySpreadAssignment ,
28
+ SuggestedClassMembers ,
29
+ GlobalsOrKeywords ,
30
+ AutoImportSuggestions
12
31
}
13
- export type Log = ( message : string ) => void ;
32
+
33
+ // for JavaScript identifiers since they are preferred over deprecated symbols
34
+ const DeprecatedSortTextStart = SortTextId . AutoImportSuggestions + 2 ;
14
35
15
36
/**
16
37
* Special values for `CompletionInfo['source']` used to disambiguate
@@ -105,8 +126,8 @@ namespace ts.Completions {
105
126
*/
106
127
type SymbolOriginInfoMap = Record < number , SymbolOriginInfo > ;
107
128
108
- /** Map from symbol id -> SortText . */
109
- type SymbolSortTextMap = ( SortText | undefined ) [ ] ;
129
+ /** Map from symbol id -> SortTextId . */
130
+ type SymbolSortTextIdMap = ( SortTextId | undefined ) [ ] ;
110
131
111
132
const enum KeywordCompletionFilters {
112
133
None , // No keywords
@@ -221,7 +242,7 @@ namespace ts.Completions {
221
242
isJsxIdentifierExpected,
222
243
importCompletionNode,
223
244
insideJsDocTagTypeExpression,
224
- symbolToSortTextMap ,
245
+ symbolToSortTextIdMap ,
225
246
} = completionData ;
226
247
227
248
// Verify if the file is JSX language variant
@@ -254,7 +275,7 @@ namespace ts.Completions {
254
275
importCompletionNode ,
255
276
recommendedCompletion ,
256
277
symbolToOriginInfoMap ,
257
- symbolToSortTextMap
278
+ symbolToSortTextIdMap
258
279
) ;
259
280
getJSCompletionEntries ( sourceFile , location . pos , uniqueNames , compilerOptions . target ! , entries ) ; // TODO: GH#18217
260
281
}
@@ -282,7 +303,7 @@ namespace ts.Completions {
282
303
importCompletionNode ,
283
304
recommendedCompletion ,
284
305
symbolToOriginInfoMap ,
285
- symbolToSortTextMap
306
+ symbolToSortTextIdMap
286
307
) ;
287
308
}
288
309
@@ -582,7 +603,7 @@ namespace ts.Completions {
582
603
importCompletionNode ?: Node ,
583
604
recommendedCompletion ?: Symbol ,
584
605
symbolToOriginInfoMap ?: SymbolOriginInfoMap ,
585
- symbolToSortTextMap ?: SymbolSortTextMap ,
606
+ symbolToSortTextIdMap ?: SymbolSortTextIdMap ,
586
607
) : UniqueNameSet {
587
608
const start = timestamp ( ) ;
588
609
const variableDeclaration = getVariableDeclaration ( location ) ;
@@ -596,14 +617,16 @@ namespace ts.Completions {
596
617
const symbol = symbols [ i ] ;
597
618
const origin = symbolToOriginInfoMap ?. [ i ] ;
598
619
const info = getCompletionEntryDisplayNameForSymbol ( symbol , target , origin , kind , ! ! jsxIdentifierExpected ) ;
599
- if ( ! info || uniques . get ( info . name ) || kind === CompletionKind . Global && symbolToSortTextMap && ! shouldIncludeSymbol ( symbol , symbolToSortTextMap ) ) {
620
+ if ( ! info || uniques . get ( info . name ) || kind === CompletionKind . Global && symbolToSortTextIdMap && ! shouldIncludeSymbol ( symbol , symbolToSortTextIdMap ) ) {
600
621
continue ;
601
622
}
602
623
603
624
const { name, needsConvertPropertyAccess } = info ;
625
+ const sortTextId = symbolToSortTextIdMap ?. [ getSymbolId ( symbol ) ] ?? SortTextId . LocationPriority ;
626
+ const sortText = ( isDeprecated ( symbol , typeChecker ) ? DeprecatedSortTextStart + sortTextId : sortTextId ) . toString ( ) as SortText ;
604
627
const entry = createCompletionEntry (
605
628
symbol ,
606
- symbolToSortTextMap && symbolToSortTextMap [ getSymbolId ( symbol ) ] || SortText . LocationPriority ,
629
+ sortText ,
607
630
contextToken ,
608
631
location ,
609
632
sourceFile ,
@@ -639,7 +662,7 @@ namespace ts.Completions {
639
662
add : name => uniques . set ( name , true ) ,
640
663
} ;
641
664
642
- function shouldIncludeSymbol ( symbol : Symbol , symbolToSortTextMap : SymbolSortTextMap ) : boolean {
665
+ function shouldIncludeSymbol ( symbol : Symbol , symbolToSortTextIdMap : SymbolSortTextIdMap ) : boolean {
643
666
if ( ! isSourceFile ( location ) ) {
644
667
// export = /**/ here we want to get all meanings, so any symbol is ok
645
668
if ( isExportAssignment ( location . parent ) ) {
@@ -661,9 +684,9 @@ namespace ts.Completions {
661
684
// Auto Imports are not available for scripts so this conditional is always false
662
685
if ( ! ! sourceFile . externalModuleIndicator
663
686
&& ! compilerOptions . allowUmdGlobalAccess
664
- && symbolToSortTextMap [ getSymbolId ( symbol ) ] === SortText . GlobalsOrKeywords
665
- && ( symbolToSortTextMap [ getSymbolId ( symbolOrigin ) ] === SortText . AutoImportSuggestions
666
- || symbolToSortTextMap [ getSymbolId ( symbolOrigin ) ] === SortText . LocationPriority ) ) {
687
+ && symbolToSortTextIdMap [ getSymbolId ( symbol ) ] === SortTextId . GlobalsOrKeywords
688
+ && ( symbolToSortTextIdMap [ getSymbolId ( symbolOrigin ) ] === SortTextId . AutoImportSuggestions
689
+ || symbolToSortTextIdMap [ getSymbolId ( symbolOrigin ) ] === SortTextId . LocationPriority ) ) {
667
690
return false ;
668
691
}
669
692
// Continue with origin symbol
@@ -685,8 +708,6 @@ namespace ts.Completions {
685
708
}
686
709
}
687
710
688
-
689
-
690
711
function getLabelCompletionAtPosition ( node : BreakOrContinueStatement ) : CompletionInfo | undefined {
691
712
const entries = getLabelStatementCompletions ( node ) ;
692
713
if ( entries . length ) {
@@ -930,7 +951,7 @@ namespace ts.Completions {
930
951
readonly previousToken : Node | undefined ;
931
952
readonly isJsxInitializer : IsJsxInitializer ;
932
953
readonly insideJsDocTagTypeExpression : boolean ;
933
- readonly symbolToSortTextMap : SymbolSortTextMap ;
954
+ readonly symbolToSortTextIdMap : SymbolSortTextIdMap ;
934
955
readonly isTypeOnlyLocation : boolean ;
935
956
/** In JSX tag name and attribute names, identifiers like "my-tag" or "aria-name" is valid identifier. */
936
957
readonly isJsxIdentifierExpected : boolean ;
@@ -1264,7 +1285,7 @@ namespace ts.Completions {
1264
1285
// This also gets mutated in nested-functions after the return
1265
1286
let symbols : Symbol [ ] = [ ] ;
1266
1287
const symbolToOriginInfoMap : SymbolOriginInfoMap = [ ] ;
1267
- const symbolToSortTextMap : SymbolSortTextMap = [ ] ;
1288
+ const symbolToSortTextIdMap : SymbolSortTextIdMap = [ ] ;
1268
1289
const seenPropertySymbols = new Map < SymbolId , true > ( ) ;
1269
1290
const isTypeOnly = isTypeOnlyCompletion ( ) ;
1270
1291
const getModuleSpecifierResolutionHost = memoizeOne ( ( isFromPackageJson : boolean ) => {
@@ -1320,7 +1341,7 @@ namespace ts.Completions {
1320
1341
previousToken,
1321
1342
isJsxInitializer,
1322
1343
insideJsDocTagTypeExpression,
1323
- symbolToSortTextMap ,
1344
+ symbolToSortTextIdMap ,
1324
1345
isTypeOnlyLocation : isTypeOnly ,
1325
1346
isJsxIdentifierExpected,
1326
1347
importCompletionNode,
@@ -1509,7 +1530,7 @@ namespace ts.Completions {
1509
1530
1510
1531
function addSymbolSortInfo ( symbol : Symbol ) {
1511
1532
if ( isStaticProperty ( symbol ) ) {
1512
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . LocalDeclarationPriority ;
1533
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . LocalDeclarationPriority ;
1513
1534
}
1514
1535
}
1515
1536
@@ -1626,7 +1647,7 @@ namespace ts.Completions {
1626
1647
for ( const symbol of symbols ) {
1627
1648
if ( ! typeChecker . isArgumentsSymbol ( symbol ) &&
1628
1649
! some ( symbol . declarations , d => d . getSourceFile ( ) === sourceFile ) ) {
1629
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . GlobalsOrKeywords ;
1650
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . GlobalsOrKeywords ;
1630
1651
}
1631
1652
}
1632
1653
@@ -1637,7 +1658,7 @@ namespace ts.Completions {
1637
1658
for ( const symbol of getPropertiesForCompletion ( thisType , typeChecker ) ) {
1638
1659
symbolToOriginInfoMap [ symbols . length ] = { kind : SymbolOriginInfoKind . ThisType } ;
1639
1660
symbols . push ( symbol ) ;
1640
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . SuggestedClassMembers ;
1661
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . SuggestedClassMembers ;
1641
1662
}
1642
1663
}
1643
1664
}
@@ -1719,7 +1740,7 @@ namespace ts.Completions {
1719
1740
return false ;
1720
1741
}
1721
1742
1722
- /** Mutates `symbols`, `symbolToOriginInfoMap`, and `symbolToSortTextMap ` */
1743
+ /** Mutates `symbols`, `symbolToOriginInfoMap`, and `symbolToSortTextIdMap ` */
1723
1744
function collectAutoImports ( resolveModuleSpecifiers : boolean ) {
1724
1745
if ( ! shouldOfferImportCompletions ( ) ) return ;
1725
1746
Debug . assert ( ! detailsEntryId ?. data ) ;
@@ -1790,12 +1811,12 @@ namespace ts.Completions {
1790
1811
1791
1812
function pushAutoImportSymbol ( symbol : Symbol , origin : SymbolOriginInfoResolvedExport | SymbolOriginInfoExport ) {
1792
1813
const symbolId = getSymbolId ( symbol ) ;
1793
- if ( symbolToSortTextMap [ symbolId ] === SortText . GlobalsOrKeywords ) {
1814
+ if ( symbolToSortTextIdMap [ symbolId ] === SortTextId . GlobalsOrKeywords ) {
1794
1815
// If an auto-importable symbol is available as a global, don't add the auto import
1795
1816
return ;
1796
1817
}
1797
1818
symbolToOriginInfoMap [ symbols . length ] = origin ;
1798
- symbolToSortTextMap [ symbolId ] = importCompletionNode ? SortText . LocationPriority : SortText . AutoImportSuggestions ;
1819
+ symbolToSortTextIdMap [ symbolId ] = importCompletionNode ? SortTextId . LocationPriority : SortTextId . AutoImportSuggestions ;
1799
1820
symbols . push ( symbol ) ;
1800
1821
}
1801
1822
@@ -2110,7 +2131,7 @@ namespace ts.Completions {
2110
2131
localsContainer . locals ?. forEach ( ( symbol , name ) => {
2111
2132
symbols . push ( symbol ) ;
2112
2133
if ( localsContainer . symbol ?. exports ?. has ( name ) ) {
2113
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . OptionalMember ;
2134
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . OptionalMember ;
2114
2135
}
2115
2136
} ) ;
2116
2137
return GlobalsSearch . Success ;
@@ -2558,7 +2579,8 @@ namespace ts.Completions {
2558
2579
function setSortTextToOptionalMember ( ) {
2559
2580
symbols . forEach ( m => {
2560
2581
if ( m . flags & SymbolFlags . Optional ) {
2561
- symbolToSortTextMap [ getSymbolId ( m ) ] = symbolToSortTextMap [ getSymbolId ( m ) ] || SortText . OptionalMember ;
2582
+ const symbolId = getSymbolId ( m ) ;
2583
+ symbolToSortTextIdMap [ symbolId ] = symbolToSortTextIdMap [ symbolId ] ?? SortTextId . OptionalMember ;
2562
2584
}
2563
2585
} ) ;
2564
2586
}
@@ -2570,7 +2592,7 @@ namespace ts.Completions {
2570
2592
}
2571
2593
for ( const contextualMemberSymbol of contextualMemberSymbols ) {
2572
2594
if ( membersDeclaredBySpreadAssignment . has ( contextualMemberSymbol . name ) ) {
2573
- symbolToSortTextMap [ getSymbolId ( contextualMemberSymbol ) ] = SortText . MemberDeclaredBySpreadAssignment ;
2595
+ symbolToSortTextIdMap [ getSymbolId ( contextualMemberSymbol ) ] = SortTextId . MemberDeclaredBySpreadAssignment ;
2574
2596
}
2575
2597
}
2576
2598
}
@@ -3120,4 +3142,9 @@ namespace ts.Completions {
3120
3142
addToSeen ( seenModules , getSymbolId ( sym ) ) &&
3121
3143
checker . getExportsOfModule ( sym ) . some ( e => symbolCanBeReferencedAtTypeLocation ( e , checker , seenModules ) ) ;
3122
3144
}
3145
+
3146
+ function isDeprecated ( symbol : Symbol , checker : TypeChecker ) {
3147
+ const declarations = skipAlias ( symbol , checker ) . declarations ;
3148
+ return ! ! length ( declarations ) && every ( declarations , isDeprecatedDeclaration ) ;
3149
+ }
3123
3150
}
0 commit comments