mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-01 23:00:27 +02:00
codetools: when a single file is invalidated then invalidate the directory in the directorycacher
git-svn-id: trunk@30883 -
This commit is contained in:
parent
2946723366
commit
c46036889e
@ -143,6 +143,7 @@ type
|
||||
procedure SetStrings(const AStringType: TCTDirCacheString;
|
||||
const AValue: string);
|
||||
procedure ClearUnitLinks;
|
||||
procedure ClearListing;
|
||||
procedure UpdateListing;
|
||||
function GetUnitSourceCacheValue(const UnitSrc: TCTDirectoryUnitSources;
|
||||
const Search: string; var Filename: string): boolean;
|
||||
@ -202,7 +203,8 @@ type
|
||||
FOnGetUnitFromSet: TCTGetUnitFromSet;
|
||||
FOnIterateFPCUnitsFromSet: TCTIterateFPCUnitsFromSet;
|
||||
procedure DoRemove(ACache: TCTDirectoryCache);
|
||||
procedure OnFileStateCacheChangeTimeStamp(Sender: TObject);
|
||||
procedure OnFileStateCacheChangeTimeStamp(Sender: TObject;
|
||||
const AFilename: string);
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
@ -518,6 +520,11 @@ begin
|
||||
FUnitLinksTree:=nil
|
||||
end;
|
||||
|
||||
procedure TCTDirectoryCache.ClearListing;
|
||||
begin
|
||||
FListing.Clear;
|
||||
end;
|
||||
|
||||
procedure TCTDirectoryCache.UpdateListing;
|
||||
var
|
||||
WorkingListing: PWorkFileInfo;
|
||||
@ -534,7 +541,7 @@ begin
|
||||
if (FListing<>nil) and (FListing.FileTimeStamp=Pool.FileTimeStamp) then exit;
|
||||
if FListing=nil then
|
||||
FListing:=TCTDirectoryListing.Create;
|
||||
FListing.Clear;
|
||||
ClearListing;
|
||||
FListing.FileTimeStamp:=Pool.FileTimeStamp;
|
||||
if Directory='' then exit;// virtual directory
|
||||
|
||||
@ -1243,9 +1250,20 @@ begin
|
||||
FDirectories.Remove(ACache);
|
||||
end;
|
||||
|
||||
procedure TCTDirectoryCachePool.OnFileStateCacheChangeTimeStamp(Sender: TObject);
|
||||
procedure TCTDirectoryCachePool.OnFileStateCacheChangeTimeStamp(
|
||||
Sender: TObject; const AFilename: string);
|
||||
var
|
||||
Dir: String;
|
||||
Cache: TCTDirectoryCache;
|
||||
begin
|
||||
IncreaseFileTimeStamp;
|
||||
if AFilename='' then
|
||||
IncreaseFileTimeStamp
|
||||
else if FilenameIsAbsolute(AFilename) then begin
|
||||
Dir:=ExtractFileName(AFilename);
|
||||
Cache:=GetCache(Dir,false,false);
|
||||
if Cache=nil then exit;
|
||||
Cache.ClearListing;
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TCTDirectoryCachePool.Create;
|
||||
|
@ -201,6 +201,9 @@ type
|
||||
property Age: longint read FAge;
|
||||
end;
|
||||
|
||||
TOnChangeFileStateTimeStamp = procedure(Sender: TObject;
|
||||
const AFilename: string) of object;
|
||||
|
||||
{ TFileStateCache }
|
||||
|
||||
TFileStateCache = class
|
||||
@ -208,7 +211,7 @@ type
|
||||
FFiles: TAVLTree; // tree of TFileStateCacheItem
|
||||
FTimeStamp: int64;
|
||||
FLockCount: integer;
|
||||
FChangeTimeStampHandler: array of TNotifyEvent;
|
||||
FChangeTimeStampHandler: array of TOnChangeFileStateTimeStamp;
|
||||
procedure SetFlag(AFile: TFileStateCacheItem;
|
||||
AFlag: TFileStateCacheItemFlag; NewValue: boolean);
|
||||
public
|
||||
@ -231,8 +234,8 @@ type
|
||||
function Check(const Filename: string; AFlag: TFileStateCacheItemFlag;
|
||||
out AFile: TFileStateCacheItem; var FlagIsSet: boolean): boolean;
|
||||
procedure WriteDebugReport;
|
||||
procedure AddChangeTimeStampHandler(const Handler: TNotifyEvent);
|
||||
procedure RemoveChangeTimeStampHandler(const Handler: TNotifyEvent);
|
||||
procedure AddChangeTimeStampHandler(const Handler: TOnChangeFileStateTimeStamp);
|
||||
procedure RemoveChangeTimeStampHandler(const Handler: TOnChangeFileStateTimeStamp);
|
||||
function CalcMemSize: PtrUint;
|
||||
public
|
||||
property TimeStamp: int64 read FTimeStamp;
|
||||
@ -3246,14 +3249,14 @@ begin
|
||||
if AFilename='' then begin
|
||||
// invalidate all
|
||||
CTIncreaseChangeStamp64(FTimeStamp);
|
||||
for i:=0 to length(FChangeTimeStampHandler)-1 do
|
||||
FChangeTimeStampHandler[i](Self);
|
||||
end else begin
|
||||
// invalidate single file
|
||||
AFile:=FindFile(AFilename,false);
|
||||
if AFile<>nil then
|
||||
AFile.FTestedFlags:=[];
|
||||
end;
|
||||
for i:=0 to length(FChangeTimeStampHandler)-1 do
|
||||
FChangeTimeStampHandler[i](Self,AFilename);
|
||||
//debugln('TFileStateCache.IncreaseTimeStamp FTimeStamp=',dbgs(FTimeStamp));
|
||||
end;
|
||||
|
||||
@ -3407,14 +3410,15 @@ begin
|
||||
debugln(FFiles.ReportAsString);
|
||||
end;
|
||||
|
||||
procedure TFileStateCache.AddChangeTimeStampHandler(const Handler: TNotifyEvent);
|
||||
procedure TFileStateCache.AddChangeTimeStampHandler(
|
||||
const Handler: TOnChangeFileStateTimeStamp);
|
||||
begin
|
||||
SetLength(FChangeTimeStampHandler,length(FChangeTimeStampHandler)+1);
|
||||
FChangeTimeStampHandler[length(FChangeTimeStampHandler)-1]:=Handler;
|
||||
end;
|
||||
|
||||
procedure TFileStateCache.RemoveChangeTimeStampHandler(
|
||||
const Handler: TNotifyEvent);
|
||||
const Handler: TOnChangeFileStateTimeStamp);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
|
@ -34,6 +34,8 @@
|
||||
- Target implementation
|
||||
- Target interface
|
||||
- Target program
|
||||
- copy to clipboard
|
||||
- paste from clipboard
|
||||
}
|
||||
unit DeclareVarDlg;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user