anchor.diff:        var syntaxTree: TSyntaxNode; var doParseUnit, doAbort: boolean);
       procedure IndexerUnitParsed(Sender: TObject; const unitName: string; const fileName: string;
         var syntaxTree: TSyntaxNode; syntaxTreeFromParser: boolean; var doAbort: boolean);
  +    procedure LoadCacheInfo(const folder: string);
       procedure SetSyntaxFilter(const value: TProc<TSyntaxNode>);
     public
       constructor Create(const AStorageFile: string; ADataFormatVersion: integer);
  +    destructor  Destroy; override;
       procedure BindTo(indexer: TProjectIndexer);
       property SyntaxFilter: TProc<TSyntaxNode> read GetSyntaxFilter write SetSyntaxFilter;
     end; { TDLCache }
  
positive.code: 
  function TDLCache.CleanupFileName(const fileName: string): string;
  begin
    Result := StringReplace(fileName, ':\', '_\', []);
    Result := StringReplace(Result,   '\\', '\_\', []);
    Result := '\' + Result;
  end; { TDLCache.CleanupFileName }
  
  function TDLCache.DateDumpStr(dt: TDateTime): string;
  
negative.code: procedure TDLCache.IndexerGetUnitSyntax(Sender: TObject; const fileName: string;
    var syntaxTree: TSyntaxNode; var doParseUnit, doAbort: boolean);
  var
    fn      : string;
    mem     : TMemoryStream;
    ser     : TBinarySerializer;
    str     : TStream;
    unitInfo: TUnitInfo;
  begin
    FLastGet.FileName := fileName;
    FLastGet.FileTime := DateDumpStr(DSiGetFileTime(fileName, ftLastModification));
  
    fn := CleanupFileName(fileName);
  
    if not FCacheInfo.TryGetValue(ExtractFileName(fileName), unitInfo) then
      Exit;
    if not SameText(fn, unitInfo.FullName) then begin
      //unit moved or different unit found, remove cached info
      FStorage.Delete(fn);
      Exit;
    end;
  
    if FStorage.FileExists(fn) and (unitInfo.FileTime = FLastGet.FileTime) then begin
      str := FStorage.OpenFile(fn, fmOpenRead);
      try
        ser := TBinarySerializer.Create;
  