* extract the code to parse a forward declaration out from types_dec into its own function parse_forward_declaration

This commit is contained in:
Sven/Sarah Barth 2022-02-18 16:19:47 +01:00
parent 7f1e420bb0
commit 3e26beb1ed

View File

@ -31,7 +31,7 @@ interface
{ global } { global }
globtype, globtype,
{ symtable } { symtable }
symsym,symdef, symsym,symdef,symtype,
{ pass_1 } { pass_1 }
node; node;
@ -47,6 +47,7 @@ interface
procedure property_dec; procedure property_dec;
procedure resourcestring_dec(out had_generic:boolean); procedure resourcestring_dec(out had_generic:boolean);
procedure parse_rttiattributes(var rtti_attrs_def:trtti_attribute_list); procedure parse_rttiattributes(var rtti_attrs_def:trtti_attribute_list);
function parse_forward_declaration(sym:tsym;gentypename,genorgtypename:tidstring;generictypelist:tfphashobjectlist;out newtype:ttypesym):tdef;
implementation implementation
@ -58,7 +59,7 @@ implementation
globals,tokens,verbose,widestr,constexp, globals,tokens,verbose,widestr,constexp,
systems,aasmdata,fmodule,compinnr, systems,aasmdata,fmodule,compinnr,
{ symtable } { symtable }
symconst,symbase,symtype,symcpu,symcreat,defutil,defcmp,symtable, symconst,symbase,symcpu,symcreat,defutil,defcmp,symtable,
{ pass 1 } { pass 1 }
ninl,ncon,nobj,ngenutil,nld,nmem,ncal,pass_1, ninl,ncon,nobj,ngenutil,nld,nmem,ncal,pass_1,
{ parser } { parser }
@ -566,6 +567,67 @@ implementation
end; end;
function parse_forward_declaration(sym:tsym;gentypename,genorgtypename:tidstring;generictypelist:tfphashobjectlist;out newtype:ttypesym):tdef;
var
wasforward : boolean;
objecttype : tobjecttyp;
gendef : tstoreddef;
begin
newtype:=nil;
wasforward:=false;
if ((token=_CLASS) or
(token=_INTERFACE) or
(token=_DISPINTERFACE) or
(token=_OBJCCLASS) or
(token=_OBJCPROTOCOL) or
(token=_OBJCCATEGORY)) and
(assigned(ttypesym(sym).typedef)) and
is_implicit_pointer_object_type(ttypesym(sym).typedef) and
(oo_is_forward in tobjectdef(ttypesym(sym).typedef).objectoptions) then
begin
wasforward:=true;
objecttype:=odt_none;
case token of
_CLASS :
objecttype:=default_class_type;
_INTERFACE :
case current_settings.interfacetype of
it_interfacecom:
objecttype:=odt_interfacecom;
it_interfacecorba:
objecttype:=odt_interfacecorba;
it_interfacejava:
objecttype:=odt_interfacejava;
end;
_DISPINTERFACE :
objecttype:=odt_dispinterface;
_OBJCCLASS,
_OBJCCATEGORY :
objecttype:=odt_objcclass;
_OBJCPROTOCOL :
objecttype:=odt_objcprotocol;
else
internalerror(200811072);
end;
consume(token);
{ determine the generic def in case we are in a nested type
of a specialization }
gendef:=determine_generic_def(gentypename);
{ we can ignore the result, the definition is modified }
object_dec(objecttype,genorgtypename,newtype,gendef,generictypelist,tobjectdef(ttypesym(sym).typedef),ht_none);
if wasforward and
(tobjectdef(ttypesym(sym).typedef).objecttype<>objecttype) then
Message1(type_e_forward_interface_type_does_not_match,tobjectdef(ttypesym(sym).typedef).GetTypeName);
newtype:=ttypesym(sym);
result:=newtype.typedef;
end
else
begin
message1(parser_h_type_redef,genorgtypename);
result:=generrordef;
end;
end;
{ From http://clang.llvm.org/docs/LanguageExtensions.html#objective-c-features : { From http://clang.llvm.org/docs/LanguageExtensions.html#objective-c-features :
To determine whether a method has an inferred related result type, the first word in the camel-case selector To determine whether a method has an inferred related result type, the first word in the camel-case selector
(e.g., “init” in “initWithObjects”) is considered, and the method will have a related result type if its return (e.g., “init” in “initWithObjects”) is considered, and the method will have a related result type if its return
@ -633,12 +695,10 @@ implementation
defpos,storetokenpos : tfileposinfo; defpos,storetokenpos : tfileposinfo;
old_block_type : tblock_type; old_block_type : tblock_type;
old_checkforwarddefs: TFPObjectList; old_checkforwarddefs: TFPObjectList;
objecttype : tobjecttyp;
first, first,
isgeneric, isgeneric,
isunique, isunique,
istyperenaming, istyperenaming : boolean;
wasforward: boolean;
generictypelist : tfphashobjectlist; generictypelist : tfphashobjectlist;
localgenerictokenbuf : tdynamicarray; localgenerictokenbuf : tdynamicarray;
p:tnode; p:tnode;
@ -745,55 +805,7 @@ implementation
(sp_generic_dummy in sym.symoptions) (sp_generic_dummy in sym.symoptions)
) then ) then
begin begin
wasforward:=false; hdef:=parse_forward_declaration(sym,gentypename,genorgtypename,generictypelist,newtype);
if ((token=_CLASS) or
(token=_INTERFACE) or
(token=_DISPINTERFACE) or
(token=_OBJCCLASS) or
(token=_OBJCPROTOCOL) or
(token=_OBJCCATEGORY)) and
(assigned(ttypesym(sym).typedef)) and
is_implicit_pointer_object_type(ttypesym(sym).typedef) and
(oo_is_forward in tobjectdef(ttypesym(sym).typedef).objectoptions) then
begin
wasforward:=true;
objecttype:=odt_none;
case token of
_CLASS :
objecttype:=default_class_type;
_INTERFACE :
case current_settings.interfacetype of
it_interfacecom:
objecttype:=odt_interfacecom;
it_interfacecorba:
objecttype:=odt_interfacecorba;
it_interfacejava:
objecttype:=odt_interfacejava;
end;
_DISPINTERFACE :
objecttype:=odt_dispinterface;
_OBJCCLASS,
_OBJCCATEGORY :
objecttype:=odt_objcclass;
_OBJCPROTOCOL :
objecttype:=odt_objcprotocol;
else
internalerror(200811072);
end;
consume(token);
{ determine the generic def in case we are in a nested type
of a specialization }
gendef:=determine_generic_def(gentypename);
{ we can ignore the result, the definition is modified }
object_dec(objecttype,genorgtypename,newtype,gendef,generictypelist,tobjectdef(ttypesym(sym).typedef),ht_none);
if wasforward and
(tobjectdef(ttypesym(sym).typedef).objecttype<>objecttype) then
Message1(type_e_forward_interface_type_does_not_match,tobjectdef(ttypesym(sym).typedef).GetTypeName);
newtype:=ttypesym(sym);
hdef:=newtype.typedef;
end
else
message1(parser_h_type_redef,genorgtypename);
end; end;
end; end;
{ no old type reused ? Then insert this new type } { no old type reused ? Then insert this new type }