mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 16:09:27 +02:00
* extract the code to parse a forward declaration out from types_dec into its own function parse_forward_declaration
This commit is contained in:
parent
7f1e420bb0
commit
3e26beb1ed
@ -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 }
|
||||||
|
Loading…
Reference in New Issue
Block a user