@@ -153,11 +153,6 @@ namespace ts.Completions {
153
153
return stringCompletions ;
154
154
}
155
155
156
- const objectTypeLiteralCompletions = getObjectTypeLiteralInTypeArgumentCompletions ( sourceFile , position , contextToken , typeChecker , compilerOptions , log , preferences ) ;
157
- if ( objectTypeLiteralCompletions ) {
158
- return objectTypeLiteralCompletions ;
159
- }
160
-
161
156
if ( contextToken && isBreakOrContinueStatement ( contextToken . parent )
162
157
&& ( contextToken . kind === SyntaxKind . BreakKeyword || contextToken . kind === SyntaxKind . ContinueKeyword || contextToken . kind === SyntaxKind . Identifier ) ) {
163
158
return getLabelCompletionAtPosition ( contextToken . parent ) ;
@@ -988,53 +983,6 @@ namespace ts.Completions {
988
983
return ! ! symbol . declarations ?. some ( d => d . kind === SyntaxKind . SourceFile ) ;
989
984
}
990
985
991
- function getObjectTypeLiteralInTypeArgumentCompletions ( sourceFile : SourceFile , position : number , contextToken : Node | undefined , checker : TypeChecker , options : CompilerOptions , log : Log , preferences : UserPreferences ) : CompletionInfo | undefined {
992
- if ( ! contextToken ) return undefined ;
993
-
994
- const typeLiteralNode = tryGetTypeLiteralNode ( contextToken ) ;
995
- if ( ! typeLiteralNode ) return undefined ;
996
-
997
- const intersectionTypeNode = isIntersectionTypeNode ( typeLiteralNode . parent ) ? typeLiteralNode . parent : undefined ;
998
- const containerTypeNode = intersectionTypeNode || typeLiteralNode ;
999
-
1000
- const containerExpectedType = tryGetTypeArgumentSubType ( containerTypeNode , checker ) ;
1001
- if ( ! containerExpectedType ) return undefined ;
1002
-
1003
- const containerActualType = checker . getTypeFromTypeNode ( containerTypeNode ) ;
1004
-
1005
- const members = getPropertiesForCompletion ( containerExpectedType , checker ) ;
1006
- const existingMembers = getPropertiesForCompletion ( containerActualType , checker ) ;
1007
-
1008
- const existingMemberEscapedNames : Set < __String > = new Set ( ) ;
1009
- forEach ( existingMembers , s => existingMemberEscapedNames . add ( s . escapedName ) ) ;
1010
-
1011
- const missingMembers = filter ( members , s => ! existingMemberEscapedNames . has ( s . escapedName ) ) ;
1012
-
1013
- const location = getTouchingToken ( sourceFile , position ) ;
1014
-
1015
- const entries : CompletionEntry [ ] = [ ] ;
1016
- getCompletionEntriesFromSymbols (
1017
- missingMembers ,
1018
- entries ,
1019
- /* contextToken */ undefined ,
1020
- location ,
1021
- sourceFile ,
1022
- checker ,
1023
- options . target ! ,
1024
- log ,
1025
- CompletionKind . MemberLike ,
1026
- preferences ,
1027
- options
1028
- ) ;
1029
-
1030
- return {
1031
- isGlobalCompletion : false ,
1032
- isMemberCompletion : true ,
1033
- isNewIdentifierLocation : false ,
1034
- entries
1035
- } ;
1036
- }
1037
-
1038
986
function getCompletionData (
1039
987
program : Program ,
1040
988
log : ( message : string ) => void ,
@@ -1561,7 +1509,8 @@ namespace ts.Completions {
1561
1509
}
1562
1510
1563
1511
function tryGetGlobalSymbols ( ) : boolean {
1564
- const result : GlobalsSearch = tryGetObjectLikeCompletionSymbols ( )
1512
+ const result : GlobalsSearch = tryGetObjectTypeLiteralInTypeArgumentCompletionSymbols ( )
1513
+ || tryGetObjectLikeCompletionSymbols ( )
1565
1514
|| tryGetImportCompletionSymbols ( )
1566
1515
|| tryGetImportOrExportClauseCompletionSymbols ( )
1567
1516
|| tryGetLocalNamedExportCompletionSymbols ( )
@@ -1963,6 +1912,32 @@ namespace ts.Completions {
1963
1912
position === contextToken . end && ( ! ! contextToken . isUnterminated || isRegularExpressionLiteral ( contextToken ) ) ) ;
1964
1913
}
1965
1914
1915
+ function tryGetObjectTypeLiteralInTypeArgumentCompletionSymbols ( ) : GlobalsSearch | undefined {
1916
+ const typeLiteralNode = tryGetTypeLiteralNode ( contextToken ) ;
1917
+ if ( ! typeLiteralNode ) return GlobalsSearch . Continue ;
1918
+
1919
+ const intersectionTypeNode = isIntersectionTypeNode ( typeLiteralNode . parent ) ? typeLiteralNode . parent : undefined ;
1920
+ const containerTypeNode = intersectionTypeNode || typeLiteralNode ;
1921
+
1922
+ const containerExpectedType = getConstraintOfTypeArgumentProperty ( containerTypeNode , typeChecker ) ;
1923
+ if ( ! containerExpectedType ) return GlobalsSearch . Continue ;
1924
+
1925
+ const containerActualType = typeChecker . getTypeFromTypeNode ( containerTypeNode ) ;
1926
+
1927
+ const members = getPropertiesForCompletion ( containerExpectedType , typeChecker ) ;
1928
+ const existingMembers = getPropertiesForCompletion ( containerActualType , typeChecker ) ;
1929
+
1930
+ const existingMemberEscapedNames : Set < __String > = new Set ( ) ;
1931
+ existingMembers . forEach ( s => existingMemberEscapedNames . add ( s . escapedName ) ) ;
1932
+
1933
+ symbols = filter ( members , s => ! existingMemberEscapedNames . has ( s . escapedName ) ) ;
1934
+
1935
+ completionKind = CompletionKind . ObjectPropertyDeclaration ;
1936
+ isNewIdentifierLocation = true ;
1937
+
1938
+ return GlobalsSearch . Success ;
1939
+ }
1940
+
1966
1941
/**
1967
1942
* Aggregates relevant symbols for completion in object literals and object binding patterns.
1968
1943
* Relevant symbols are stored in the captured 'symbols' variable.
@@ -2910,6 +2885,8 @@ namespace ts.Completions {
2910
2885
}
2911
2886
2912
2887
function tryGetTypeLiteralNode ( node : Node ) : TypeLiteralNode | undefined {
2888
+ if ( ! node ) return undefined ;
2889
+
2913
2890
const parent = node . parent ;
2914
2891
2915
2892
switch ( node . kind ) {
@@ -2930,14 +2907,14 @@ namespace ts.Completions {
2930
2907
return undefined ;
2931
2908
}
2932
2909
2933
- function tryGetTypeArgumentSubType ( node : Node , checker : TypeChecker ) : Type | undefined {
2910
+ function getConstraintOfTypeArgumentProperty ( node : Node , checker : TypeChecker ) : Type | undefined {
2934
2911
if ( ! node ) return undefined ;
2935
2912
2936
2913
if ( isTypeNode ( node ) && isTypeReferenceType ( node . parent ) ) {
2937
2914
return checker . getTypeArgumentConstraint ( node ) ;
2938
2915
}
2939
2916
2940
- const t = tryGetTypeArgumentSubType ( node . parent , checker ) ;
2917
+ const t = getConstraintOfTypeArgumentProperty ( node . parent , checker ) ;
2941
2918
if ( ! t ) return undefined ;
2942
2919
2943
2920
switch ( node . kind ) {
0 commit comments