mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-24 09:21:38 +02:00
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:
parent
31de2aab1b
commit
e0e01899e5
@ -26,10 +26,12 @@ unit pdecl;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
|
{ common }
|
||||||
|
cclasses,
|
||||||
{ global }
|
{ global }
|
||||||
globtype,
|
globtype,
|
||||||
{ symtable }
|
{ symtable }
|
||||||
symsym,
|
symsym,symdef,
|
||||||
{ pass_1 }
|
{ pass_1 }
|
||||||
node;
|
node;
|
||||||
|
|
||||||
@ -45,19 +47,23 @@ interface
|
|||||||
procedure property_dec(is_classpropery: boolean);
|
procedure property_dec(is_classpropery: boolean);
|
||||||
procedure resourcestring_dec;
|
procedure resourcestring_dec;
|
||||||
|
|
||||||
|
{ generics support }
|
||||||
|
function parse_generic_parameters:TFPObjectList;
|
||||||
|
procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:TFPObjectList);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
SysUtils,
|
SysUtils,
|
||||||
{ common }
|
{ common }
|
||||||
cutils,cclasses,
|
cutils,
|
||||||
{ global }
|
{ global }
|
||||||
globals,tokens,verbose,widestr,constexp,
|
globals,tokens,verbose,widestr,constexp,
|
||||||
systems,
|
systems,
|
||||||
{ aasm }
|
{ aasm }
|
||||||
aasmbase,aasmtai,aasmdata,fmodule,
|
aasmbase,aasmtai,aasmdata,fmodule,
|
||||||
{ symtable }
|
{ symtable }
|
||||||
symconst,symbase,symtype,symdef,symtable,paramgr,defutil,
|
symconst,symbase,symtype,symtable,paramgr,defutil,
|
||||||
{ pass 1 }
|
{ pass 1 }
|
||||||
nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nobj,
|
nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nobj,
|
||||||
{ codegen }
|
{ codegen }
|
||||||
@ -330,6 +336,50 @@ implementation
|
|||||||
consume(_SEMICOLON);
|
consume(_SEMICOLON);
|
||||||
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;
|
||||||
|
|
||||||
|
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);
|
procedure types_dec(in_structure: boolean);
|
||||||
|
|
||||||
@ -343,23 +393,6 @@ implementation
|
|||||||
end;
|
end;
|
||||||
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
|
var
|
||||||
typename,orgtypename : TIDString;
|
typename,orgtypename : TIDString;
|
||||||
newtype : ttypesym;
|
newtype : ttypesym;
|
||||||
|
|||||||
@ -37,7 +37,6 @@ interface
|
|||||||
function constructor_head:tprocdef;
|
function constructor_head:tprocdef;
|
||||||
function destructor_head:tprocdef;
|
function destructor_head:tprocdef;
|
||||||
procedure struct_property_dec(is_classproperty:boolean);
|
procedure struct_property_dec(is_classproperty:boolean);
|
||||||
procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:TFPObjectList);
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -588,37 +587,6 @@ implementation
|
|||||||
message(parser_e_dispinterface_needs_a_guid);
|
message(parser_e_dispinterface_needs_a_guid);
|
||||||
end;
|
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 parse_object_members;
|
||||||
|
|
||||||
procedure chkobjc(pd: tprocdef);
|
procedure chkobjc(pd: tprocdef);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user