@@ -39,12 +39,13 @@ type internal FSharpCompletionProvider
3939static let userOpName = " CompletionProvider"
4040// Save the backing data in a cache, we need to save for at least the length of the completion session
4141// See https://github.com/Microsoft/visualfsharp/issues/4714
42- static let declarationItemsData = new ConcurrentDictionary < string , FSharpDeclarationListItem >()
42+ static letmutable declarationItems : FSharpDeclarationListItem [] = [||]
4343static let [<Literal>] NameInCodePropName = " NameInCode"
4444static let [<Literal>] FullNamePropName = " FullName"
4545static let [<Literal>] IsExtensionMemberPropName = " IsExtensionMember"
4646static let [<Literal>] NamespaceToOpenPropName = " NamespaceToOpen"
4747static let [<Literal>] IsKeywordPropName = " IsKeyword"
48+ static let [<Literal>] IndexPropName = " Index"
4849
4950static let keywordCompletionItems =
5051 Lexhelp.Keywords.keywordsWithDescription
@@ -129,7 +130,7 @@ type internal FSharpCompletionProvider
129130| CompletionItemKind.Other-> 5
130131| CompletionItemKind.Method( isExtension= true ) -> 6
131132
132- let sortedDeclItems =
133+ declarationItems <-
133134 declarations.Items
134135|> Array.sortWith( fun x y ->
135136let mutable n = ( not x.IsResolved). CompareTo( not y.IsResolved)
@@ -144,8 +145,7 @@ type internal FSharpCompletionProvider
144145
145146let maxHints = if mruItems.Values.Count= 0 then 0 else Seq.max mruItems.Values
146147
147- declarationItemsData.Clear()
148- sortedDeclItems|> Array.iteri( fun number declarationItem ->
148+ declarationItems|> Array.iteri( fun number declarationItem ->
149149let glyph = Tokenizer.FSharpGlyphToRoslynGlyph( declarationItem.Glyph, declarationItem.Accessibility)
150150let name =
151151match declarationItem.NamespaceToOpenwith
@@ -180,17 +180,15 @@ type internal FSharpCompletionProvider
180180| Some ns-> completionItem.AddProperty( NamespaceToOpenPropName, ns)
181181| None-> completionItem
182182
183+ let completionItem = completionItem.AddProperty( IndexPropName, string number)
184+
183185let priority =
184186match mruItems.TryGetValue declarationItem.FullNamewith
185187| true , hints-> maxHints- hints
186188| _ -> number+ maxHints+ 1
187189
188190let sortText = sprintf" %06d " priority
189-
190191let completionItem = completionItem.WithSortText( sortText)
191-
192- let key = completionItem.DisplayText
193- declarationItemsData.TryAdd( key, declarationItem) |> ignore
194192 results.Add( completionItem))
195193
196194if results.Count> 0 && not declarations.IsForType&& not declarations.IsError&& List.isEmpty partialName.QualifyingIdentsthen
@@ -243,15 +241,19 @@ type internal FSharpCompletionProvider
243241override this.GetDescriptionAsync ( document : Document , completionItem : Completion.CompletionItem , cancellationToken : CancellationToken ): Task < CompletionDescription > =
244242async {
245243use _logBlock= Logger.LogBlockMessage document.Name LogEditorFunctionId.Completion_ GetDescriptionAsync
246-
247- match declarationItemsData.TryGetValue( completionItem.DisplayText) with
248- | true , declarationItem->
249- let! description = declarationItem.StructuredDescriptionTextAsync
250- let documentation = List()
251- let collector = RoslynHelpers.CollectTaggedText documentation
252- // mix main description and xmldoc by using one collector
253- XmlDocumentation.BuildDataTipText( documentationBuilder, collector, collector, collector, collector, collector, description)
254- return CompletionDescription.Create( documentation.ToImmutableArray())
244+ match completionItem.Properties.TryGetValue IndexPropNamewith
245+ | true , completionItemIndexStr->
246+ let completionItemIndex = int completionItemIndexStr
247+ if completionItemIndex< declarationItems.Lengththen
248+ let declarationItem = declarationItems.[ completionItemIndex]
249+ let! description = declarationItem.StructuredDescriptionTextAsync
250+ let documentation = List()
251+ let collector = RoslynHelpers.CollectTaggedText documentation
252+ // mix main description and xmldoc by using one collector
253+ XmlDocumentation.BuildDataTipText( documentationBuilder, collector, collector, collector, collector, collector, description)
254+ return CompletionDescription.Create( documentation.ToImmutableArray())
255+ else
256+ return CompletionDescription.Empty
255257| _ ->
256258return CompletionDescription.Empty
257259} |> RoslynHelpers.StartAsyncAsTask cancellationToken