anchor.diff:                  data.[i] <- None
                   i <- i + 1
   
  +        /// Go backwards to find the last cached scanned line that is valid.
  +        member x.GetLastValidCachedLine (startLine: int,  sourceLines: TextLineCollection) : int =
  +            let mutable i = startLine
  +            while i > 0 && (match x.[i] with Some data -> not (data.IsValid(sourceLines.[i])) | None -> true)  do
  +                i <- i - 1
  +            i
  +
       let private dataCache = ConditionalWeakTable<DocumentId, SourceTextData>()
   
       let internal compilerTokenToRoslynToken(colorKind: FSharpTokenColorKind) : string = 
  
positive.code:                         sourceTextData.ClearFrom (endLine+1)
                  | None -> ()
  
              result
          with 
          | :? System.OperationCanceledException -> reraise()
  
negative.code:     let private getCachedSourceLineData(documentKey: DocumentId, sourceText: SourceText, position: int, fileName: string, defines: string list) = 
          let textLine = sourceText.Lines.GetLineFromPosition(position)
          let textLinePos = sourceText.Lines.GetLinePosition(position)
          let lineNumber = textLinePos.Line
          let sourceTokenizer = FSharpSourceTokenizer(defines, Some fileName)
          let lines = sourceText.Lines
          // We keep incremental data per-document. When text changes we correlate text line-by-line (by hash codes of lines)
          let sourceTextData = dataCache.GetValue(documentKey, fun key -> SourceTextData(lines.Count))
          // Go backwards to find the last cached scanned line that is valid
          let scanStartLine = sourceTextData.GetLastValidCachedLine(lineNumber, lines)
          let lexState = if scanStartLine = 0 then 0L else sourceTextData.[scanStartLine].Value.LexStateAtEndOfLine
          let lineContents = textLine.Text.ToString(textLine.Span)
          
          // We can reuse the old data when 
  