@@ -338,6 +338,7 @@ namespace ts.Completions {
338338 ) : CompletionEntry | undefined {
339339 let insertText : string | undefined ;
340340 let replacementSpan : TextSpan | undefined ;
341+
341342 const insertQuestionDot = origin && originIsNullableMember ( origin ) ;
342343 const useBraces = origin && originIsSymbolMember ( origin ) || needsConvertPropertyAccess ;
343344 if ( origin && originIsThisType ( origin ) ) {
@@ -780,7 +781,7 @@ namespace ts.Completions {
780781 sourceFile : SourceFile ,
781782 isUncheckedFile : boolean ,
782783 position : number ,
783- preferences : Pick < UserPreferences , "includeCompletionsForModuleExports" | "includeCompletionsWithInsertText" > ,
784+ preferences : Pick < UserPreferences , "includeCompletionsForModuleExports" | "includeCompletionsWithInsertText" | "includeAutomaticOptionalChainCompletions" > ,
784785 detailsEntryId : CompletionEntryIdentifier | undefined ,
785786 host : LanguageServiceHost ,
786787 ) : CompletionData | Request | undefined {
@@ -1116,8 +1117,17 @@ namespace ts.Completions {
11161117 let type = typeChecker . getTypeOfSymbolAtLocation ( symbol , node ) . getNonOptionalType ( ) ;
11171118 let insertQuestionDot = false ;
11181119 if ( type . isNullableType ( ) ) {
1119- insertQuestionDot = isRightOfDot && ! isRightOfQuestionDot ;
1120- type = type . getNonNullableType ( ) ;
1120+ const canCorrectToQuestionDot =
1121+ isRightOfDot &&
1122+ ! isRightOfQuestionDot &&
1123+ preferences . includeAutomaticOptionalChainCompletions !== false ;
1124+
1125+ if ( canCorrectToQuestionDot || isRightOfQuestionDot ) {
1126+ type = type . getNonNullableType ( ) ;
1127+ if ( canCorrectToQuestionDot ) {
1128+ insertQuestionDot = true ;
1129+ }
1130+ }
11211131 }
11221132 addTypeProperties ( type , ! ! ( node . flags & NodeFlags . AwaitContext ) , insertQuestionDot ) ;
11231133 }
@@ -1137,8 +1147,17 @@ namespace ts.Completions {
11371147 let type = typeChecker . getTypeAtLocation ( node ) . getNonOptionalType ( ) ;
11381148 let insertQuestionDot = false ;
11391149 if ( type . isNullableType ( ) ) {
1140- insertQuestionDot = isRightOfDot && ! isRightOfQuestionDot ;
1141- type = type . getNonNullableType ( ) ;
1150+ const canCorrectToQuestionDot =
1151+ isRightOfDot &&
1152+ ! isRightOfQuestionDot &&
1153+ preferences . includeAutomaticOptionalChainCompletions !== false ;
1154+
1155+ if ( canCorrectToQuestionDot || isRightOfQuestionDot ) {
1156+ type = type . getNonNullableType ( ) ;
1157+ if ( canCorrectToQuestionDot ) {
1158+ insertQuestionDot = true ;
1159+ }
1160+ }
11421161 }
11431162 addTypeProperties ( type , ! ! ( node . flags & NodeFlags . AwaitContext ) , insertQuestionDot ) ;
11441163 }
0 commit comments