mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-09 01:06:09 +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
|
begin
|
||||||
str(genparalist.count,gencount);
|
str(genparalist.count,gencount);
|
||||||
genname:=sp+'$'+gencount;
|
genname:=sp+'$'+gencount;
|
||||||
genname:=generate_generic_name(genname,specializename);
|
{ ToDo: handle nested interfaces }
|
||||||
|
genname:=generate_generic_name(genname,specializename,'');
|
||||||
ugenname:=upper(genname);
|
ugenname:=upper(genname);
|
||||||
|
|
||||||
srsym:=search_object_name(ugenname,false);
|
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;
|
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 insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:tfphashobjectlist);
|
||||||
procedure maybe_insert_generic_rename_symbol(const name:tidstring;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);
|
procedure split_generic_name(const name:tidstring;out nongeneric:string;out count:longint);
|
||||||
function resolve_generic_dummysym(const name:tidstring):tsym;
|
function resolve_generic_dummysym(const name:tidstring):tsym;
|
||||||
function could_be_generic(const name:tidstring):boolean;inline;
|
function could_be_generic(const name:tidstring):boolean;inline;
|
||||||
@ -650,7 +650,7 @@ uses
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{ build the new type's name }
|
{ build the new type's name }
|
||||||
finalspecializename:=generate_generic_name(genname,specializename);
|
finalspecializename:=generate_generic_name(genname,specializename,genericdef.ownerhierarchyname);
|
||||||
ufinalspecializename:=upper(finalspecializename);
|
ufinalspecializename:=upper(finalspecializename);
|
||||||
prettyname:=genericdef.typesym.prettyname+'<'+prettyname+'>';
|
prettyname:=genericdef.typesym.prettyname+'<'+prettyname+'>';
|
||||||
|
|
||||||
@ -1220,7 +1220,7 @@ uses
|
|||||||
end;
|
end;
|
||||||
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
|
var
|
||||||
crc : cardinal;
|
crc : cardinal;
|
||||||
begin
|
begin
|
||||||
@ -1229,6 +1229,11 @@ uses
|
|||||||
{ build the new type's name }
|
{ build the new type's name }
|
||||||
crc:=UpdateCrc32(0,specializename[1],length(specializename));
|
crc:=UpdateCrc32(0,specializename[1],length(specializename));
|
||||||
result:=name+'$crc'+hexstr(crc,8);
|
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;
|
end;
|
||||||
|
|
||||||
procedure split_generic_name(const name:tidstring;out nongeneric:string;out count:longint);
|
procedure split_generic_name(const name:tidstring;out nongeneric:string;out count:longint);
|
||||||
|
Loading…
Reference in New Issue
Block a user