@@ -1506,15 +1506,6 @@ namespace ts.Completions {
1506
1506
return GlobalsSearch . Success ;
1507
1507
}
1508
1508
1509
- // Set SortText to OptionalMember if it is an optinoal member
1510
- function setSortTextToOptionalMember ( ) {
1511
- symbols . forEach ( m => {
1512
- if ( SymbolDisplay . getSymbolModifiers ( m ) === "optional" ) {
1513
- symbolToSortTextMap [ getSymbolId ( m ) ] = symbolToSortTextMap [ getSymbolId ( m ) ] || SortText . OptionalMember ;
1514
- }
1515
- } ) ;
1516
- }
1517
-
1518
1509
/**
1519
1510
* Aggregates relevant symbols for completion in import clauses and export clauses
1520
1511
* whose declarations have a module specifier; for instance, symbols will be aggregated for
@@ -1884,7 +1875,7 @@ namespace ts.Completions {
1884
1875
return contextualMemberSymbols ;
1885
1876
}
1886
1877
1887
- const membersDeclaredBySpreadAssignment : Symbol [ ] = [ ] ;
1878
+ const membersDeclaredBySpreadAssignment = createMap < boolean > ( ) ;
1888
1879
const existingMemberNames = createUnderscoreEscapedMap < boolean > ( ) ;
1889
1880
for ( const m of existingMembers ) {
1890
1881
// Ignore omitted expressions for missing members
@@ -1911,7 +1902,9 @@ namespace ts.Completions {
1911
1902
const type = symbol && typeChecker . getTypeOfSymbolAtLocation ( symbol , expression ) ;
1912
1903
const properties = type && ( < ObjectType > type ) . properties ;
1913
1904
if ( properties ) {
1914
- membersDeclaredBySpreadAssignment . push ( ...properties ) ;
1905
+ properties . forEach ( property => {
1906
+ membersDeclaredBySpreadAssignment . set ( property . name , true ) ;
1907
+ } ) ;
1915
1908
}
1916
1909
}
1917
1910
else if ( isBindingElement ( m ) && m . propertyName ) {
@@ -1932,18 +1925,28 @@ namespace ts.Completions {
1932
1925
}
1933
1926
1934
1927
const filteredSymbols = contextualMemberSymbols . filter ( m => ! existingMemberNames . get ( m . escapedName ) ) ;
1935
- setSortTextToMemberDeclaredBySpreadAssignment ( membersDeclaredBySpreadAssignment , contextualMemberSymbols ) ;
1928
+ setSortTextToMemberDeclaredBySpreadAssignment ( membersDeclaredBySpreadAssignment , filteredSymbols ) ;
1936
1929
1937
1930
return filteredSymbols ;
1938
1931
}
1939
1932
1933
+ // Set SortText to OptionalMember if it is an optinoal member
1934
+ function setSortTextToOptionalMember ( ) {
1935
+ symbols . forEach ( m => {
1936
+ if ( m . flags & SymbolFlags . Optional ) {
1937
+ symbolToSortTextMap [ getSymbolId ( m ) ] = symbolToSortTextMap [ getSymbolId ( m ) ] || SortText . OptionalMember ;
1938
+ }
1939
+ } ) ;
1940
+ }
1941
+
1940
1942
// Set SortText to MemberDeclaredBySpreadAssignment if it is fulfilled by spread assignment
1941
- function setSortTextToMemberDeclaredBySpreadAssignment ( membersDeclaredBySpreadAssignment : Symbol [ ] , contextualMemberSymbols : Symbol [ ] ) : void {
1942
- for ( const fulfilledSymbol of membersDeclaredBySpreadAssignment ) {
1943
- for ( const contextualMemberSymbol of contextualMemberSymbols ) {
1944
- if ( contextualMemberSymbol . name === fulfilledSymbol . name ) {
1945
- symbolToSortTextMap [ getSymbolId ( contextualMemberSymbol ) ] = SortText . MemberDeclaredBySpreadAssignment ;
1946
- }
1943
+ function setSortTextToMemberDeclaredBySpreadAssignment ( membersDeclaredBySpreadAssignment : Map < boolean > , contextualMemberSymbols : Symbol [ ] ) : void {
1944
+ if ( membersDeclaredBySpreadAssignment . size === 0 ) {
1945
+ return ;
1946
+ }
1947
+ for ( const contextualMemberSymbol of contextualMemberSymbols ) {
1948
+ if ( membersDeclaredBySpreadAssignment . has ( contextualMemberSymbol . name ) ) {
1949
+ symbolToSortTextMap [ getSymbolId ( contextualMemberSymbol ) ] = SortText . MemberDeclaredBySpreadAssignment ;
1947
1950
}
1948
1951
}
1949
1952
}
@@ -1999,7 +2002,7 @@ namespace ts.Completions {
1999
2002
*/
2000
2003
function filterJsxAttributes ( symbols : Symbol [ ] , attributes : NodeArray < JsxAttribute | JsxSpreadAttribute > ) : Symbol [ ] {
2001
2004
const seenNames = createUnderscoreEscapedMap < boolean > ( ) ;
2002
- const membersDeclaredBySpreadAssignment : Symbol [ ] = [ ] ;
2005
+ const membersDeclaredBySpreadAssignment = createMap < boolean > ( ) ;
2003
2006
for ( const attr of attributes ) {
2004
2007
// If this is the current item we are editing right now, do not filter it out
2005
2008
if ( isCurrentlyEditingNode ( attr ) ) {
@@ -2015,7 +2018,9 @@ namespace ts.Completions {
2015
2018
const type = symbol && typeChecker . getTypeOfSymbolAtLocation ( symbol , expression ) ;
2016
2019
const properties = type && ( < ObjectType > type ) . properties ;
2017
2020
if ( properties ) {
2018
- membersDeclaredBySpreadAssignment . push ( ...properties ) ;
2021
+ properties . forEach ( property => {
2022
+ membersDeclaredBySpreadAssignment . set ( property . name , true ) ;
2023
+ } ) ;
2019
2024
}
2020
2025
}
2021
2026
}
0 commit comments