anchor.diff:      member x.HandleRename() =
           maybe {
               let! state = state
  -            // We have to use it after canRename() in order to get word correctly
               let! cw, sym = state.Word
               let! symbol, fileScopedCheckResults = 
                   // We pass AllowStaleResults.No here because we really need a 100% accurate symbol w.r.t. all prior files,
  
positive.code:     let documentUpdater = DocumentUpdater(serviceProvider)
  
      let canRename() = 
          state <- Option.map (fun s -> { s with Word = vsLanguageService.GetSymbol(s.Point, s.Project) } ) state
          state |> Option.bind (fun s -> s.Word) |> Option.isSome
  
      let updateAtCaretPosition () =
          maybe {
              let! point = view.TextBuffer.GetSnapshotPoint view.Caret.Position
              // If the new cursor position is still within the current word (and on the same snapshot),
              // we don't need to check it.
              match state with
              | Some { Word = Some (cw,_) } when cw.Snapshot = view.TextSnapshot && point.InSpan cw -> ()
              | _ ->
                  let dte = serviceProvider.GetService<EnvDTE.DTE, SDTE>()
                  let! doc = dte.GetActiveDocument()
                  let! project = ProjectProvider.createForDocument doc
                  state <- Some
                      { Project =  project
                        File = doc.FullName
                        Word = None
                        Point = point } } |> ignore
  
      let _ = DocumentEventsListener (view, updateAtCaretPosition)
  
      let rename (oldText: string) (newText: string) (foundUsages: (string * range list) list) =
          try
  
negative.code: 
  [<NoEquality; NoComparison>]
  type DocumentState =
      { Word: (SnapshotSpan * Symbol) option
        File: string
        Project: IProjectProvider }
  
  