Codetools: FindDeclaration handle nested specialize (specialize as param to outer specialize)

This commit is contained in:
Martin 2024-04-14 16:59:50 +02:00
parent b71e3074a3
commit e50183f6d1
2 changed files with 65 additions and 2 deletions

View File

@ -7907,7 +7907,7 @@ begin
if FindClassContext then begin
// search ancestor class context
if (AncestorContext.Node.Desc in [ctnTypeDefinition,ctnGenericType]) then
if (AncestorContext.Node.Desc in [ctnTypeDefinition,ctnGenericType,ctnSpecialize]) then
begin
Params:=TFindDeclarationParams.Create;
Params.GenParams := ResultParams.GenParams;
@ -14458,7 +14458,15 @@ begin
GenParams.ParamValuesTool:=nil;
GenParams.SpecializeParamsNode:=nil;
end;
Result:=DoFindIdentifierInContext(ContextTool);
Result := (ContextNode.FirstChild <> nil) and (ContextNode.FirstChild.Desc = ctnSpecialize);
if Result then begin
NewNode:= ContextNode.FirstChild;
NewCodeTool:=ContextTool;
Include(Flags, fdfDoNotCache);
Include(NewFlags, fodDoNotCache);
end
else
Result:=DoFindIdentifierInContext(ContextTool);
if not Result then begin
GenParamType := ContextNode.FirstChild;

View File

@ -0,0 +1,55 @@
program tspecialize_nested;
{$Mode objfpc}
type
generic G1<_B1: TObject> = class(_B1)
procedure p1;
end;
generic G2<_B2: TObject> = class(_B2)
procedure p2;
end;
C1 = class
procedure f1;
end;
C2 = class(
specialize G2<
specialize G1<C1>
>
)
procedure f2;
end;
procedure C1.f1;
begin
{completion:!p1,!p2,f1,!f2}
f1{declaration:C1.f1};
end;
procedure C2.f2;
begin
{completion:p1,p2,f1,f2}
p2{declaration:G2.p2};
p1{declaration:G1.p1};
f1{declaration:C1.f1};
f2{declaration:C2.f2};
end;
procedure G1.p1;
begin
{completion:p1,!p2,!f1,!f2}
p1{declaration:G1.p1};
end;
procedure G2.p2;
begin
{completion:!p1,p2,!f1,!f2}
p2{declaration:G2.p2};
end;
begin
end.