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" ,
@@ -10,7 +12,17 @@ namespace ts.Completions {
10
12
AutoImportSuggestions = "6" ,
11
13
JavascriptIdentifiers = "7"
12
14
}
13
- export type Log = ( message : string ) => void ;
15
+
16
+ enum SortTextId {
17
+ LocalDeclarationPriority ,
18
+ LocationPriority ,
19
+ OptionalMember ,
20
+ MemberDeclaredBySpreadAssignment ,
21
+ SuggestedClassMembers ,
22
+ GlobalsOrKeywords ,
23
+ AutoImportSuggestions ,
24
+ Deprecated
25
+ }
14
26
15
27
/**
16
28
* Special values for `CompletionInfo['source']` used to disambiguate
@@ -105,8 +117,8 @@ namespace ts.Completions {
105
117
*/
106
118
type SymbolOriginInfoMap = Record < number , SymbolOriginInfo > ;
107
119
108
- /** Map from symbol id -> SortText . */
109
- type SymbolSortTextMap = ( SortText | undefined ) [ ] ;
120
+ /** Map from symbol id -> SortTextId . */
121
+ type SymbolSortTextIdMap = ( SortTextId | undefined ) [ ] ;
110
122
111
123
const enum KeywordCompletionFilters {
112
124
None , // No keywords
@@ -205,7 +217,7 @@ namespace ts.Completions {
205
217
isJsxIdentifierExpected,
206
218
importCompletionNode,
207
219
insideJsDocTagTypeExpression,
208
- symbolToSortTextMap ,
220
+ symbolToSortTextIdMap ,
209
221
} = completionData ;
210
222
211
223
// Verify if the file is JSX language variant
@@ -238,7 +250,7 @@ namespace ts.Completions {
238
250
importCompletionNode ,
239
251
recommendedCompletion ,
240
252
symbolToOriginInfoMap ,
241
- symbolToSortTextMap
253
+ symbolToSortTextIdMap
242
254
) ;
243
255
getJSCompletionEntries ( sourceFile , location . pos , uniqueNames , compilerOptions . target ! , entries ) ; // TODO: GH#18217
244
256
}
@@ -266,7 +278,7 @@ namespace ts.Completions {
266
278
importCompletionNode ,
267
279
recommendedCompletion ,
268
280
symbolToOriginInfoMap ,
269
- symbolToSortTextMap
281
+ symbolToSortTextIdMap
270
282
) ;
271
283
}
272
284
@@ -389,7 +401,7 @@ namespace ts.Completions {
389
401
390
402
function createCompletionEntry (
391
403
symbol : Symbol ,
392
- sortText : SortText ,
404
+ sortText : string ,
393
405
contextToken : Node | undefined ,
394
406
location : Node ,
395
407
sourceFile : SourceFile ,
@@ -566,7 +578,7 @@ namespace ts.Completions {
566
578
importCompletionNode ?: Node ,
567
579
recommendedCompletion ?: Symbol ,
568
580
symbolToOriginInfoMap ?: SymbolOriginInfoMap ,
569
- symbolToSortTextMap ?: SymbolSortTextMap ,
581
+ symbolToSortTextIdMap ?: SymbolSortTextIdMap ,
570
582
) : UniqueNameSet {
571
583
const start = timestamp ( ) ;
572
584
const variableDeclaration = getVariableDeclaration ( location ) ;
@@ -580,14 +592,16 @@ namespace ts.Completions {
580
592
const symbol = symbols [ i ] ;
581
593
const origin = symbolToOriginInfoMap ?. [ i ] ;
582
594
const info = getCompletionEntryDisplayNameForSymbol ( symbol , target , origin , kind , ! ! jsxIdentifierExpected ) ;
583
- if ( ! info || uniques . get ( info . name ) || kind === CompletionKind . Global && symbolToSortTextMap && ! shouldIncludeSymbol ( symbol , symbolToSortTextMap ) ) {
595
+ if ( ! info || uniques . get ( info . name ) || kind === CompletionKind . Global && symbolToSortTextIdMap && ! shouldIncludeSymbol ( symbol , symbolToSortTextIdMap ) ) {
584
596
continue ;
585
597
}
586
598
587
599
const { name, needsConvertPropertyAccess } = info ;
600
+ const sortTextId = symbolToSortTextIdMap && symbolToSortTextIdMap [ getSymbolId ( symbol ) ] || SortTextId . LocationPriority ;
601
+ const sortText = ( isDeprecated ( symbol , typeChecker ) ? sortTextId + SortTextId . Deprecated : sortTextId ) . toString ( ) ;
588
602
const entry = createCompletionEntry (
589
603
symbol ,
590
- symbolToSortTextMap && symbolToSortTextMap [ getSymbolId ( symbol ) ] || SortText . LocationPriority ,
604
+ sortText ,
591
605
contextToken ,
592
606
location ,
593
607
sourceFile ,
@@ -623,7 +637,7 @@ namespace ts.Completions {
623
637
add : name => uniques . set ( name , true ) ,
624
638
} ;
625
639
626
- function shouldIncludeSymbol ( symbol : Symbol , symbolToSortTextMap : SymbolSortTextMap ) : boolean {
640
+ function shouldIncludeSymbol ( symbol : Symbol , symbolToSortTextIdMap : SymbolSortTextIdMap ) : boolean {
627
641
if ( ! isSourceFile ( location ) ) {
628
642
// export = /**/ here we want to get all meanings, so any symbol is ok
629
643
if ( isExportAssignment ( location . parent ) ) {
@@ -645,9 +659,9 @@ namespace ts.Completions {
645
659
// Auto Imports are not available for scripts so this conditional is always false
646
660
if ( ! ! sourceFile . externalModuleIndicator
647
661
&& ! compilerOptions . allowUmdGlobalAccess
648
- && symbolToSortTextMap [ getSymbolId ( symbol ) ] === SortText . GlobalsOrKeywords
649
- && ( symbolToSortTextMap [ getSymbolId ( symbolOrigin ) ] === SortText . AutoImportSuggestions
650
- || symbolToSortTextMap [ getSymbolId ( symbolOrigin ) ] === SortText . LocationPriority ) ) {
662
+ && symbolToSortTextIdMap [ getSymbolId ( symbol ) ] === SortTextId . GlobalsOrKeywords
663
+ && ( symbolToSortTextIdMap [ getSymbolId ( symbolOrigin ) ] === SortTextId . AutoImportSuggestions
664
+ || symbolToSortTextIdMap [ getSymbolId ( symbolOrigin ) ] === SortTextId . LocationPriority ) ) {
651
665
return false ;
652
666
}
653
667
// Continue with origin symbol
@@ -912,7 +926,7 @@ namespace ts.Completions {
912
926
readonly previousToken : Node | undefined ;
913
927
readonly isJsxInitializer : IsJsxInitializer ;
914
928
readonly insideJsDocTagTypeExpression : boolean ;
915
- readonly symbolToSortTextMap : SymbolSortTextMap ;
929
+ readonly symbolToSortTextIdMap : SymbolSortTextIdMap ;
916
930
readonly isTypeOnlyLocation : boolean ;
917
931
/** In JSX tag name and attribute names, identifiers like "my-tag" or "aria-name" is valid identifier. */
918
932
readonly isJsxIdentifierExpected : boolean ;
@@ -1239,7 +1253,7 @@ namespace ts.Completions {
1239
1253
// This also gets mutated in nested-functions after the return
1240
1254
let symbols : Symbol [ ] = [ ] ;
1241
1255
const symbolToOriginInfoMap : SymbolOriginInfoMap = [ ] ;
1242
- const symbolToSortTextMap : SymbolSortTextMap = [ ] ;
1256
+ const symbolToSortTextIdMap : SymbolSortTextIdMap = [ ] ;
1243
1257
const seenPropertySymbols = new Map < SymbolId , true > ( ) ;
1244
1258
const isTypeOnly = isTypeOnlyCompletion ( ) ;
1245
1259
const getModuleSpecifierResolutionHost = memoizeOne ( ( isFromPackageJson : boolean ) => {
@@ -1295,7 +1309,7 @@ namespace ts.Completions {
1295
1309
previousToken,
1296
1310
isJsxInitializer,
1297
1311
insideJsDocTagTypeExpression,
1298
- symbolToSortTextMap ,
1312
+ symbolToSortTextIdMap ,
1299
1313
isTypeOnlyLocation : isTypeOnly ,
1300
1314
isJsxIdentifierExpected,
1301
1315
importCompletionNode,
@@ -1484,7 +1498,7 @@ namespace ts.Completions {
1484
1498
1485
1499
function addSymbolSortInfo ( symbol : Symbol ) {
1486
1500
if ( isStaticProperty ( symbol ) ) {
1487
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . LocalDeclarationPriority ;
1501
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . LocalDeclarationPriority ;
1488
1502
}
1489
1503
}
1490
1504
@@ -1601,7 +1615,7 @@ namespace ts.Completions {
1601
1615
for ( const symbol of symbols ) {
1602
1616
if ( ! typeChecker . isArgumentsSymbol ( symbol ) &&
1603
1617
! some ( symbol . declarations , d => d . getSourceFile ( ) === sourceFile ) ) {
1604
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . GlobalsOrKeywords ;
1618
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . GlobalsOrKeywords ;
1605
1619
}
1606
1620
}
1607
1621
@@ -1612,7 +1626,7 @@ namespace ts.Completions {
1612
1626
for ( const symbol of getPropertiesForCompletion ( thisType , typeChecker ) ) {
1613
1627
symbolToOriginInfoMap [ symbols . length ] = { kind : SymbolOriginInfoKind . ThisType } ;
1614
1628
symbols . push ( symbol ) ;
1615
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . SuggestedClassMembers ;
1629
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . SuggestedClassMembers ;
1616
1630
}
1617
1631
}
1618
1632
}
@@ -1694,7 +1708,7 @@ namespace ts.Completions {
1694
1708
return false ;
1695
1709
}
1696
1710
1697
- /** Mutates `symbols`, `symbolToOriginInfoMap`, and `symbolToSortTextMap ` */
1711
+ /** Mutates `symbols`, `symbolToOriginInfoMap`, and `symbolToSortTextIdMap ` */
1698
1712
function collectAutoImports ( resolveModuleSpecifiers : boolean ) {
1699
1713
if ( ! shouldOfferImportCompletions ( ) ) return ;
1700
1714
Debug . assert ( ! detailsEntryId ?. data ) ;
@@ -1765,12 +1779,12 @@ namespace ts.Completions {
1765
1779
1766
1780
function pushAutoImportSymbol ( symbol : Symbol , origin : SymbolOriginInfoResolvedExport | SymbolOriginInfoExport ) {
1767
1781
const symbolId = getSymbolId ( symbol ) ;
1768
- if ( symbolToSortTextMap [ symbolId ] === SortText . GlobalsOrKeywords ) {
1782
+ if ( symbolToSortTextIdMap [ symbolId ] === SortTextId . GlobalsOrKeywords ) {
1769
1783
// If an auto-importable symbol is available as a global, don't add the auto import
1770
1784
return ;
1771
1785
}
1772
1786
symbolToOriginInfoMap [ symbols . length ] = origin ;
1773
- symbolToSortTextMap [ symbolId ] = importCompletionNode ? SortText . LocationPriority : SortText . AutoImportSuggestions ;
1787
+ symbolToSortTextIdMap [ symbolId ] = importCompletionNode ? SortTextId . LocationPriority : SortTextId . AutoImportSuggestions ;
1774
1788
symbols . push ( symbol ) ;
1775
1789
}
1776
1790
@@ -2085,7 +2099,7 @@ namespace ts.Completions {
2085
2099
localsContainer . locals ?. forEach ( ( symbol , name ) => {
2086
2100
symbols . push ( symbol ) ;
2087
2101
if ( localsContainer . symbol ?. exports ?. has ( name ) ) {
2088
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . OptionalMember ;
2102
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . OptionalMember ;
2089
2103
}
2090
2104
} ) ;
2091
2105
return GlobalsSearch . Success ;
@@ -2533,7 +2547,7 @@ namespace ts.Completions {
2533
2547
function setSortTextToOptionalMember ( ) {
2534
2548
symbols . forEach ( m => {
2535
2549
if ( m . flags & SymbolFlags . Optional ) {
2536
- symbolToSortTextMap [ getSymbolId ( m ) ] = symbolToSortTextMap [ getSymbolId ( m ) ] || SortText . OptionalMember ;
2550
+ symbolToSortTextIdMap [ getSymbolId ( m ) ] = symbolToSortTextIdMap [ getSymbolId ( m ) ] || SortTextId . OptionalMember ;
2537
2551
}
2538
2552
} ) ;
2539
2553
}
@@ -2545,7 +2559,7 @@ namespace ts.Completions {
2545
2559
}
2546
2560
for ( const contextualMemberSymbol of contextualMemberSymbols ) {
2547
2561
if ( membersDeclaredBySpreadAssignment . has ( contextualMemberSymbol . name ) ) {
2548
- symbolToSortTextMap [ getSymbolId ( contextualMemberSymbol ) ] = SortText . MemberDeclaredBySpreadAssignment ;
2562
+ symbolToSortTextIdMap [ getSymbolId ( contextualMemberSymbol ) ] = SortTextId . MemberDeclaredBySpreadAssignment ;
2549
2563
}
2550
2564
}
2551
2565
}
@@ -3091,4 +3105,9 @@ namespace ts.Completions {
3091
3105
addToSeen ( seenModules , getSymbolId ( sym ) ) &&
3092
3106
checker . getExportsOfModule ( sym ) . some ( e => symbolCanBeReferencedAtTypeLocation ( e , checker , seenModules ) ) ;
3093
3107
}
3108
+
3109
+ function isDeprecated ( symbol : Symbol , checker : TypeChecker ) {
3110
+ const declarations = skipAlias ( symbol , checker ) . declarations ;
3111
+ return ! ! length ( declarations ) && every ( declarations , isDeprecatedDeclaration ) ;
3112
+ }
3094
3113
}
0 commit comments