compiler: move parse_generic_parameters to the interface of pdecl unit, move insert_generic_parameter_types to pdecl unit to access them from pdecsub (preparations for generic methods implementation)

git-svn-id: trunk@16724 -
This commit is contained in:
paul 2011-01-06 17:53:46 +00:00
parent 31de2aab1b
commit e0e01899e5
2 changed files with 53 additions and 52 deletions

View File

@ -26,10 +26,12 @@ unit pdecl;
interface
uses
{ common }
cclasses,
{ global }
globtype,
{ symtable }
symsym,
symsym,symdef,
{ pass_1 }
node;
@ -45,19 +47,23 @@ interface
procedure property_dec(is_classpropery: boolean);
procedure resourcestring_dec;
{ generics support }
function parse_generic_parameters:TFPObjectList;
procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:TFPObjectList);
implementation
uses
SysUtils,
{ common }
cutils,cclasses,
cutils,
{ global }
globals,tokens,verbose,widestr,constexp,
systems,
{ aasm }
aasmbase,aasmtai,aasmdata,fmodule,
{ symtable }
symconst,symbase,symtype,symdef,symtable,paramgr,defutil,
symconst,symbase,symtype,symtable,paramgr,defutil,
{ pass 1 }
nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nobj,
{ codegen }
@ -330,6 +336,50 @@ implementation
consume(_SEMICOLON);
end;
function parse_generic_parameters:TFPObjectList;
var
generictype : ttypesym;
begin
result:=TFPObjectList.Create(false);
repeat
if token=_ID then
begin
generictype:=ttypesym.create(orgpattern,cundefinedtype);
include(generictype.symoptions,sp_generic_para);
result.add(generictype);
end;
consume(_ID);
until not try_to_consume(_COMMA) ;
end;
procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:TFPObjectList);
var
i: longint;
generictype: ttypesym;
st: tsymtable;
begin
def.genericdef:=genericdef;
if not assigned(genericlist) then
exit;
case def.typ of
recorddef,objectdef: st:=tabstractrecorddef(def).symtable;
arraydef: st:=tarraydef(def).symtable;
procvardef,procdef: st:=tabstractprocdef(def).parast;
else
internalerror(201101020);
end;
for i:=0 to genericlist.count-1 do
begin
generictype:=ttypesym(genericlist[i]);
if generictype.typedef.typ=undefineddef then
include(def.defoptions,df_generic)
else
include(def.defoptions,df_specialization);
st.insert(generictype);
end;
end;
procedure types_dec(in_structure: boolean);
@ -343,23 +393,6 @@ implementation
end;
end;
function parse_generic_parameters:TFPObjectList;
var
generictype : ttypesym;
begin
result:=TFPObjectList.Create(false);
repeat
if token=_ID then
begin
generictype:=ttypesym.create(orgpattern,cundefinedtype);
include(generictype.symoptions,sp_generic_para);
result.add(generictype);
end;
consume(_ID);
until not try_to_consume(_COMMA) ;
end;
var
typename,orgtypename : TIDString;
newtype : ttypesym;

View File

@ -37,7 +37,6 @@ interface
function constructor_head:tprocdef;
function destructor_head:tprocdef;
procedure struct_property_dec(is_classproperty:boolean);
procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:TFPObjectList);
implementation
@ -588,37 +587,6 @@ implementation
message(parser_e_dispinterface_needs_a_guid);
end;
procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:TFPObjectList);
var
i: longint;
generictype: ttypesym;
st: tsymtable;
begin
def.genericdef:=genericdef;
if not assigned(genericlist) then
exit;
case def.typ of
recorddef,objectdef: st:=tabstractrecorddef(def).symtable;
arraydef: st:=tarraydef(def).symtable;
procvardef: st:=tprocvardef(def).parast;
else
internalerror(201101020);
end;
for i:=0 to genericlist.count-1 do
begin
generictype:=ttypesym(genericlist[i]);
if generictype.typedef.typ=undefineddef then
include(def.defoptions,df_generic)
else
include(def.defoptions,df_specialization);
st.insert(generictype);
end;
end;
procedure parse_object_members;
procedure chkobjc(pd: tprocdef);