codetools: fixed TCodeToolManager.FindReferences

git-svn-id: trunk@30947 -
This commit is contained in:
mattias 2011-05-28 08:52:08 +00:00
parent 5013437c2f
commit 8e1f917408
7 changed files with 57 additions and 22 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -768,7 +768,7 @@ begin
inherited Create;
FInitValues:=TExpressionEvaluator.Create;
Values:=TExpressionEvaluator.Create;
FChangeStep:=CTInvalidChangeStamp;
IncreaseChangeStep;
FSourceChangeSteps:=TFPList.Create;
FMainCode:=nil;
FMainSourceFilename:='';

View File

@ -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;