CodeTools, Test: Add test for FindIdentifierReferences.

This commit is contained in:
Martin 2024-02-08 18:47:02 +01:00
parent 8801ff314b
commit 998b38112f
2 changed files with 73 additions and 3 deletions

View File

@ -0,0 +1,35 @@
program Project1{ TODO findrefs:C,...};
uses Classes;
type
TFoo{findrefs:C,3,4;17,17;11,18;6,19;15,20;17,23;3,30;12,31;26,32;17,33} = class // TODO: misses 15,3
type
{ TBar }
TBar{findrefs:5,9;22,17;22,23;8,30;17,31;31,32;22,33} = class
class procedure abc{findrefs:23,10;27,17;13,30;22,31};
class procedure def{findrefs:C,23,11;21,18;27,23;36,32;27,33};
end;
end;
{ TFoo.TBar }
class procedure TFoo.TBar.abc;
begin // TFoo.TBar.def
// TFoo.TBar.abc
// Project1.TFoo.TBar.abc
end;
class procedure TFoo.TBar.def;
begin
end;
var
a: TMethod;
begin
TFoo.TBar.abc;
Project1.TFoo.TBar.abc;
a := TMethod(@Project1.TFoo.TBar.def);
a := TMethod(@TFoo.TBar.def);
end.

View File

@ -48,6 +48,13 @@
{guesstype:
Tests: CodeToolBoss.GuessTypeOfIdentifier
{findrefs:XYLIST
XYLIST=x,y;x,y;...
Tests: CodeToolBoss.FindReferences
An exact list of all the location that codetool will find.
if XYLIST starts with "C," then comments are searched too.
*)
unit TestFindDeclaration;
@ -61,7 +68,7 @@ uses
Classes, SysUtils, contnrs, fpcunit, testregistry, FileProcs, LazFileUtils,
LazLogger, CodeToolManager, ExprEval, CodeCache, BasicCodeTools,
CustomCodeTool, CodeTree, FindDeclarationTool, KeywordFuncLists,
IdentCompletionTool, DefineTemplates, DirectoryCacher, StrUtils,
IdentCompletionTool, DefineTemplates, DirectoryCacher, CTUnitGraph, StrUtils,
TestPascalParser;
const
@ -290,12 +297,15 @@ var
NameStartPos, i, l, IdentifierStartPos, IdentifierEndPos,
BlockTopLine, BlockBottomLine, CommentEnd, StartOffs, TestLoop: Integer;
Marker, ExpectedType, NewType, ExpexctedCompletion, ExpexctedTerm,
ExpexctedCompletionPart, ExpexctedTermPart: String;
ExpexctedCompletionPart, ExpexctedTermPart, s: String;
IdentItem: TIdentifierListItem;
ItsAKeyword, IsSubIdentifier, ExpInvert: boolean;
ItsAKeyword, IsSubIdentifier, ExpInvert, ExpComment: boolean;
ExistingDefinition: TFindContext;
ListOfPFindContext: TFPList;
NewExprType: TExpressionType;
ListOfPCodeXYPosition: TFPList;
Cache: TFindIdentifierReferenceCache;
CodePos: PCodeXYPosition;
begin
FMainCode:=aCode;
DoParseModule(MainCode,FMainTool);
@ -505,6 +515,31 @@ begin
FreeListOfPFindContext(ListOfPFindContext);
end;
end else if Marker='findrefs' then begin
ExpectedPath:=copy(Src,PathPos,CommentP-1-PathPos);
ExpComment := copy(ExpectedPath,1,2) = 'C,';
if ExpComment then delete(ExpectedPath, 1, 2);
ListOfPCodeXYPosition:=nil;
Cache:=nil;
MainTool.CleanPosToCaret(IdentifierStartPos,CursorPos);
if not CodeToolBoss.FindReferences(
aCode,CursorPos.X,CursorPos.Y,
aCode {TODO: iterate multiple files}, not ExpComment,
ListOfPCodeXYPosition, Cache)
then
AssertTrue('FindReferences failed at '+MainTool.CleanPosToStr(IdentifierStartPos,true), False);
s := '';
for i:=0 to ListOfPCodeXYPosition.Count-1 do begin
if s <> '' then
s := s + ';';
s := s + IntToStr(PCodeXYPosition(ListOfPCodeXYPosition[i])^.X) + ',' + IntToStr(PCodeXYPosition(ListOfPCodeXYPosition[i])^.Y);
end;
CodeToolBoss.FreeListOfPCodeXYPosition(ListOfPCodeXYPosition);
Cache.Free;
AssertEquals('FindReferences failed at '+MainTool.CleanPosToStr(IdentifierStartPos,true), ExpectedPath, s);
end else begin
WriteSource(IdentifierStartPos,MainTool);
AssertEquals('Unknown marker at '+MainTool.CleanPosToStr(IdentifierStartPos,true),'declaration',Marker);