|
3 | 3 | namespace Microsoft.VisualStudio.FSharp.Editor
|
4 | 4 |
|
5 | 5 | open System
|
| 6 | +open System.Collections.Concurrent |
6 | 7 | open System.Collections.Immutable
|
7 | 8 | open System.Runtime.CompilerServices
|
8 | 9 | open System.Text.RegularExpressions
|
@@ -288,27 +289,26 @@ module internal XmlDocumentation =
|
288 | 289 | /// Provide Xml Documentation
|
289 | 290 | type Provider(xmlIndexService: IVsXMLMemberIndexService) =
|
290 | 291 | /// Index of assembly name to xml member index.
|
291 |
| - let cache = Dictionary<string, IVsXMLMemberIndex>() |
| 292 | + let cache = ConcurrentDictionary<string, IVsXMLMemberIndex>() |
292 | 293 |
|
293 | 294 | do Events.SolutionEvents.OnAfterCloseSolution.Add(fun _ -> cache.Clear())
|
294 | 295 |
|
295 | 296 | /// Retrieve the preexisting xml index or None
|
296 | 297 | let GetMemberIndexOfAssembly (assemblyName) =
|
297 |
| - match cache.TryGetValue(assemblyName) with |
298 |
| - | true, memberIndex -> Some(memberIndex) |
299 |
| - | false, _ -> |
300 |
| - let ok, memberIndex = xmlIndexService.CreateXMLMemberIndex(assemblyName) |
301 |
| - |
302 |
| - if Com.Succeeded(ok) then |
303 |
| - let ok = memberIndex.BuildMemberIndex() |
304 |
| - |
305 |
| - if Com.Succeeded(ok) then |
306 |
| - cache.Add(assemblyName, memberIndex) |
307 |
| - Some(memberIndex) |
308 |
| - else |
309 |
| - None |
310 |
| - else |
311 |
| - None |
| 298 | + let memberIndex = |
| 299 | + cache.GetOrAdd( |
| 300 | + assemblyName, |
| 301 | + fun name -> |
| 302 | + let ok, memberIndex = xmlIndexService.CreateXMLMemberIndex(name) |
| 303 | + |
| 304 | + if Com.Succeeded(ok) then |
| 305 | + let ok = memberIndex.BuildMemberIndex() |
| 306 | + if Com.Succeeded(ok) then memberIndex else null |
| 307 | + else |
| 308 | + null |
| 309 | + ) |
| 310 | + |
| 311 | + if memberIndex <> null then Some(memberIndex) else None |
312 | 312 |
|
313 | 313 | let AppendMemberData
|
314 | 314 | (
|
|
0 commit comments