mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-02 13:19:49 +01:00
codetools: fixed TCodeToolManager.FindReferences
git-svn-id: trunk@30947 -
This commit is contained in:
parent
5013437c2f
commit
8e1f917408
@ -69,7 +69,7 @@ type
|
||||
procedure SetScanner(const Value: TLinkScanner);
|
||||
procedure SetIsDeleted(const NewValue: boolean);
|
||||
protected
|
||||
procedure IncreaseChangeStep; override;
|
||||
procedure DoSourceChanged; override;
|
||||
procedure DecodeLoaded(const AFilename: string;
|
||||
var ASource, ADiskEncoding, AMemEncoding: string); override;
|
||||
procedure EncodeSaving(const AFilename: string; var ASource: string); override;
|
||||
@ -298,7 +298,6 @@ begin
|
||||
inherited Create;
|
||||
FItems:=TAVLTree.Create(@CompareCodeBuffers);
|
||||
FIncludeLinks:=TAVLTree.Create(@CompareIncludedByLink);
|
||||
FChangeStamp:=CTInvalidChangeStamp64;
|
||||
end;
|
||||
|
||||
destructor TCodeCache.Destroy;
|
||||
@ -987,6 +986,8 @@ end;
|
||||
|
||||
procedure TCodeCache.IncreaseChangeStamp;
|
||||
begin
|
||||
debugln(['TCodeCache.IncreaseChangeStamp ']);
|
||||
CTDumpStack;
|
||||
CTIncreaseChangeStamp64(FChangeStamp);
|
||||
end;
|
||||
|
||||
@ -1137,9 +1138,9 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCodeBuffer.IncreaseChangeStep;
|
||||
procedure TCodeBuffer.DoSourceChanged;
|
||||
begin
|
||||
inherited IncreaseChangeStep;
|
||||
inherited DoSourceChanged;
|
||||
if FCodeCache<>nil then
|
||||
FCodeCache.IncreaseChangeStamp;
|
||||
end;
|
||||
|
||||
@ -2305,17 +2305,37 @@ var
|
||||
begin
|
||||
Result:=false;
|
||||
{$IFDEF CTDEBUG}
|
||||
DebugLn('TCodeToolManager.FindReferences A ',IdentifierCode.Filename,' x=',dbgs(x),' y=',dbgs(y));
|
||||
if Cache=nil then
|
||||
DebugLn('TCodeToolManager.FindReferences A ',IdentifierCode.Filename,' x=',dbgs(x),' y=',dbgs(y),' SearchInCode=',SearchInCode.Filename)
|
||||
else
|
||||
debugln(['TCodeToolManager.FindReferences A SearchInCode=',SearchInCode.Filename]);
|
||||
{$ENDIF}
|
||||
ListOfPCodeXYPosition:=nil;
|
||||
if Cache=nil then
|
||||
Cache:=TFindIdentifierReferenceCache.Create;
|
||||
if (Cache.SourcesChangeStep=SourceCache.ChangeStamp)
|
||||
and (Cache.SourcesChangeStep<>CTInvalidChangeStamp64)
|
||||
and (Cache.FilesChangeStep=FileStateCache.TimeStamp)
|
||||
and (Cache.InitValuesChangeStep=DefineTree.ChangeStep) then begin
|
||||
and (Cache.FilesChangeStep<>CTInvalidChangeStamp64)
|
||||
and (Cache.InitValuesChangeStep=DefineTree.ChangeStep)
|
||||
and (Cache.InitValuesChangeStep<>CTInvalidChangeStamp)
|
||||
and (Cache.IdentifierCode=IdentifierCode) and (Cache.X=X) and (Cache.Y=Y)
|
||||
then begin
|
||||
//debugln(['TCodeToolManager.FindReferences cache valid']);
|
||||
// all sources and values are the same => use cache
|
||||
Result:=true;
|
||||
end else begin
|
||||
//debugln(['TCodeToolManager.FindReferences cache not valid']);
|
||||
{debugln(['TCodeToolManager.FindReferences IdentifierCode=',Cache.IdentifierCode=IdentifierCode,
|
||||
' X=',Cache.X=X,' Y=',Cache.Y=Y,
|
||||
' SourcesChangeStep=',Cache.SourcesChangeStep=SourceCache.ChangeStamp,',',Cache.SourcesChangeStep=CTInvalidChangeStamp64,
|
||||
' FilesChangeStep=',Cache.FilesChangeStep=FileStateCache.TimeStamp,',',Cache.FilesChangeStep=CTInvalidChangeStamp64,
|
||||
' InitValuesChangeStep=',Cache.InitValuesChangeStep=DefineTree.ChangeStep,',',Cache.InitValuesChangeStep=CTInvalidChangeStamp,
|
||||
'']);}
|
||||
Cache.Clear;
|
||||
Cache.IdentifierCode:=IdentifierCode;
|
||||
Cache.X:=X;
|
||||
Cache.Y:=Y;
|
||||
Cache.SourcesChangeStep:=SourceCache.ChangeStamp;
|
||||
Cache.FilesChangeStep:=FileStateCache.TimeStamp;
|
||||
Cache.InitValuesChangeStep:=DefineTree.ChangeStep;
|
||||
@ -2356,11 +2376,14 @@ begin
|
||||
Result:=true;
|
||||
if NewTopLine=0 then ;
|
||||
if not InitCurCodeTool(SearchInCode) then exit;
|
||||
if Cache.IsPrivate and (FCurCodeTool<>Cache.NewTool) then exit(true);
|
||||
if Cache.IsPrivate and (FCurCodeTool<>Cache.NewTool) then begin
|
||||
//debugln(['TCodeToolManager.FindReferences identifier is not reachable from this unit => skipping search']);
|
||||
exit(true);
|
||||
end;
|
||||
|
||||
CursorPos:=Cache.NewPos;
|
||||
{$IFDEF CTDEBUG}
|
||||
DebugLn('TCodeToolManager.FindReferences B ',dbgs(FCurCodeTool.Scanner<>nil),' x=',dbgs(CursorPos.X),' y=',dbgs(CursorPos.Y),' ',CursorPos.Code.Filename);
|
||||
DebugLn('TCodeToolManager.FindReferences Searching ',dbgs(FCurCodeTool.Scanner<>nil),' for reference to x=',dbgs(CursorPos.X),' y=',dbgs(CursorPos.Y),' ',CursorPos.Code.Filename);
|
||||
{$ENDIF}
|
||||
try
|
||||
Result:=FCurCodeTool.FindReferences(CursorPos,SkipComments,
|
||||
|
||||
@ -3714,7 +3714,7 @@ end;
|
||||
constructor TDefineTree.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
FChangeStep:=CTInvalidChangeStamp;
|
||||
IncreaseChangeStep;
|
||||
FFirstDefineTemplate:=nil;
|
||||
FCache:=TAVLTree.Create(@CompareDirectoryDefines);
|
||||
FDefineStrings:=TStringTree.Create;
|
||||
@ -7162,7 +7162,7 @@ end;
|
||||
|
||||
constructor TFPCTargetConfigCache.Create(AOwner: TComponent);
|
||||
begin
|
||||
FChangeStamp:=CTInvalidChangeStamp;
|
||||
CTIncreaseChangeStamp(FChangeStamp); // set to not 0
|
||||
inherited Create(AOwner);
|
||||
ConfigFiles:=TFPCConfigFileStateList.Create;
|
||||
if Owner is TFPCTargetConfigCaches then
|
||||
@ -7771,7 +7771,7 @@ end;
|
||||
|
||||
constructor TFPCTargetConfigCaches.Create(AOwner: TComponent);
|
||||
begin
|
||||
FChangeStamp:=CTInvalidChangeStamp;
|
||||
CTIncreaseChangeStamp(FChangeStamp); // set to not 0
|
||||
inherited Create(AOwner);
|
||||
fItems:=TAVLTree.Create(@CompareFPCTargetConfigCacheItems);
|
||||
end;
|
||||
@ -8060,7 +8060,7 @@ begin
|
||||
inherited Create(AOwner);
|
||||
Files:=TStringList.Create;
|
||||
Valid:=false;
|
||||
FChangeStamp:=CTInvalidChangeStamp;
|
||||
CTIncreaseChangeStamp(FChangeStamp); // set to not 0
|
||||
if Owner is TFPCSourceCaches then
|
||||
Caches:=TFPCSourceCaches(Owner);
|
||||
end;
|
||||
@ -8213,7 +8213,7 @@ end;
|
||||
|
||||
constructor TFPCSourceCaches.Create(AOwner: TComponent);
|
||||
begin
|
||||
FChangeStamp:=CTInvalidChangeStamp;
|
||||
CTIncreaseChangeStamp(FChangeStamp); // set to not 0
|
||||
inherited Create(AOwner);
|
||||
fItems:=TAVLTree.Create(@CompareFPCSourceCacheItems);
|
||||
end;
|
||||
@ -8667,7 +8667,7 @@ end;
|
||||
constructor TFPCUnitSetCache.Create(TheOwner: TComponent);
|
||||
begin
|
||||
inherited Create(TheOwner);
|
||||
FChangeStamp:=CTInvalidChangeStamp;
|
||||
CTIncreaseChangeStamp(FChangeStamp); // set ot not 0
|
||||
FCaches:=TheOwner as TFPCDefinesCache;
|
||||
fUnitToSourceTree:=TStringToStringTree.Create(false);
|
||||
fSrcDuplicates:=TStringToStringTree.Create(false);
|
||||
|
||||
@ -1270,8 +1270,8 @@ end;
|
||||
constructor TCTDirectoryCachePool.Create;
|
||||
begin
|
||||
FDirectories:=TAVLTree.Create(@CompareCTDirectoryCaches);
|
||||
FFileTimeStamp:=CTInvalidChangeStamp;
|
||||
FConfigTimeStamp:=CTInvalidChangeStamp;
|
||||
IncreaseFileTimeStamp;
|
||||
IncreaseConfigTimeStamp;
|
||||
if FileStateCache<>nil then
|
||||
FileStateCache.AddChangeTimeStampHandler(@OnFileStateCacheChangeTimeStamp);
|
||||
end;
|
||||
|
||||
@ -3206,7 +3206,6 @@ end;
|
||||
constructor TFileStateCache.Create;
|
||||
begin
|
||||
FFiles:=TAVLTree.Create(@CompareFileStateItems);
|
||||
FTimeStamp:=CTInvalidChangeStamp64;
|
||||
CTIncreaseChangeStamp64(FTimeStamp); // one higher than default for new files
|
||||
end;
|
||||
|
||||
|
||||
@ -768,7 +768,7 @@ begin
|
||||
inherited Create;
|
||||
FInitValues:=TExpressionEvaluator.Create;
|
||||
Values:=TExpressionEvaluator.Create;
|
||||
FChangeStep:=CTInvalidChangeStamp;
|
||||
IncreaseChangeStep;
|
||||
FSourceChangeSteps:=TFPList.Create;
|
||||
FMainCode:=nil;
|
||||
FMainSourceFilename:='';
|
||||
|
||||
@ -124,6 +124,7 @@ type
|
||||
function IndexOfChangeHook(AChangeHook: TOnSourceChange): integer;
|
||||
protected
|
||||
procedure IncreaseChangeStep; virtual;
|
||||
procedure DoSourceChanged; virtual;
|
||||
procedure DecodeLoaded(const AFilename: string;
|
||||
var ASource, ADiskEncoding, AMemEncoding: string); virtual;
|
||||
procedure EncodeSaving(const AFilename: string; var ASource: string); virtual;
|
||||
@ -139,7 +140,7 @@ type
|
||||
read GetItems write SetItems; default;
|
||||
function Count: integer; // # Items
|
||||
property SourceLength: integer read fSrcLen;
|
||||
procedure ClearEntries;
|
||||
function ClearEntries: boolean;
|
||||
property ChangeStep: integer read FChangeStep;
|
||||
property Markers[Index: integer]: TSourceLogMarker read GetMarkers;
|
||||
function MarkerCount: integer;
|
||||
@ -398,9 +399,11 @@ begin
|
||||
Result:=FSrcLen;
|
||||
end;
|
||||
|
||||
procedure TSourceLog.ClearEntries;
|
||||
function TSourceLog.ClearEntries: boolean;
|
||||
var i: integer;
|
||||
begin
|
||||
if (Count=0) and (FLog.Count=0) then exit(false);
|
||||
Result:=true;
|
||||
for i:=0 to Count-1 do Items[i].Free;
|
||||
FLog.Clear;
|
||||
end;
|
||||
@ -408,14 +411,16 @@ end;
|
||||
procedure TSourceLog.Clear;
|
||||
var i: integer;
|
||||
m: TSourceLogMarker;
|
||||
SourceChanged: Boolean;
|
||||
begin
|
||||
ClearEntries;
|
||||
ClearEntries; // ignore if entries change
|
||||
// markers are owned by someone else, do not free them
|
||||
for i:=0 to FMarkers.Count-1 do begin
|
||||
m:=Markers[i];
|
||||
if m.Position>1 then
|
||||
m.Deleted:=true;
|
||||
end;
|
||||
SourceChanged:=FSource<>'';
|
||||
FSource:='';
|
||||
FSrcLen:=0;
|
||||
FModified:=false;
|
||||
@ -424,10 +429,12 @@ begin
|
||||
FLineRanges:=nil;
|
||||
end;
|
||||
FLineCount:=-1;
|
||||
IncreaseChangeStep;
|
||||
Data:=nil;
|
||||
FReadOnly:=false;
|
||||
IncreaseChangeStep;
|
||||
NotifyHooks(nil);
|
||||
if SourceChanged then
|
||||
DoSourceChanged;
|
||||
end;
|
||||
|
||||
function TSourceLog.GetItems(Index: integer): TSourceLogEntry;
|
||||
@ -835,6 +842,11 @@ begin
|
||||
//DebugLn('[TSourceLog.IncreaseChangeStep] ',FChangeStep,',',DbgS(Self));
|
||||
end;
|
||||
|
||||
procedure TSourceLog.DoSourceChanged;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
function TSourceLog.SaveToFile(const Filename: string): boolean;
|
||||
var
|
||||
fs: TFileStream;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user