anchor.diff:  type private CategorizedSnapshotSpan (columnSpan: CategorizedColumnSpan<ITextSnapshot>, originalSnapshot: ITextSnapshot) =
       let snapshotSpan: SnapshotSpanWithLine option Atom = Atom None 
       member __.ColumnSpan = columnSpan
  -    member __.CachedSnapshotSpan = snapshotSpan.Value
       member __.GetSnapshotSpan targetSnapshot =
           snapshotSpan.Swap (fun oldSpan ->
               oldSpan
  
positive.code:                     FastStage.Data
                          { Snapshot = snapshot
                            Spans = spans
                            HasErrors = checkResults.HasParseOrCheckErrors
                            SingleSymbolsProjects = singleSymbolsProjects }) |> ignore
  
                  do! callInUIContext <| fun _ -> triggerClassificationChanged snapshot "UpdateSyntaxConstructClassifiers" 
  
negative.code:             |> function [||] -> -1, -1 | lines -> Array.min lines, Array.max lines
  
          // we take into account new Unused spans, but do not old ones.
          let newTcSpans, (newStartLine, newEndLine) = getLineRange true newSpans.Spans
          let oldTcSpans, (oldStartLine, oldEndLine) = getLineRange false oldSpans.Spans
          let isNewRangeLarger = newStartLine <= oldStartLine && newEndLine >= oldEndLine
  
          // returns `true` if both first and last spans are still here, which means
  