mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-30 05:30:45 +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
|
||||
// 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;
|
||||
|
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