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:
svenbarth 2015-02-20 16:28:44 +00:00
parent 5a344ee263
commit d849734acd
2 changed files with 10 additions and 4 deletions

View File

@ -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);

View File

@ -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);