mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-02 10:40:41 +02:00
Codetools: FindDeclaration handle nested specialize (specialize as param to outer specialize)
This commit is contained in:
parent
b71e3074a3
commit
e50183f6d1
@ -7907,7 +7907,7 @@ begin
|
|||||||
|
|
||||||
if FindClassContext then begin
|
if FindClassContext then begin
|
||||||
// search ancestor class context
|
// search ancestor class context
|
||||||
if (AncestorContext.Node.Desc in [ctnTypeDefinition,ctnGenericType]) then
|
if (AncestorContext.Node.Desc in [ctnTypeDefinition,ctnGenericType,ctnSpecialize]) then
|
||||||
begin
|
begin
|
||||||
Params:=TFindDeclarationParams.Create;
|
Params:=TFindDeclarationParams.Create;
|
||||||
Params.GenParams := ResultParams.GenParams;
|
Params.GenParams := ResultParams.GenParams;
|
||||||
@ -14458,7 +14458,15 @@ begin
|
|||||||
GenParams.ParamValuesTool:=nil;
|
GenParams.ParamValuesTool:=nil;
|
||||||
GenParams.SpecializeParamsNode:=nil;
|
GenParams.SpecializeParamsNode:=nil;
|
||||||
end;
|
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
|
if not Result then begin
|
||||||
GenParamType := ContextNode.FirstChild;
|
GenParamType := ContextNode.FirstChild;
|
||||||
|
55
components/codetools/tests/laztests/tspecialize_nested.pas
Normal file
55
components/codetools/tests/laztests/tspecialize_nested.pas
Normal 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.
|
Loading…
Reference in New Issue
Block a user