@@ -1893,15 +1893,7 @@ namespace ts.Completions {
1893
1893
let existingName : __String | undefined ;
1894
1894
1895
1895
if ( isSpreadAssignment ( m ) ) {
1896
- const expression = m . expression ;
1897
- const symbol = typeChecker . getSymbolAtLocation ( expression ) ;
1898
- const type = symbol && typeChecker . getTypeOfSymbolAtLocation ( symbol , expression ) ;
1899
- const properties = type && ( < ObjectType > type ) . properties ;
1900
- if ( properties ) {
1901
- properties . forEach ( property => {
1902
- membersDeclaredBySpreadAssignment . set ( property . name , true ) ;
1903
- } ) ;
1904
- }
1896
+ setMembersDeclaredBySpreadAssignment ( m , membersDeclaredBySpreadAssignment ) ;
1905
1897
}
1906
1898
else if ( isBindingElement ( m ) && m . propertyName ) {
1907
1899
// include only identifiers in completion list
@@ -1926,6 +1918,18 @@ namespace ts.Completions {
1926
1918
return filteredSymbols ;
1927
1919
}
1928
1920
1921
+ function setMembersDeclaredBySpreadAssignment ( declaration : SpreadAssignment | JsxSpreadAttribute , membersDeclaredBySpreadAssignment : Map < boolean > ) {
1922
+ const expression = declaration . expression ;
1923
+ const symbol = typeChecker . getSymbolAtLocation ( expression ) ;
1924
+ const type = symbol && typeChecker . getTypeOfSymbolAtLocation ( symbol , expression ) ;
1925
+ const properties = type && ( < ObjectType > type ) . properties ;
1926
+ if ( properties ) {
1927
+ properties . forEach ( property => {
1928
+ membersDeclaredBySpreadAssignment . set ( property . name , true ) ;
1929
+ } ) ;
1930
+ }
1931
+ }
1932
+
1929
1933
// Set SortText to OptionalMember if it is an optinoal member
1930
1934
function setSortTextToOptionalMember ( ) {
1931
1935
symbols . forEach ( m => {
@@ -2009,15 +2013,7 @@ namespace ts.Completions {
2009
2013
seenNames . set ( attr . name . escapedText , true ) ;
2010
2014
}
2011
2015
else if ( isJsxSpreadAttribute ( attr ) ) {
2012
- const expression = attr . expression ;
2013
- const symbol = typeChecker . getSymbolAtLocation ( expression ) ;
2014
- const type = symbol && typeChecker . getTypeOfSymbolAtLocation ( symbol , expression ) ;
2015
- const properties = type && ( < ObjectType > type ) . properties ;
2016
- if ( properties ) {
2017
- properties . forEach ( property => {
2018
- membersDeclaredBySpreadAssignment . set ( property . name , true ) ;
2019
- } ) ;
2020
- }
2016
+ setMembersDeclaredBySpreadAssignment ( attr , membersDeclaredBySpreadAssignment ) ;
2021
2017
}
2022
2018
}
2023
2019
const filteredSymbols = symbols . filter ( a => ! seenNames . get ( a . escapedName ) ) ;
0 commit comments