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,27 @@ 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"
12
21
}
13
- export type Log = ( message : string ) => void ;
22
+
23
+ enum SortTextId {
24
+ LocalDeclarationPriority ,
25
+ LocationPriority ,
26
+ OptionalMember ,
27
+ MemberDeclaredBySpreadAssignment ,
28
+ SuggestedClassMembers ,
29
+ GlobalsOrKeywords ,
30
+ AutoImportSuggestions
31
+ }
32
+
33
+ const DeprecatedSortTextStart = SortTextId . AutoImportSuggestions + 2 ; // for Javascript identifiers since with this change they are preferred over deprecated symbols
14
34
15
35
/**
16
36
* Special values for `CompletionInfo['source']` used to disambiguate
@@ -105,8 +125,8 @@ namespace ts.Completions {
105
125
*/
106
126
type SymbolOriginInfoMap = Record < number , SymbolOriginInfo > ;
107
127
108
- /** Map from symbol id -> SortText . */
109
- type SymbolSortTextMap = ( SortText | undefined ) [ ] ;
128
+ /** Map from symbol id -> SortTextId . */
129
+ type SymbolSortTextIdMap = ( SortTextId | undefined ) [ ] ;
110
130
111
131
const enum KeywordCompletionFilters {
112
132
None , // No keywords
@@ -205,7 +225,7 @@ namespace ts.Completions {
205
225
isJsxIdentifierExpected,
206
226
importCompletionNode,
207
227
insideJsDocTagTypeExpression,
208
- symbolToSortTextMap ,
228
+ symbolToSortTextIdMap ,
209
229
} = completionData ;
210
230
211
231
// Verify if the file is JSX language variant
@@ -238,7 +258,7 @@ namespace ts.Completions {
238
258
importCompletionNode ,
239
259
recommendedCompletion ,
240
260
symbolToOriginInfoMap ,
241
- symbolToSortTextMap
261
+ symbolToSortTextIdMap
242
262
) ;
243
263
getJSCompletionEntries ( sourceFile , location . pos , uniqueNames , compilerOptions . target ! , entries ) ; // TODO: GH#18217
244
264
}
@@ -266,7 +286,7 @@ namespace ts.Completions {
266
286
importCompletionNode ,
267
287
recommendedCompletion ,
268
288
symbolToOriginInfoMap ,
269
- symbolToSortTextMap
289
+ symbolToSortTextIdMap
270
290
) ;
271
291
}
272
292
@@ -566,7 +586,7 @@ namespace ts.Completions {
566
586
importCompletionNode ?: Node ,
567
587
recommendedCompletion ?: Symbol ,
568
588
symbolToOriginInfoMap ?: SymbolOriginInfoMap ,
569
- symbolToSortTextMap ?: SymbolSortTextMap ,
589
+ symbolToSortTextIdMap ?: SymbolSortTextIdMap ,
570
590
) : UniqueNameSet {
571
591
const start = timestamp ( ) ;
572
592
const variableDeclaration = getVariableDeclaration ( location ) ;
@@ -580,14 +600,17 @@ namespace ts.Completions {
580
600
const symbol = symbols [ i ] ;
581
601
const origin = symbolToOriginInfoMap ?. [ i ] ;
582
602
const info = getCompletionEntryDisplayNameForSymbol ( symbol , target , origin , kind , ! ! jsxIdentifierExpected ) ;
583
- if ( ! info || uniques . get ( info . name ) || kind === CompletionKind . Global && symbolToSortTextMap && ! shouldIncludeSymbol ( symbol , symbolToSortTextMap ) ) {
603
+ if ( ! info || uniques . get ( info . name ) || kind === CompletionKind . Global && symbolToSortTextIdMap && ! shouldIncludeSymbol ( symbol , symbolToSortTextIdMap ) ) {
584
604
continue ;
585
605
}
586
606
587
607
const { name, needsConvertPropertyAccess } = info ;
608
+ const symbolId = getSymbolId ( symbol ) ;
609
+ const sortTextId = symbolToSortTextIdMap ?. [ symbolId ] ?? SortTextId . LocationPriority ;
610
+ const sortText = ( isDeprecated ( symbol , typeChecker ) ? DeprecatedSortTextStart + sortTextId : sortTextId ) . toString ( ) as SortText ;
588
611
const entry = createCompletionEntry (
589
612
symbol ,
590
- symbolToSortTextMap && symbolToSortTextMap [ getSymbolId ( symbol ) ] || SortText . LocationPriority ,
613
+ sortText ,
591
614
contextToken ,
592
615
location ,
593
616
sourceFile ,
@@ -623,7 +646,7 @@ namespace ts.Completions {
623
646
add : name => uniques . set ( name , true ) ,
624
647
} ;
625
648
626
- function shouldIncludeSymbol ( symbol : Symbol , symbolToSortTextMap : SymbolSortTextMap ) : boolean {
649
+ function shouldIncludeSymbol ( symbol : Symbol , symbolToSortTextIdMap : SymbolSortTextIdMap ) : boolean {
627
650
if ( ! isSourceFile ( location ) ) {
628
651
// export = /**/ here we want to get all meanings, so any symbol is ok
629
652
if ( isExportAssignment ( location . parent ) ) {
@@ -645,9 +668,9 @@ namespace ts.Completions {
645
668
// Auto Imports are not available for scripts so this conditional is always false
646
669
if ( ! ! sourceFile . externalModuleIndicator
647
670
&& ! compilerOptions . allowUmdGlobalAccess
648
- && symbolToSortTextMap [ getSymbolId ( symbol ) ] === SortText . GlobalsOrKeywords
649
- && ( symbolToSortTextMap [ getSymbolId ( symbolOrigin ) ] === SortText . AutoImportSuggestions
650
- || symbolToSortTextMap [ getSymbolId ( symbolOrigin ) ] === SortText . LocationPriority ) ) {
671
+ && symbolToSortTextIdMap [ getSymbolId ( symbol ) ] === SortTextId . GlobalsOrKeywords
672
+ && ( symbolToSortTextIdMap [ getSymbolId ( symbolOrigin ) ] === SortTextId . AutoImportSuggestions
673
+ || symbolToSortTextIdMap [ getSymbolId ( symbolOrigin ) ] === SortTextId . LocationPriority ) ) {
651
674
return false ;
652
675
}
653
676
// Continue with origin symbol
@@ -669,8 +692,6 @@ namespace ts.Completions {
669
692
}
670
693
}
671
694
672
-
673
-
674
695
function getLabelCompletionAtPosition ( node : BreakOrContinueStatement ) : CompletionInfo | undefined {
675
696
const entries = getLabelStatementCompletions ( node ) ;
676
697
if ( entries . length ) {
@@ -912,7 +933,7 @@ namespace ts.Completions {
912
933
readonly previousToken : Node | undefined ;
913
934
readonly isJsxInitializer : IsJsxInitializer ;
914
935
readonly insideJsDocTagTypeExpression : boolean ;
915
- readonly symbolToSortTextMap : SymbolSortTextMap ;
936
+ readonly symbolToSortTextIdMap : SymbolSortTextIdMap ;
916
937
readonly isTypeOnlyLocation : boolean ;
917
938
/** In JSX tag name and attribute names, identifiers like "my-tag" or "aria-name" is valid identifier. */
918
939
readonly isJsxIdentifierExpected : boolean ;
@@ -1239,7 +1260,7 @@ namespace ts.Completions {
1239
1260
// This also gets mutated in nested-functions after the return
1240
1261
let symbols : Symbol [ ] = [ ] ;
1241
1262
const symbolToOriginInfoMap : SymbolOriginInfoMap = [ ] ;
1242
- const symbolToSortTextMap : SymbolSortTextMap = [ ] ;
1263
+ const symbolToSortTextIdMap : SymbolSortTextIdMap = [ ] ;
1243
1264
const seenPropertySymbols = new Map < SymbolId , true > ( ) ;
1244
1265
const isTypeOnly = isTypeOnlyCompletion ( ) ;
1245
1266
const getModuleSpecifierResolutionHost = memoizeOne ( ( isFromPackageJson : boolean ) => {
@@ -1295,7 +1316,7 @@ namespace ts.Completions {
1295
1316
previousToken,
1296
1317
isJsxInitializer,
1297
1318
insideJsDocTagTypeExpression,
1298
- symbolToSortTextMap ,
1319
+ symbolToSortTextIdMap ,
1299
1320
isTypeOnlyLocation : isTypeOnly ,
1300
1321
isJsxIdentifierExpected,
1301
1322
importCompletionNode,
@@ -1484,7 +1505,7 @@ namespace ts.Completions {
1484
1505
1485
1506
function addSymbolSortInfo ( symbol : Symbol ) {
1486
1507
if ( isStaticProperty ( symbol ) ) {
1487
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . LocalDeclarationPriority ;
1508
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . LocalDeclarationPriority ;
1488
1509
}
1489
1510
}
1490
1511
@@ -1601,7 +1622,7 @@ namespace ts.Completions {
1601
1622
for ( const symbol of symbols ) {
1602
1623
if ( ! typeChecker . isArgumentsSymbol ( symbol ) &&
1603
1624
! some ( symbol . declarations , d => d . getSourceFile ( ) === sourceFile ) ) {
1604
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . GlobalsOrKeywords ;
1625
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . GlobalsOrKeywords ;
1605
1626
}
1606
1627
}
1607
1628
@@ -1612,7 +1633,7 @@ namespace ts.Completions {
1612
1633
for ( const symbol of getPropertiesForCompletion ( thisType , typeChecker ) ) {
1613
1634
symbolToOriginInfoMap [ symbols . length ] = { kind : SymbolOriginInfoKind . ThisType } ;
1614
1635
symbols . push ( symbol ) ;
1615
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . SuggestedClassMembers ;
1636
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . SuggestedClassMembers ;
1616
1637
}
1617
1638
}
1618
1639
}
@@ -1694,7 +1715,7 @@ namespace ts.Completions {
1694
1715
return false ;
1695
1716
}
1696
1717
1697
- /** Mutates `symbols`, `symbolToOriginInfoMap`, and `symbolToSortTextMap ` */
1718
+ /** Mutates `symbols`, `symbolToOriginInfoMap`, and `symbolToSortTextIdMap ` */
1698
1719
function collectAutoImports ( resolveModuleSpecifiers : boolean ) {
1699
1720
if ( ! shouldOfferImportCompletions ( ) ) return ;
1700
1721
Debug . assert ( ! detailsEntryId ?. data ) ;
@@ -1765,12 +1786,12 @@ namespace ts.Completions {
1765
1786
1766
1787
function pushAutoImportSymbol ( symbol : Symbol , origin : SymbolOriginInfoResolvedExport | SymbolOriginInfoExport ) {
1767
1788
const symbolId = getSymbolId ( symbol ) ;
1768
- if ( symbolToSortTextMap [ symbolId ] === SortText . GlobalsOrKeywords ) {
1789
+ if ( symbolToSortTextIdMap [ symbolId ] === SortTextId . GlobalsOrKeywords ) {
1769
1790
// If an auto-importable symbol is available as a global, don't add the auto import
1770
1791
return ;
1771
1792
}
1772
1793
symbolToOriginInfoMap [ symbols . length ] = origin ;
1773
- symbolToSortTextMap [ symbolId ] = importCompletionNode ? SortText . LocationPriority : SortText . AutoImportSuggestions ;
1794
+ symbolToSortTextIdMap [ symbolId ] = importCompletionNode ? SortTextId . LocationPriority : SortTextId . AutoImportSuggestions ;
1774
1795
symbols . push ( symbol ) ;
1775
1796
}
1776
1797
@@ -2085,7 +2106,7 @@ namespace ts.Completions {
2085
2106
localsContainer . locals ?. forEach ( ( symbol , name ) => {
2086
2107
symbols . push ( symbol ) ;
2087
2108
if ( localsContainer . symbol ?. exports ?. has ( name ) ) {
2088
- symbolToSortTextMap [ getSymbolId ( symbol ) ] = SortText . OptionalMember ;
2109
+ symbolToSortTextIdMap [ getSymbolId ( symbol ) ] = SortTextId . OptionalMember ;
2089
2110
}
2090
2111
} ) ;
2091
2112
return GlobalsSearch . Success ;
@@ -2533,7 +2554,8 @@ namespace ts.Completions {
2533
2554
function setSortTextToOptionalMember ( ) {
2534
2555
symbols . forEach ( m => {
2535
2556
if ( m . flags & SymbolFlags . Optional ) {
2536
- symbolToSortTextMap [ getSymbolId ( m ) ] = symbolToSortTextMap [ getSymbolId ( m ) ] || SortText . OptionalMember ;
2557
+ const symbolId = getSymbolId ( m ) ;
2558
+ symbolToSortTextIdMap [ symbolId ] = symbolToSortTextIdMap [ symbolId ] ?? SortTextId . OptionalMember ;
2537
2559
}
2538
2560
} ) ;
2539
2561
}
@@ -2545,7 +2567,7 @@ namespace ts.Completions {
2545
2567
}
2546
2568
for ( const contextualMemberSymbol of contextualMemberSymbols ) {
2547
2569
if ( membersDeclaredBySpreadAssignment . has ( contextualMemberSymbol . name ) ) {
2548
- symbolToSortTextMap [ getSymbolId ( contextualMemberSymbol ) ] = SortText . MemberDeclaredBySpreadAssignment ;
2570
+ symbolToSortTextIdMap [ getSymbolId ( contextualMemberSymbol ) ] = SortTextId . MemberDeclaredBySpreadAssignment ;
2549
2571
}
2550
2572
}
2551
2573
}
@@ -3091,4 +3113,9 @@ namespace ts.Completions {
3091
3113
addToSeen ( seenModules , getSymbolId ( sym ) ) &&
3092
3114
checker . getExportsOfModule ( sym ) . some ( e => symbolCanBeReferencedAtTypeLocation ( e , checker , seenModules ) ) ;
3093
3115
}
3116
+
3117
+ function isDeprecated ( symbol : Symbol , checker : TypeChecker ) {
3118
+ const declarations = skipAlias ( symbol , checker ) . declarations ;
3119
+ return ! ! length ( declarations ) && every ( declarations , isDeprecatedDeclaration ) ;
3120
+ }
3094
3121
}
0 commit comments