anchor.diff:                  | doc -> let file = doc.FileName.FullPath.ToString()
                            if file = "" then None else Some file
   
  +    let isObsolete filename version (token:CancellationToken) =
  +        SourceCodeServices.IsResultObsolete(fun () ->
  +            let shortFilename = Path.GetFileName filename
  +            try
  +                if not token.IsCancellationRequested then
  +                    match MonoDevelop.tryGetVisibleDocument filename with
  +                    | Some doc ->
  +                        let newVersion = doc.Editor.Version
  +                        if newVersion.BelongsToSameDocumentAs(version) && newVersion.CompareAge(version) = 0 then
  +                            false
  +                        else
  +                            LoggingService.LogDebug ("FSharpParser: Parse {0} is obsolete type check cancelled, file has changed", shortFilename)
  +                            true
  +                    | None ->
  +                        LoggingService.LogDebug ("FSharpParser: Parse {0} is obsolete type check cancelled, file no longer visible", shortFilename)
  +                        true
  +                else
  +                    LoggingService.LogDebug ("FSharpParser: Parse {0} is obsolete type check cancelled by cancellationToken", shortFilename)
  +                    true
  +            with ex ->
  +                LoggingService.LogDebug ("FSharpParser: Parse {0} unable to determine cancellation due to exception", shortFilename, ex)
  +                false )
  +                
       override x.Parse(parseOptions, cancellationToken) =
           let fileName = parseOptions.FileName
           let content = parseOptions.Content
  
positive.code:                         let obsolete = isObsolete parseOptions.FileName parseOptions.Content.Version cancellationToken
                          try
                              let! pendingParseResults = Async.StartChild(languageService.ParseAndCheckFileInProject(projectFile, filePath, 0, content.Text, obsolete), ServiceSettings.maximumTimeout)
                              //if you ever want to see the current parse tree
                              //let pt = match results.ParseTree with Some pt -> sprintf "%A" pt | _ -> ""
                              LoggingService.LogDebug ("FSharpParser: Parse and check results retieved on {0}", shortFilename)
                              let defines = CompilerArguments.getDefineSymbols filePath (proj |> Option.ofNull)
                              let! results = pendingParseResults
                              return! ParsedDocument.create parseOptions results defines
                          with exn ->
                              LoggingService.LogError ("FSharpParser: Error ParsedDocument on {0}", shortFilename, exn)
                              return FSharpParsedDocument(fileName, Flags = ParsedDocumentFlags.NonSerializable) :> _
                      | None -> return FSharpParsedDocument(fileName, Flags = ParsedDocumentFlags.NonSerializable) :> _ })
  
negative.code:         let shortFilename = Path.GetFileName fileName
          LoggingService.LogDebug ("FSharpParser: Parse starting on {0}", shortFilename)
  
          Async.StartAsTask(
              cancellationToken = cancellationToken,
              computation =
  