anchor.diff:  type private CacheMessage<'k, 'v> =
       | Get of 'k * (unit -> 'v) * AsyncReplyChannel<'v>
       | Remove of 'k
  +    | Clear
   
   type private Cache<'k, 'v when 'k: comparison>() =
  +    let disposeValue value =
  +        match box value with
  +        | :? IDisposable as d -> d.Dispose()
  +        | _ -> ()
  +
       let agent = MailboxProcessor.Start(fun inbox ->
           let rec loop (cache: Map<'k, 'v>) = 
               async {
  
positive.code:                     | Remove key -> 
                          match cache |> Map.tryFind key with
                          | Some value -> 
                              match box value with
                              | :? IDisposable as d -> d.Dispose()
                              | _ -> ()
                              cache |> Map.remove key
                          | _ -> cache) 
              }
          loop Map.empty)
      do agent.Error.Add (fail "%O")
      member x.Get key creator = agent.PostAndReply (fun r -> Get (key, creator, r))
      member x.Remove key = agent.Post (Remove key)
  
  [<AutoOpen>]
  module FSharpSymbolExtensions =
  
negative.code: 
      do match events with
          | Some events ->
              events.SolutionEvents.add_AfterClosing (fun _ -> cache.Clear())
              events.ProjectItemsEvents.add_ItemRenamed (fun p _ -> onProjectItemChanged p)
              events.ProjectItemsEvents.add_ItemRemoved (fun p -> onProjectItemChanged p)
              events.ProjectItemsEvents.add_ItemAdded (fun p -> onProjectItemChanged p)
  