diff --git a/components/codetools/finddeclarationtool.pas b/components/codetools/finddeclarationtool.pas index b99c84ef6b..4987b3e9f6 100644 --- a/components/codetools/finddeclarationtool.pas +++ b/components/codetools/finddeclarationtool.pas @@ -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; diff --git a/components/codetools/tests/laztests/tspecialize_nested.pas b/components/codetools/tests/laztests/tspecialize_nested.pas new file mode 100644 index 0000000000..9b9e433418 --- /dev/null +++ b/components/codetools/tests/laztests/tspecialize_nested.pas @@ -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 + > + ) + 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.