@@ -41,17 +41,21 @@ type internal FSharpCompletionProvider
4141 static let [<Literal>] FullNamePropName = " FullName"
4242 static let [<Literal>] IsExtensionMemberPropName = " IsExtensionMember"
4343 static let [<Literal>] NamespaceToOpenPropName = " NamespaceToOpen"
44- static let [<Literal>] IsKeywordPropName = " IsKeyword"
4544 static let [<Literal>] IndexPropName = " Index"
45+ static let [<Literal>] KeywordDescription = " KeywordDescription"
4646
4747 static let keywordCompletionItems =
4848 Keywords.KeywordsWithDescription
4949 |> List.filter ( fun ( keyword , _ ) -> not ( PrettyNaming.IsOperatorName keyword))
5050 |> List.sortBy ( fun ( keyword , _ ) -> keyword)
5151 |> List.mapi ( fun n ( keyword , description ) ->
52- FSharpCommonCompletionItem.Create( keyword, null , CompletionItemRules.Default, Nullable Glyph.Keyword, sortText = sprintf " %06d " ( 1000000 + n))
53- .AddProperty( " description" , description)
54- .AddProperty( IsKeywordPropName, " " ))
52+ FSharpCommonCompletionItem.Create(
53+ displayText = keyword,
54+ displayTextSuffix = " " ,
55+ rules = CompletionItemRules.Default,
56+ glyph = Nullable Glyph.Keyword,
57+ sortText = sprintf " %06d " ( 1000000 + n))
58+ .AddProperty( KeywordDescription, description))
5559
5660 let checker = checkerProvider.Checker
5761
@@ -183,22 +187,23 @@ type internal FSharpCompletionProvider
183187 let completionItem = completionItem.WithSortText( sortText)
184188 results.Add( completionItem))
185189
190+
186191 if results.Count > 0 && not declarations.IsForType && not declarations.IsError && List.isEmpty partialName.QualifyingIdents then
187192 let lineStr = textLines.[ caretLinePos.Line]. ToString()
188-
193+
189194 let completionContext =
190195 parseResults.ParseTree
191196 |> Option.bind ( fun parseTree ->
192197 UntypedParseImpl.TryGetCompletionContext( Pos.fromZ caretLinePos.Line caretLinePos.Character, parseTree, lineStr))
193-
198+
194199 match completionContext with
195200 | None -> results.AddRange( keywordCompletionItems)
196201 | _ -> ()
197202
198203 return results
199204 }
200205
201- override this .ShouldTriggerCompletion( sourceText : SourceText , caretPosition : int , trigger : CompletionTrigger , _ : OptionSet ) =
206+ override _ .ShouldTriggerCompletion( sourceText : SourceText , caretPosition : int , trigger : CompletionTrigger , _ : OptionSet ) =
202207 use _logBlock = Logger.LogBlock LogEditorFunctionId.Completion_ ShouldTrigger
203208
204209 let getInfo () =
@@ -209,7 +214,7 @@ type internal FSharpCompletionProvider
209214
210215 FSharpCompletionProvider.ShouldTriggerCompletionAux( sourceText, caretPosition, trigger.Kind, getInfo, settings.IntelliSense)
211216
212- override this .ProvideCompletionsAsync( context : Completion.CompletionContext ) =
217+ override _ .ProvideCompletionsAsync( context : Completion.CompletionContext ) =
213218 asyncMaybe {
214219 use _logBlock = Logger.LogBlockMessage context.Document.Name LogEditorFunctionId.Completion_ ProvideCompletionsAsync
215220
@@ -230,7 +235,7 @@ type internal FSharpCompletionProvider
230235 context.AddItems( results)
231236 } |> Async.Ignore |> RoslynHelpers.StartAsyncUnitAsTask context.CancellationToken
232237
233- override this .GetDescriptionAsync( document : Document , completionItem : Completion.CompletionItem , cancellationToken : CancellationToken ): Task < CompletionDescription > =
238+ override _ .GetDescriptionAsync( document : Document , completionItem : Completion.CompletionItem , cancellationToken : CancellationToken ): Task < CompletionDescription > =
234239 async {
235240 use _logBlock = Logger.LogBlockMessage document.Name LogEditorFunctionId.Completion_ GetDescriptionAsync
236241 match completionItem.Properties.TryGetValue IndexPropName with
@@ -244,13 +249,18 @@ type internal FSharpCompletionProvider
244249 // mix main description and xmldoc by using one collector
245250 XmlDocumentation.BuildDataTipText( documentationBuilder, collector, collector, collector, collector, collector, description)
246251 return CompletionDescription.Create( documentation.ToImmutableArray())
247- else
252+ else
253+ return CompletionDescription.Empty
254+ | _ ->
255+ // Try keyword descriptions if they exist
256+ match completionItem.Properties.TryGetValue KeywordDescription with
257+ | true , keywordDescription ->
258+ return CompletionDescription.FromText( keywordDescription)
259+ | false , _ ->
248260 return CompletionDescription.Empty
249- | _ ->
250- return CompletionDescription.Empty
251261 } |> RoslynHelpers.StartAsyncAsTask cancellationToken
252262
253- override this .GetChangeAsync( document , item , _ , cancellationToken ) : Task < CompletionChange > =
263+ override _ .GetChangeAsync( document , item , _ , cancellationToken ) : Task < CompletionChange > =
254264 async {
255265 use _logBlock = Logger.LogBlockMessage document.Name LogEditorFunctionId.Completion_ GetChangeAsync
256266
@@ -259,9 +269,8 @@ type internal FSharpCompletionProvider
259269 | true , x -> Some x
260270 | _ -> None
261271
262- // do not add extension members, keywords and not yet resolved symbols to the MRU list
263- if not ( item.Properties.ContainsKey NamespaceToOpenPropName) && not ( item.Properties.ContainsKey IsExtensionMemberPropName) &&
264- not ( item.Properties.ContainsKey IsKeywordPropName) then
272+ // do not add extension members and unresolved symbols to the MRU list
273+ if not ( item.Properties.ContainsKey NamespaceToOpenPropName) && not ( item.Properties.ContainsKey IsExtensionMemberPropName) then
265274 match fullName with
266275 | Some fullName ->
267276 match mruItems.TryGetValue fullName with
0 commit comments