mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-01 19:02:35 +02:00
Specialize the correct generic if it has the same name as another generic that is located at another place of the type hierarchy.
pgenutils.pas: + generate_generic_name: new parameter owner_hierarchy to further influence the specialization name * generate_specialization: pass the ownerhierarchy name to generate_generic_name pdecsub.pas, parse_proc_head: * parse_generic_interface: for now pass '' to the hierarchy parameter; it needs to be checked whether Delphi allows nested interfaces there as well git-svn-id: trunk@29769 -
This commit is contained in:
parent
5a344ee263
commit
d849734acd
@ -736,7 +736,8 @@ implementation
|
||||
begin
|
||||
str(genparalist.count,gencount);
|
||||
genname:=sp+'$'+gencount;
|
||||
genname:=generate_generic_name(genname,specializename);
|
||||
{ ToDo: handle nested interfaces }
|
||||
genname:=generate_generic_name(genname,specializename,'');
|
||||
ugenname:=upper(genname);
|
||||
|
||||
srsym:=search_object_name(ugenname,false);
|
||||
|
@ -40,7 +40,7 @@ uses
|
||||
function parse_generic_specialization_types(genericdeflist:tfpobjectlist;poslist:tfplist;out prettyname,specializename:ansistring):boolean;
|
||||
procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:tfphashobjectlist);
|
||||
procedure maybe_insert_generic_rename_symbol(const name:tidstring;genericlist:tfphashobjectlist);
|
||||
function generate_generic_name(const name:tidstring;specializename:ansistring):tidstring;
|
||||
function generate_generic_name(const name:tidstring;specializename:ansistring;owner_hierarchy:string):tidstring;
|
||||
procedure split_generic_name(const name:tidstring;out nongeneric:string;out count:longint);
|
||||
function resolve_generic_dummysym(const name:tidstring):tsym;
|
||||
function could_be_generic(const name:tidstring):boolean;inline;
|
||||
@ -650,7 +650,7 @@ uses
|
||||
end;
|
||||
|
||||
{ build the new type's name }
|
||||
finalspecializename:=generate_generic_name(genname,specializename);
|
||||
finalspecializename:=generate_generic_name(genname,specializename,genericdef.ownerhierarchyname);
|
||||
ufinalspecializename:=upper(finalspecializename);
|
||||
prettyname:=genericdef.typesym.prettyname+'<'+prettyname+'>';
|
||||
|
||||
@ -1220,7 +1220,7 @@ uses
|
||||
end;
|
||||
end;
|
||||
|
||||
function generate_generic_name(const name:tidstring;specializename:ansistring):tidstring;
|
||||
function generate_generic_name(const name:tidstring;specializename:ansistring;owner_hierarchy:string):tidstring;
|
||||
var
|
||||
crc : cardinal;
|
||||
begin
|
||||
@ -1229,6 +1229,11 @@ uses
|
||||
{ build the new type's name }
|
||||
crc:=UpdateCrc32(0,specializename[1],length(specializename));
|
||||
result:=name+'$crc'+hexstr(crc,8);
|
||||
if owner_hierarchy<>'' then
|
||||
begin
|
||||
crc:=UpdateCrc32(0,owner_hierarchy[1],length(owner_hierarchy));
|
||||
result:=result+'$crc'+hexstr(crc,8);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure split_generic_name(const name:tidstring;out nongeneric:string;out count:longint);
|
||||
|
Loading…
Reference in New Issue
Block a user