ptype.pas 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554
  1. {
  2. Copyright (c) 1998-2002 by Florian Klaempfl
  3. Does parsing types for Free Pascal
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************
  16. }
  17. unit ptype;
  18. {$i fpcdefs.inc}
  19. interface
  20. uses
  21. globtype,cclasses,
  22. symtype,symdef,symbase;
  23. procedure resolve_forward_types;
  24. { reads a type identifier }
  25. procedure id_type(var def : tdef;isforwarddef:boolean);
  26. { reads a string, file type or a type identifier }
  27. procedure single_type(var def:tdef;isforwarddef,allowtypedef:boolean);
  28. { reads any type declaration, where the resulting type will get name as type identifier }
  29. procedure read_named_type(var def:tdef;const name : TIDString;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean);
  30. { reads any type declaration }
  31. procedure read_anon_type(var def : tdef;parseprocvardir:boolean);
  32. { generate persistent type information like VMT, RTTI and inittables }
  33. procedure write_persistent_type_info(st:tsymtable);
  34. implementation
  35. uses
  36. { common }
  37. cutils,
  38. { global }
  39. globals,tokens,verbose,constexp,
  40. systems,
  41. { target }
  42. paramgr,procinfo,
  43. { symtable }
  44. symconst,symsym,symtable,
  45. defutil,defcmp,
  46. { modules }
  47. fmodule,
  48. { pass 1 }
  49. node,ncgrtti,nobj,
  50. nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,
  51. { parser }
  52. scanner,
  53. pbase,pexpr,pdecsub,pdecvar,pdecobj,pdecl;
  54. procedure resolve_forward_types;
  55. var
  56. i: longint;
  57. hpd,
  58. def : tdef;
  59. srsym : tsym;
  60. srsymtable : TSymtable;
  61. hs : string;
  62. begin
  63. for i:=0 to current_module.checkforwarddefs.Count-1 do
  64. begin
  65. def:=tdef(current_module.checkforwarddefs[i]);
  66. case def.typ of
  67. pointerdef,
  68. classrefdef :
  69. begin
  70. { classrefdef inherits from pointerdef }
  71. hpd:=tabstractpointerdef(def).pointeddef;
  72. { still a forward def ? }
  73. if hpd.typ=forwarddef then
  74. begin
  75. { try to resolve the forward }
  76. if not assigned(tforwarddef(hpd).tosymname) then
  77. internalerror(200211201);
  78. hs:=tforwarddef(hpd).tosymname^;
  79. searchsym(upper(hs),srsym,srsymtable);
  80. { we don't need the forwarddef anymore, dispose it }
  81. hpd.free;
  82. tabstractpointerdef(def).pointeddef:=nil; { if error occurs }
  83. { was a type sym found ? }
  84. if assigned(srsym) and
  85. (srsym.typ=typesym) then
  86. begin
  87. tabstractpointerdef(def).pointeddef:=ttypesym(srsym).typedef;
  88. { avoid wrong unused warnings web bug 801 PM }
  89. inc(ttypesym(srsym).refs);
  90. { we need a class type for classrefdef }
  91. if (def.typ=classrefdef) and
  92. not(is_class(ttypesym(srsym).typedef)) and
  93. not(is_objcclass(ttypesym(srsym).typedef)) then
  94. MessagePos1(def.typesym.fileinfo,type_e_class_type_expected,ttypesym(srsym).typedef.typename);
  95. end
  96. else
  97. begin
  98. Message1(sym_e_forward_type_not_resolved,hs);
  99. { try to recover }
  100. tabstractpointerdef(def).pointeddef:=generrordef;
  101. end;
  102. end;
  103. end;
  104. objectdef :
  105. begin
  106. { give an error as the implementation may follow in an
  107. other type block which is allowed by FPC modes }
  108. if not(m_fpc in current_settings.modeswitches) and
  109. (oo_is_forward in tobjectdef(def).objectoptions) then
  110. MessagePos1(def.typesym.fileinfo,type_e_type_is_not_completly_defined,def.typename);
  111. end;
  112. else
  113. internalerror(200811071);
  114. end;
  115. end;
  116. current_module.checkforwarddefs.clear;
  117. end;
  118. procedure generate_specialization(var tt:tdef);
  119. var
  120. st : TSymtable;
  121. srsym : tsym;
  122. pt2 : tnode;
  123. first,
  124. err : boolean;
  125. i : longint;
  126. sym : tsym;
  127. genericdef : tstoreddef;
  128. generictype : ttypesym;
  129. generictypelist : TFPObjectList;
  130. oldsymtablestack : tsymtablestack;
  131. hmodule : tmodule;
  132. pu : tused_unit;
  133. uspecializename,
  134. specializename : string;
  135. vmtbuilder : TVMTBuilder;
  136. onlyparsepara : boolean;
  137. specializest : tsymtable;
  138. item: psymtablestackitem;
  139. begin
  140. { retrieve generic def that we are going to replace }
  141. genericdef:=tstoreddef(tt);
  142. tt:=nil;
  143. onlyparsepara:=false;
  144. if not(df_generic in genericdef.defoptions) then
  145. begin
  146. Message(parser_e_special_onlygenerics);
  147. tt:=generrordef;
  148. onlyparsepara:=true;
  149. end;
  150. { only need to record the tokens, then we don't know the type yet ... }
  151. if parse_generic then
  152. begin
  153. { ... but we have to insert a def into the symtable else the deflist
  154. of generic and specialization might not be equally sized which
  155. is later assumed }
  156. tt:=tundefineddef.create;
  157. onlyparsepara:=true;
  158. end;
  159. { Only parse the parameters for recovery or
  160. for recording in genericbuf }
  161. if onlyparsepara then
  162. begin
  163. consume(_LSHARPBRACKET);
  164. repeat
  165. pt2:=factor(false,true);
  166. pt2.free;
  167. until not try_to_consume(_COMMA);
  168. consume(_RSHARPBRACKET);
  169. exit;
  170. end;
  171. consume(_LSHARPBRACKET);
  172. { Parse generic parameters, for each undefineddef in the symtable of
  173. the genericdef we need to have a new def }
  174. err:=false;
  175. first:=true;
  176. generictypelist:=TFPObjectList.create(false);
  177. case genericdef.typ of
  178. procdef :
  179. st:=genericdef.GetSymtable(gs_para);
  180. objectdef,
  181. recorddef :
  182. st:=genericdef.GetSymtable(gs_record);
  183. end;
  184. if not assigned(st) then
  185. internalerror(200511182);
  186. { Parse type parameters }
  187. if not assigned(genericdef.typesym) then
  188. internalerror(200710173);
  189. specializename:=genericdef.typesym.realname;
  190. for i:=0 to st.SymList.Count-1 do
  191. begin
  192. sym:=tsym(st.SymList[i]);
  193. if (sp_generic_para in sym.symoptions) then
  194. begin
  195. if not first then
  196. consume(_COMMA)
  197. else
  198. first:=false;
  199. pt2:=factor(false,true);
  200. if pt2.nodetype=typen then
  201. begin
  202. if df_generic in pt2.resultdef.defoptions then
  203. Message(parser_e_no_generics_as_params);
  204. generictype:=ttypesym.create(sym.realname,pt2.resultdef);
  205. generictypelist.add(generictype);
  206. if not assigned(pt2.resultdef.typesym) then
  207. message(type_e_generics_cannot_reference_itself)
  208. else
  209. specializename:=specializename+'$'+pt2.resultdef.typesym.realname;
  210. end
  211. else
  212. begin
  213. Message(type_e_type_id_expected);
  214. err:=true;
  215. end;
  216. pt2.free;
  217. end;
  218. end;
  219. uspecializename:=upper(specializename);
  220. { force correct error location if too much type parameters are passed }
  221. if token<>_RSHARPBRACKET then
  222. consume(_RSHARPBRACKET);
  223. { Special case if we are referencing the current defined object }
  224. if assigned(current_structdef) and
  225. (current_structdef.objname^=uspecializename) then
  226. tt:=current_structdef;
  227. { for units specializations can already be needed in the interface, therefor we
  228. will use the global symtable. Programs don't have a globalsymtable and there we
  229. use the localsymtable }
  230. if current_module.is_unit then
  231. specializest:=current_module.globalsymtable
  232. else
  233. specializest:=current_module.localsymtable;
  234. { Can we reuse an already specialized type? }
  235. if not assigned(tt) then
  236. begin
  237. srsym:=tsym(specializest.find(uspecializename));
  238. if assigned(srsym) then
  239. begin
  240. if srsym.typ<>typesym then
  241. internalerror(200710171);
  242. tt:=ttypesym(srsym).typedef;
  243. end;
  244. end;
  245. if not assigned(tt) then
  246. begin
  247. { Setup symtablestack at definition time
  248. to get types right, however this is not perfect, we should probably record
  249. the resolved symbols }
  250. oldsymtablestack:=symtablestack;
  251. symtablestack:=tsymtablestack.create;
  252. if not assigned(genericdef) then
  253. internalerror(200705151);
  254. hmodule:=find_module_from_symtable(genericdef.owner);
  255. if hmodule=nil then
  256. internalerror(200705152);
  257. pu:=tused_unit(hmodule.used_units.first);
  258. while assigned(pu) do
  259. begin
  260. if not assigned(pu.u.globalsymtable) then
  261. internalerror(200705153);
  262. symtablestack.push(pu.u.globalsymtable);
  263. pu:=tused_unit(pu.next);
  264. end;
  265. if assigned(hmodule.globalsymtable) then
  266. symtablestack.push(hmodule.globalsymtable);
  267. { hacky, but necessary to insert the newly generated class properly }
  268. item:=oldsymtablestack.stack;
  269. while assigned(item) and (item^.symtable.symtablelevel>main_program_level) do
  270. item:=item^.next;
  271. if assigned(item) and (item^.symtable<>symtablestack.top) then
  272. symtablestack.push(item^.symtable);
  273. { Reparse the original type definition }
  274. if not err then
  275. begin
  276. { First a new typesym so we can reuse this specialization and
  277. references to this specialization can be handled }
  278. srsym:=ttypesym.create(specializename,generrordef);
  279. specializest.insert(srsym);
  280. if not assigned(genericdef.generictokenbuf) then
  281. internalerror(200511171);
  282. current_scanner.startreplaytokens(genericdef.generictokenbuf);
  283. read_named_type(tt,specializename,genericdef,generictypelist,false);
  284. ttypesym(srsym).typedef:=tt;
  285. tt.typesym:=srsym;
  286. { Consume the semicolon if it is also recorded }
  287. try_to_consume(_SEMICOLON);
  288. { Build VMT indexes for classes }
  289. if (tt.typ=objectdef) then
  290. begin
  291. vmtbuilder:=TVMTBuilder.Create(tobjectdef(tt));
  292. vmtbuilder.generate_vmt;
  293. vmtbuilder.free;
  294. end;
  295. end;
  296. { Restore symtablestack }
  297. symtablestack.free;
  298. symtablestack:=oldsymtablestack;
  299. end
  300. else
  301. begin
  302. { There is comment few lines before ie 200512115
  303. saying "We are parsing the same objectdef, the def index numbers
  304. are the same". This is wrong (index numbers are not same)
  305. in case there is specialization (S2 in this case) inside
  306. specialized generic (G2 in this case) which is equal to
  307. some previous specialization (S1 in this case). In that case,
  308. new symbol is not added to currently specialized type
  309. (S in this case) for that specializations (S2 in this case),
  310. and this results in that specialization and generic definition
  311. don't have same number of elements in their object symbol tables.
  312. This patch adds undefined def to ensure that those
  313. two symbol tables will have same number of elements.
  314. }
  315. tundefineddef.create;
  316. end;
  317. generictypelist.free;
  318. consume(_RSHARPBRACKET);
  319. end;
  320. procedure id_type(var def : tdef;isforwarddef:boolean);
  321. { reads a type definition }
  322. { to a appropriating tdef, s gets the name of }
  323. { the type to allow name mangling }
  324. var
  325. is_unit_specific : boolean;
  326. pos : tfileposinfo;
  327. srsym : tsym;
  328. srsymtable : TSymtable;
  329. s,sorg : TIDString;
  330. t : ttoken;
  331. structdef : tabstractrecorddef;
  332. begin
  333. s:=pattern;
  334. sorg:=orgpattern;
  335. pos:=current_tokenpos;
  336. { use of current parsed object:
  337. - classes can be used also in classes
  338. - objects can be parameters }
  339. structdef:=current_structdef;
  340. while assigned(structdef) and (structdef.typ in [objectdef,recorddef]) do
  341. begin
  342. if (structdef.objname^=pattern) then
  343. begin
  344. consume(_ID);
  345. def:=structdef;
  346. exit;
  347. end;
  348. structdef:=tabstractrecorddef(structdef.owner.defowner);
  349. end;
  350. { Use the special searchsym_type that ignores records and parameters }
  351. searchsym_type(s,srsym,srsymtable);
  352. { handle unit specification like System.Writeln }
  353. is_unit_specific:=try_consume_unitsym(srsym,srsymtable,t);
  354. consume(t);
  355. { Types are first defined with an error def before assigning
  356. the real type so check if it's an errordef. if so then
  357. give an error. Only check for typesyms in the current symbol
  358. table as forwarddef are not resolved directly }
  359. if assigned(srsym) and
  360. (srsym.typ=typesym) and
  361. (ttypesym(srsym).typedef.typ=errordef) then
  362. begin
  363. Message1(type_e_type_is_not_completly_defined,ttypesym(srsym).realname);
  364. def:=generrordef;
  365. exit;
  366. end;
  367. { are we parsing a possible forward def ? }
  368. if isforwarddef and
  369. not(is_unit_specific) then
  370. begin
  371. def:=tforwarddef.create(sorg,pos);
  372. exit;
  373. end;
  374. { unknown sym ? }
  375. if not assigned(srsym) then
  376. begin
  377. Message1(sym_e_id_not_found,sorg);
  378. def:=generrordef;
  379. exit;
  380. end;
  381. { type sym ? }
  382. if (srsym.typ<>typesym) then
  383. begin
  384. Message(type_e_type_id_expected);
  385. def:=generrordef;
  386. exit;
  387. end;
  388. { Give an error when referring to an errordef }
  389. if (ttypesym(srsym).typedef.typ=errordef) then
  390. begin
  391. Message(sym_e_error_in_type_def);
  392. def:=generrordef;
  393. exit;
  394. end;
  395. def:=ttypesym(srsym).typedef;
  396. end;
  397. procedure single_type(var def:tdef;isforwarddef,allowtypedef:boolean);
  398. var
  399. t2 : tdef;
  400. dospecialize,
  401. again : boolean;
  402. begin
  403. dospecialize:=false;
  404. repeat
  405. again:=false;
  406. case token of
  407. _STRING:
  408. string_dec(def,allowtypedef);
  409. _FILE:
  410. begin
  411. consume(_FILE);
  412. if (token=_OF) then
  413. begin
  414. if not(allowtypedef) then
  415. Message(parser_e_no_local_para_def);
  416. consume(_OF);
  417. single_type(t2,false,false);
  418. if is_managed_type(t2) then
  419. Message(parser_e_no_refcounted_typed_file);
  420. def:=tfiledef.createtyped(t2);
  421. end
  422. else
  423. def:=cfiletype;
  424. end;
  425. _ID:
  426. begin
  427. if try_to_consume(_SPECIALIZE) then
  428. begin
  429. if not(allowtypedef) then
  430. begin
  431. Message(parser_e_no_local_para_def);
  432. { try to recover }
  433. while token<>_SEMICOLON do
  434. consume(token);
  435. def:=generrordef;
  436. end
  437. else
  438. begin
  439. dospecialize:=true;
  440. again:=true;
  441. end;
  442. end
  443. else
  444. begin
  445. id_type(def,isforwarddef);
  446. { handle types inside classes, e.g. TNode.TLongint }
  447. while (token=_POINT) do
  448. begin
  449. if parse_generic then
  450. begin
  451. consume(_POINT);
  452. consume(_ID);
  453. end
  454. else if is_class_or_object(def) or is_record(def) then
  455. begin
  456. symtablestack.push(tabstractrecorddef(def).symtable);
  457. consume(_POINT);
  458. id_type(t2,isforwarddef);
  459. symtablestack.pop(tabstractrecorddef(def).symtable);
  460. def:=t2;
  461. end
  462. else
  463. break;
  464. end;
  465. end;
  466. end;
  467. else
  468. begin
  469. message(type_e_type_id_expected);
  470. def:=generrordef;
  471. end;
  472. end;
  473. until not again;
  474. if dospecialize then
  475. generate_specialization(def)
  476. else
  477. begin
  478. if assigned(current_specializedef) and (def=current_specializedef.genericdef) then
  479. begin
  480. def:=current_specializedef
  481. end
  482. else if (def=current_genericdef) then
  483. begin
  484. def:=current_genericdef
  485. end
  486. else if (df_generic in def.defoptions) then
  487. begin
  488. Message(parser_e_no_generics_as_types);
  489. def:=generrordef;
  490. end
  491. else if is_objccategory(def) then
  492. begin
  493. Message(parser_e_no_category_as_types);
  494. def:=generrordef
  495. end
  496. end;
  497. end;
  498. procedure parse_record_members;
  499. procedure maybe_parse_hint_directives(pd:tprocdef);
  500. var
  501. dummysymoptions : tsymoptions;
  502. deprecatedmsg : pshortstring;
  503. begin
  504. dummysymoptions:=[];
  505. deprecatedmsg:=nil;
  506. while try_consume_hintdirective(dummysymoptions,deprecatedmsg) do
  507. Consume(_SEMICOLON);
  508. if assigned(pd) then
  509. begin
  510. pd.symoptions:=pd.symoptions+dummysymoptions;
  511. pd.deprecatedmsg:=deprecatedmsg;
  512. end
  513. else
  514. stringdispose(deprecatedmsg);
  515. end;
  516. var
  517. pd : tprocdef;
  518. oldparse_only: boolean;
  519. member_blocktype : tblock_type;
  520. fields_allowed, is_classdef, classfields: boolean;
  521. vdoptions: tvar_dec_options;
  522. begin
  523. { empty record declaration ? }
  524. if (token=_SEMICOLON) then
  525. Exit;
  526. current_structdef.symtable.currentvisibility:=vis_public;
  527. fields_allowed:=true;
  528. is_classdef:=false;
  529. classfields:=false;
  530. member_blocktype:=bt_general;
  531. repeat
  532. case token of
  533. _TYPE :
  534. begin
  535. consume(_TYPE);
  536. member_blocktype:=bt_type;
  537. end;
  538. _VAR :
  539. begin
  540. consume(_VAR);
  541. fields_allowed:=true;
  542. member_blocktype:=bt_general;
  543. classfields:=is_classdef;
  544. is_classdef:=false;
  545. end;
  546. _CONST:
  547. begin
  548. consume(_CONST);
  549. member_blocktype:=bt_const;
  550. end;
  551. _ID, _CASE, _OPERATOR :
  552. begin
  553. case idtoken of
  554. _PRIVATE :
  555. begin
  556. consume(_PRIVATE);
  557. current_structdef.symtable.currentvisibility:=vis_private;
  558. include(current_structdef.objectoptions,oo_has_private);
  559. fields_allowed:=true;
  560. is_classdef:=false;
  561. classfields:=false;
  562. member_blocktype:=bt_general;
  563. end;
  564. _PROTECTED :
  565. begin
  566. consume(_PROTECTED);
  567. current_structdef.symtable.currentvisibility:=vis_protected;
  568. include(current_structdef.objectoptions,oo_has_protected);
  569. fields_allowed:=true;
  570. is_classdef:=false;
  571. classfields:=false;
  572. member_blocktype:=bt_general;
  573. end;
  574. _PUBLIC :
  575. begin
  576. consume(_PUBLIC);
  577. current_structdef.symtable.currentvisibility:=vis_public;
  578. fields_allowed:=true;
  579. is_classdef:=false;
  580. classfields:=false;
  581. member_blocktype:=bt_general;
  582. end;
  583. _PUBLISHED :
  584. begin
  585. Message(parser_e_no_record_published);
  586. consume(_PUBLISHED);
  587. current_structdef.symtable.currentvisibility:=vis_published;
  588. fields_allowed:=true;
  589. is_classdef:=false;
  590. classfields:=false;
  591. member_blocktype:=bt_general;
  592. end;
  593. _STRICT :
  594. begin
  595. consume(_STRICT);
  596. if token=_ID then
  597. begin
  598. case idtoken of
  599. _PRIVATE:
  600. begin
  601. consume(_PRIVATE);
  602. current_structdef.symtable.currentvisibility:=vis_strictprivate;
  603. include(current_structdef.objectoptions,oo_has_strictprivate);
  604. end;
  605. _PROTECTED:
  606. begin
  607. consume(_PROTECTED);
  608. current_structdef.symtable.currentvisibility:=vis_strictprotected;
  609. include(current_structdef.objectoptions,oo_has_strictprotected);
  610. end;
  611. else
  612. message(parser_e_protected_or_private_expected);
  613. end;
  614. end
  615. else
  616. message(parser_e_protected_or_private_expected);
  617. fields_allowed:=true;
  618. is_classdef:=false;
  619. classfields:=false;
  620. member_blocktype:=bt_general;
  621. end
  622. else
  623. if is_classdef and (idtoken=_OPERATOR) then
  624. begin
  625. oldparse_only:=parse_only;
  626. parse_only:=true;
  627. pd:=parse_proc_dec(is_classdef,current_structdef);
  628. { this is for error recovery as well as forward }
  629. { interface mappings, i.e. mapping to a method }
  630. { which isn't declared yet }
  631. if assigned(pd) then
  632. begin
  633. parse_record_proc_directives(pd);
  634. handle_calling_convention(pd);
  635. { add definition to procsym }
  636. proc_add_definition(pd);
  637. end;
  638. maybe_parse_hint_directives(pd);
  639. parse_only:=oldparse_only;
  640. fields_allowed:=false;
  641. is_classdef:=false;
  642. end
  643. else
  644. begin
  645. if member_blocktype=bt_general then
  646. begin
  647. if (not fields_allowed) then
  648. Message(parser_e_field_not_allowed_here);
  649. vdoptions:=[vd_record];
  650. if classfields then
  651. include(vdoptions,vd_class);
  652. read_record_fields(vdoptions);
  653. end
  654. else if member_blocktype=bt_type then
  655. types_dec(true)
  656. else if member_blocktype=bt_const then
  657. consts_dec(true)
  658. else
  659. internalerror(201001110);
  660. end;
  661. end;
  662. end;
  663. _PROPERTY :
  664. begin
  665. struct_property_dec(is_classdef);
  666. fields_allowed:=false;
  667. is_classdef:=false;
  668. end;
  669. _CLASS:
  670. begin
  671. is_classdef:=false;
  672. { read class method }
  673. if try_to_consume(_CLASS) then
  674. begin
  675. { class modifier is only allowed for procedures, functions, }
  676. { constructors, destructors, fields and properties }
  677. if not(token in [_FUNCTION,_PROCEDURE,_PROPERTY,_VAR,_CONSTRUCTOR,_DESTRUCTOR,_OPERATOR]) and
  678. not((token=_ID) and (idtoken=_OPERATOR)) then
  679. Message(parser_e_procedure_or_function_expected);
  680. is_classdef:=true;
  681. end;
  682. end;
  683. _PROCEDURE,
  684. _FUNCTION:
  685. begin
  686. oldparse_only:=parse_only;
  687. parse_only:=true;
  688. pd:=parse_proc_dec(is_classdef,current_structdef);
  689. { this is for error recovery as well as forward }
  690. { interface mappings, i.e. mapping to a method }
  691. { which isn't declared yet }
  692. if assigned(pd) then
  693. begin
  694. parse_record_proc_directives(pd);
  695. { since records have no inheritance don't allow non static
  696. class methods. delphi do so. }
  697. if is_classdef and not (po_staticmethod in pd.procoptions) then
  698. MessagePos(pd.fileinfo, parser_e_class_methods_only_static_in_records);
  699. handle_calling_convention(pd);
  700. { add definition to procsym }
  701. proc_add_definition(pd);
  702. end;
  703. maybe_parse_hint_directives(pd);
  704. parse_only:=oldparse_only;
  705. fields_allowed:=false;
  706. is_classdef:=false;
  707. end;
  708. _CONSTRUCTOR :
  709. begin
  710. if not is_classdef then
  711. Message(parser_e_no_constructor_in_records);
  712. if not is_classdef and (current_structdef.symtable.currentvisibility <> vis_public) then
  713. Message(parser_w_constructor_should_be_public);
  714. { only 1 class constructor is allowed }
  715. if is_classdef and (oo_has_class_constructor in current_structdef.objectoptions) then
  716. Message1(parser_e_only_one_class_constructor_allowed, current_structdef.objrealname^);
  717. oldparse_only:=parse_only;
  718. parse_only:=true;
  719. if is_classdef then
  720. pd:=class_constructor_head
  721. else
  722. pd:=constructor_head;
  723. parse_record_proc_directives(pd);
  724. handle_calling_convention(pd);
  725. { add definition to procsym }
  726. proc_add_definition(pd);
  727. maybe_parse_hint_directives(pd);
  728. parse_only:=oldparse_only;
  729. fields_allowed:=false;
  730. is_classdef:=false;
  731. end;
  732. _DESTRUCTOR :
  733. begin
  734. if not is_classdef then
  735. Message(parser_e_no_destructor_in_records);
  736. { only 1 class destructor is allowed }
  737. if is_classdef and (oo_has_class_destructor in current_structdef.objectoptions) then
  738. Message1(parser_e_only_one_class_destructor_allowed, current_structdef.objrealname^);
  739. oldparse_only:=parse_only;
  740. parse_only:=true;
  741. if is_classdef then
  742. pd:=class_destructor_head
  743. else
  744. pd:=destructor_head;
  745. parse_record_proc_directives(pd);
  746. handle_calling_convention(pd);
  747. { add definition to procsym }
  748. proc_add_definition(pd);
  749. maybe_parse_hint_directives(pd);
  750. parse_only:=oldparse_only;
  751. fields_allowed:=false;
  752. is_classdef:=false;
  753. end;
  754. _END :
  755. begin
  756. consume(_END);
  757. break;
  758. end;
  759. else
  760. consume(_ID); { Give a ident expected message, like tp7 }
  761. end;
  762. until false;
  763. end;
  764. { reads a record declaration }
  765. function record_dec(const n:tidstring;genericdef:tstoreddef;genericlist:TFPObjectList):tdef;
  766. var
  767. old_current_structdef: tabstractrecorddef;
  768. old_current_genericdef,
  769. old_current_specializedef: tstoreddef;
  770. old_parse_generic: boolean;
  771. recst: trecordsymtable;
  772. begin
  773. old_current_structdef:=current_structdef;
  774. old_current_genericdef:=current_genericdef;
  775. old_current_specializedef:=current_specializedef;
  776. old_parse_generic:=parse_generic;
  777. current_genericdef:=nil;
  778. current_specializedef:=nil;
  779. { create recdef }
  780. recst:=trecordsymtable.create(n,current_settings.packrecords);
  781. current_structdef:=trecorddef.create(n,recst);
  782. result:=current_structdef;
  783. { insert in symtablestack }
  784. symtablestack.push(recst);
  785. { parse record }
  786. consume(_RECORD);
  787. { usage of specialized type inside its generic template }
  788. if assigned(genericdef) then
  789. current_specializedef:=current_structdef
  790. { reject declaration of generic class inside generic class }
  791. else if assigned(genericlist) then
  792. current_genericdef:=current_structdef;
  793. insert_generic_parameter_types(genericdef,genericlist);
  794. parse_generic:=(df_generic in current_structdef.defoptions);
  795. if m_advanced_records in current_settings.modeswitches then
  796. parse_record_members
  797. else
  798. begin
  799. read_record_fields([vd_record]);
  800. consume(_END);
  801. end;
  802. { make the record size aligned }
  803. recst.addalignmentpadding;
  804. { restore symtable stack }
  805. symtablestack.pop(recst);
  806. if trecorddef(current_structdef).is_packed and is_managed_type(current_structdef) then
  807. Message(type_e_no_packed_inittable);
  808. { restore old state }
  809. parse_generic:=old_parse_generic;
  810. current_structdef:=old_current_structdef;
  811. current_genericdef:=old_current_genericdef;
  812. current_specializedef:=old_current_specializedef;
  813. end;
  814. { reads a type definition and returns a pointer to it }
  815. procedure read_named_type(var def : tdef;const name : TIDString;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean);
  816. var
  817. pt : tnode;
  818. tt2 : tdef;
  819. aktenumdef : tenumdef;
  820. s : TIDString;
  821. l,v : TConstExprInt;
  822. oldpackrecords : longint;
  823. defpos,storepos : tfileposinfo;
  824. procedure expr_type;
  825. var
  826. pt1,pt2 : tnode;
  827. lv,hv : TConstExprInt;
  828. old_block_type : tblock_type;
  829. dospecialize : boolean;
  830. structdef: tabstractrecorddef;
  831. begin
  832. old_block_type:=block_type;
  833. dospecialize:=false;
  834. { use of current parsed object:
  835. - classes can be used also in classes
  836. - objects can be parameters }
  837. if (token=_ID) then
  838. begin
  839. structdef:=current_structdef;
  840. while assigned(structdef) and (structdef.typ in [objectdef,recorddef]) do
  841. begin
  842. if (structdef.objname^=pattern) then
  843. begin
  844. consume(_ID);
  845. def:=structdef;
  846. exit;
  847. end;
  848. structdef:=tabstractrecorddef(structdef.owner.defowner);
  849. end;
  850. end;
  851. { Generate a specialization? }
  852. if try_to_consume(_SPECIALIZE) then
  853. dospecialize:=true;
  854. { we can't accept a equal in type }
  855. pt1:=comp_expr(false,true);
  856. if not dospecialize and
  857. try_to_consume(_POINTPOINT) then
  858. begin
  859. { get high value of range }
  860. pt2:=comp_expr(false,false);
  861. { make both the same type or give an error. This is not
  862. done when both are integer values, because typecasting
  863. between -3200..3200 will result in a signed-unsigned
  864. conflict and give a range check error (PFV) }
  865. if not(is_integer(pt1.resultdef) and is_integer(pt2.resultdef)) then
  866. inserttypeconv(pt1,pt2.resultdef);
  867. { both must be evaluated to constants now }
  868. if (pt1.nodetype=ordconstn) and
  869. (pt2.nodetype=ordconstn) then
  870. begin
  871. lv:=tordconstnode(pt1).value;
  872. hv:=tordconstnode(pt2).value;
  873. { Check bounds }
  874. if hv<lv then
  875. message(parser_e_upper_lower_than_lower)
  876. else if (lv.signed and (lv.svalue<0)) and (not hv.signed and (hv.uvalue>qword(high(int64)))) then
  877. message(type_e_cant_eval_constant_expr)
  878. else
  879. begin
  880. { All checks passed, create the new def }
  881. case pt1.resultdef.typ of
  882. enumdef :
  883. def:=tenumdef.create_subrange(tenumdef(pt1.resultdef),lv.svalue,hv.svalue);
  884. orddef :
  885. begin
  886. if is_char(pt1.resultdef) then
  887. def:=torddef.create(uchar,lv,hv)
  888. else
  889. if is_boolean(pt1.resultdef) then
  890. def:=torddef.create(pasbool,lv,hv)
  891. else if is_signed(pt1.resultdef) then
  892. def:=torddef.create(range_to_basetype(lv,hv),lv,hv)
  893. else
  894. def:=torddef.create(range_to_basetype(lv,hv),lv,hv);
  895. end;
  896. end;
  897. end;
  898. end
  899. else
  900. Message(sym_e_error_in_type_def);
  901. pt2.free;
  902. end
  903. else
  904. begin
  905. { a simple type renaming or generic specialization }
  906. if (pt1.nodetype=typen) then
  907. begin
  908. def:=ttypenode(pt1).resultdef;
  909. if dospecialize then
  910. generate_specialization(def)
  911. else
  912. begin
  913. if assigned(current_specializedef) and (def=current_specializedef.genericdef) then
  914. begin
  915. def:=current_specializedef
  916. end
  917. else if (def=current_genericdef) then
  918. begin
  919. def:=current_genericdef
  920. end
  921. else if (df_generic in def.defoptions) then
  922. begin
  923. Message(parser_e_no_generics_as_types);
  924. def:=generrordef;
  925. end
  926. else if is_objccategory(def) then
  927. begin
  928. Message(parser_e_no_category_as_types);
  929. def:=generrordef
  930. end
  931. end;
  932. end
  933. else
  934. Message(sym_e_error_in_type_def);
  935. end;
  936. pt1.free;
  937. block_type:=old_block_type;
  938. end;
  939. procedure set_dec;
  940. begin
  941. consume(_SET);
  942. consume(_OF);
  943. read_anon_type(tt2,true);
  944. if assigned(tt2) then
  945. begin
  946. case tt2.typ of
  947. { don't forget that min can be negativ PM }
  948. enumdef :
  949. if (tenumdef(tt2).min>=0) and
  950. (tenumdef(tt2).max<=255) then
  951. // !! def:=tsetdef.create(tt2,tenumdef(tt2.def).min,tenumdef(tt2.def).max))
  952. def:=tsetdef.create(tt2,tenumdef(tt2).min,tenumdef(tt2).max)
  953. else
  954. Message(sym_e_ill_type_decl_set);
  955. orddef :
  956. begin
  957. if (torddef(tt2).ordtype<>uvoid) and
  958. (torddef(tt2).ordtype<>uwidechar) and
  959. (torddef(tt2).low>=0) then
  960. // !! def:=tsetdef.create(tt2,torddef(tt2.def).low,torddef(tt2.def).high))
  961. if Torddef(tt2).high>int64(high(byte)) then
  962. message(sym_e_ill_type_decl_set)
  963. else
  964. def:=tsetdef.create(tt2,torddef(tt2).low.svalue,torddef(tt2).high.svalue)
  965. else
  966. Message(sym_e_ill_type_decl_set);
  967. end;
  968. else
  969. Message(sym_e_ill_type_decl_set);
  970. end;
  971. end
  972. else
  973. def:=generrordef;
  974. end;
  975. procedure array_dec(is_packed:boolean;genericdef:tstoreddef;genericlist:TFPObjectList);
  976. var
  977. lowval,
  978. highval : TConstExprInt;
  979. indexdef : tdef;
  980. hdef : tdef;
  981. arrdef : tarraydef;
  982. procedure setdefdecl(def:tdef);
  983. begin
  984. case def.typ of
  985. enumdef :
  986. begin
  987. lowval:=tenumdef(def).min;
  988. highval:=tenumdef(def).max;
  989. if (m_fpc in current_settings.modeswitches) and
  990. (tenumdef(def).has_jumps) then
  991. Message(type_e_array_index_enums_with_assign_not_possible);
  992. indexdef:=def;
  993. end;
  994. orddef :
  995. begin
  996. if torddef(def).ordtype in [uchar,
  997. u8bit,u16bit,
  998. s8bit,s16bit,s32bit,
  999. {$ifdef cpu64bitaddr}
  1000. u32bit,s64bit,
  1001. {$endif cpu64bitaddr}
  1002. pasbool,bool8bit,bool16bit,bool32bit,bool64bit,
  1003. uwidechar] then
  1004. begin
  1005. lowval:=torddef(def).low;
  1006. highval:=torddef(def).high;
  1007. indexdef:=def;
  1008. end
  1009. else
  1010. Message1(parser_e_type_cant_be_used_in_array_index,def.typename);
  1011. end;
  1012. else
  1013. Message(sym_e_error_in_type_def);
  1014. end;
  1015. end;
  1016. begin
  1017. arrdef:=nil;
  1018. consume(_ARRAY);
  1019. { open array? }
  1020. if try_to_consume(_LECKKLAMMER) then
  1021. begin
  1022. { defaults }
  1023. indexdef:=generrordef;
  1024. { use defaults which don't overflow the compiler }
  1025. lowval:=0;
  1026. highval:=0;
  1027. repeat
  1028. { read the expression and check it, check apart if the
  1029. declaration is an enum declaration because that needs to
  1030. be parsed by readtype (PFV) }
  1031. if token=_LKLAMMER then
  1032. begin
  1033. read_anon_type(hdef,true);
  1034. setdefdecl(hdef);
  1035. end
  1036. else
  1037. begin
  1038. pt:=expr(true);
  1039. if pt.nodetype=typen then
  1040. setdefdecl(pt.resultdef)
  1041. else
  1042. begin
  1043. if (pt.nodetype=rangen) then
  1044. begin
  1045. if (trangenode(pt).left.nodetype=ordconstn) and
  1046. (trangenode(pt).right.nodetype=ordconstn) then
  1047. begin
  1048. { make both the same type or give an error. This is not
  1049. done when both are integer values, because typecasting
  1050. between -3200..3200 will result in a signed-unsigned
  1051. conflict and give a range check error (PFV) }
  1052. if not(is_integer(trangenode(pt).left.resultdef) and is_integer(trangenode(pt).left.resultdef)) then
  1053. inserttypeconv(trangenode(pt).left,trangenode(pt).right.resultdef);
  1054. lowval:=tordconstnode(trangenode(pt).left).value;
  1055. highval:=tordconstnode(trangenode(pt).right).value;
  1056. if highval<lowval then
  1057. begin
  1058. Message(parser_e_array_lower_less_than_upper_bound);
  1059. highval:=lowval;
  1060. end
  1061. else if (lowval<int64(low(aint))) or
  1062. (highval > high(aint)) then
  1063. begin
  1064. Message(parser_e_array_range_out_of_bounds);
  1065. lowval :=0;
  1066. highval:=0;
  1067. end;
  1068. if is_integer(trangenode(pt).left.resultdef) then
  1069. range_to_type(lowval,highval,indexdef)
  1070. else
  1071. indexdef:=trangenode(pt).left.resultdef;
  1072. end
  1073. else
  1074. Message(type_e_cant_eval_constant_expr);
  1075. end
  1076. else
  1077. Message(sym_e_error_in_type_def)
  1078. end;
  1079. pt.free;
  1080. end;
  1081. { if the array is already created add the new arrray
  1082. as element of the existing array, otherwise create a new array }
  1083. if assigned(arrdef) then
  1084. begin
  1085. arrdef.elementdef:=tarraydef.create(lowval.svalue,highval.svalue,indexdef);
  1086. arrdef:=tarraydef(arrdef.elementdef);
  1087. end
  1088. else
  1089. begin
  1090. arrdef:=tarraydef.create(lowval.svalue,highval.svalue,indexdef);
  1091. def:=arrdef;
  1092. end;
  1093. if is_packed then
  1094. include(arrdef.arrayoptions,ado_IsBitPacked);
  1095. if token=_COMMA then
  1096. consume(_COMMA)
  1097. else
  1098. break;
  1099. until false;
  1100. consume(_RECKKLAMMER);
  1101. end
  1102. else
  1103. begin
  1104. if is_packed then
  1105. Message(parser_e_packed_dynamic_open_array);
  1106. arrdef:=tarraydef.create(0,-1,s32inttype);
  1107. include(arrdef.arrayoptions,ado_IsDynamicArray);
  1108. def:=arrdef;
  1109. end;
  1110. consume(_OF);
  1111. read_anon_type(tt2,true);
  1112. { set element type of the last array definition }
  1113. if assigned(arrdef) then
  1114. begin
  1115. arrdef.elementdef:=tt2;
  1116. if is_packed and
  1117. is_managed_type(tt2) then
  1118. Message(type_e_no_packed_inittable);
  1119. end;
  1120. end;
  1121. var
  1122. p : tnode;
  1123. hdef : tdef;
  1124. pd : tabstractprocdef;
  1125. is_func,
  1126. enumdupmsg, first : boolean;
  1127. newtype : ttypesym;
  1128. oldlocalswitches : tlocalswitches;
  1129. bitpacking: boolean;
  1130. begin
  1131. def:=nil;
  1132. case token of
  1133. _STRING,_FILE:
  1134. begin
  1135. single_type(def,false,true);
  1136. end;
  1137. _LKLAMMER:
  1138. begin
  1139. consume(_LKLAMMER);
  1140. first := true;
  1141. { allow negativ value_str }
  1142. l:=int64(-1);
  1143. enumdupmsg:=false;
  1144. aktenumdef:=tenumdef.create;
  1145. repeat
  1146. s:=orgpattern;
  1147. defpos:=current_tokenpos;
  1148. consume(_ID);
  1149. { only allow assigning of specific numbers under fpc mode }
  1150. if not(m_tp7 in current_settings.modeswitches) and
  1151. (
  1152. { in fpc mode also allow := to be compatible
  1153. with previous 1.0.x versions }
  1154. ((m_fpc in current_settings.modeswitches) and
  1155. try_to_consume(_ASSIGNMENT)) or
  1156. try_to_consume(_EQ)
  1157. ) then
  1158. begin
  1159. oldlocalswitches:=current_settings.localswitches;
  1160. include(current_settings.localswitches,cs_allow_enum_calc);
  1161. p:=comp_expr(true,false);
  1162. current_settings.localswitches:=oldlocalswitches;
  1163. if (p.nodetype=ordconstn) then
  1164. begin
  1165. { we expect an integer or an enum of the
  1166. same type }
  1167. if is_integer(p.resultdef) or
  1168. is_char(p.resultdef) or
  1169. equal_defs(p.resultdef,aktenumdef) then
  1170. v:=tordconstnode(p).value
  1171. else
  1172. IncompatibleTypes(p.resultdef,s32inttype);
  1173. end
  1174. else
  1175. Message(parser_e_illegal_expression);
  1176. p.free;
  1177. { please leave that a note, allows type save }
  1178. { declarations in the win32 units ! }
  1179. if (not first) and (v<=l) and (not enumdupmsg) then
  1180. begin
  1181. Message(parser_n_duplicate_enum);
  1182. enumdupmsg:=true;
  1183. end;
  1184. l:=v;
  1185. end
  1186. else
  1187. inc(l.svalue);
  1188. first := false;
  1189. storepos:=current_tokenpos;
  1190. current_tokenpos:=defpos;
  1191. tenumsymtable(aktenumdef.symtable).insert(tenumsym.create(s,aktenumdef,longint(l.svalue)));
  1192. if not (cs_scopedenums in current_settings.localswitches) then
  1193. tstoredsymtable(aktenumdef.owner).insert(tenumsym.create(s,aktenumdef,longint(l.svalue)));
  1194. current_tokenpos:=storepos;
  1195. until not try_to_consume(_COMMA);
  1196. def:=aktenumdef;
  1197. consume(_RKLAMMER);
  1198. end;
  1199. _ARRAY:
  1200. begin
  1201. array_dec(false,genericdef,genericlist);
  1202. end;
  1203. _SET:
  1204. begin
  1205. set_dec;
  1206. end;
  1207. _CARET:
  1208. begin
  1209. consume(_CARET);
  1210. single_type(tt2,(block_type=bt_type),false);
  1211. def:=tpointerdef.create(tt2);
  1212. if tt2.typ=forwarddef then
  1213. current_module.checkforwarddefs.add(def);
  1214. end;
  1215. _RECORD:
  1216. begin
  1217. def:=record_dec(name,genericdef,genericlist);
  1218. end;
  1219. _PACKED,
  1220. _BITPACKED:
  1221. begin
  1222. bitpacking :=
  1223. (cs_bitpacking in current_settings.localswitches) or
  1224. (token = _BITPACKED);
  1225. consume(token);
  1226. if token=_ARRAY then
  1227. array_dec(bitpacking,genericdef,genericlist)
  1228. else if token=_SET then
  1229. set_dec
  1230. else if token=_FILE then
  1231. single_type(def,false,true)
  1232. else
  1233. begin
  1234. oldpackrecords:=current_settings.packrecords;
  1235. if (not bitpacking) or
  1236. (token in [_CLASS,_OBJECT]) then
  1237. current_settings.packrecords:=1
  1238. else
  1239. current_settings.packrecords:=bit_alignment;
  1240. case token of
  1241. _CLASS :
  1242. begin
  1243. consume(_CLASS);
  1244. def:=object_dec(odt_class,name,genericdef,genericlist,nil);
  1245. end;
  1246. _OBJECT :
  1247. begin
  1248. consume(_OBJECT);
  1249. def:=object_dec(odt_object,name,genericdef,genericlist,nil);
  1250. end;
  1251. else
  1252. def:=record_dec(name,genericdef,genericlist);
  1253. end;
  1254. current_settings.packrecords:=oldpackrecords;
  1255. end;
  1256. end;
  1257. _DISPINTERFACE :
  1258. begin
  1259. { need extra check here since interface is a keyword
  1260. in all pascal modes }
  1261. if not(m_class in current_settings.modeswitches) then
  1262. Message(parser_f_need_objfpc_or_delphi_mode);
  1263. consume(token);
  1264. def:=object_dec(odt_dispinterface,name,genericdef,genericlist,nil);
  1265. end;
  1266. _CLASS :
  1267. begin
  1268. consume(token);
  1269. { Delphi only allows class of in type blocks }
  1270. if (token=_OF) and
  1271. (
  1272. not(m_delphi in current_settings.modeswitches) or
  1273. (block_type=bt_type)
  1274. ) then
  1275. begin
  1276. consume(_OF);
  1277. single_type(hdef,(block_type=bt_type),false);
  1278. if is_class(hdef) or
  1279. is_objcclass(hdef) then
  1280. def:=tclassrefdef.create(hdef)
  1281. else
  1282. if hdef.typ=forwarddef then
  1283. begin
  1284. def:=tclassrefdef.create(hdef);
  1285. current_module.checkforwarddefs.add(def);
  1286. end
  1287. else
  1288. Message1(type_e_class_or_objcclass_type_expected,hdef.typename);
  1289. end
  1290. else
  1291. def:=object_dec(odt_class,name,genericdef,genericlist,nil);
  1292. end;
  1293. _CPPCLASS :
  1294. begin
  1295. consume(token);
  1296. def:=object_dec(odt_cppclass,name,genericdef,genericlist,nil);
  1297. end;
  1298. _OBJCCLASS :
  1299. begin
  1300. if not(m_objectivec1 in current_settings.modeswitches) then
  1301. Message(parser_f_need_objc);
  1302. consume(token);
  1303. def:=object_dec(odt_objcclass,name,genericdef,genericlist,nil);
  1304. end;
  1305. _INTERFACE :
  1306. begin
  1307. { need extra check here since interface is a keyword
  1308. in all pascal modes }
  1309. if not(m_class in current_settings.modeswitches) then
  1310. Message(parser_f_need_objfpc_or_delphi_mode);
  1311. consume(token);
  1312. if current_settings.interfacetype=it_interfacecom then
  1313. def:=object_dec(odt_interfacecom,name,genericdef,genericlist,nil)
  1314. else {it_interfacecorba}
  1315. def:=object_dec(odt_interfacecorba,name,genericdef,genericlist,nil);
  1316. end;
  1317. _OBJCPROTOCOL :
  1318. begin
  1319. if not(m_objectivec1 in current_settings.modeswitches) then
  1320. Message(parser_f_need_objc);
  1321. consume(token);
  1322. def:=object_dec(odt_objcprotocol,name,genericdef,genericlist,nil);
  1323. end;
  1324. _OBJCCATEGORY :
  1325. begin
  1326. if not(m_objectivec1 in current_settings.modeswitches) then
  1327. Message(parser_f_need_objc);
  1328. consume(token);
  1329. def:=object_dec(odt_objccategory,name,genericdef,genericlist,nil);
  1330. end;
  1331. _OBJECT :
  1332. begin
  1333. consume(token);
  1334. def:=object_dec(odt_object,name,genericdef,genericlist,nil);
  1335. end;
  1336. _PROCEDURE,
  1337. _FUNCTION:
  1338. begin
  1339. is_func:=(token=_FUNCTION);
  1340. consume(token);
  1341. pd:=tprocvardef.create(normal_function_level);
  1342. if token=_LKLAMMER then
  1343. parse_parameter_dec(pd);
  1344. if is_func then
  1345. begin
  1346. consume(_COLON);
  1347. single_type(pd.returndef,false,false);
  1348. end;
  1349. if try_to_consume(_OF) then
  1350. begin
  1351. consume(_OBJECT);
  1352. include(pd.procoptions,po_methodpointer);
  1353. end
  1354. else if (m_nested_procvars in current_settings.modeswitches) and
  1355. try_to_consume(_IS) then
  1356. begin
  1357. consume(_NESTED);
  1358. pd.parast.symtablelevel:=normal_function_level+1;
  1359. pd.check_mark_as_nested;
  1360. end;
  1361. def:=pd;
  1362. { possible proc directives }
  1363. if parseprocvardir then
  1364. begin
  1365. if check_proc_directive(true) then
  1366. begin
  1367. newtype:=ttypesym.create('unnamed',def);
  1368. parse_var_proc_directives(tsym(newtype));
  1369. newtype.typedef:=nil;
  1370. def.typesym:=nil;
  1371. newtype.free;
  1372. end;
  1373. { Add implicit hidden parameters and function result }
  1374. handle_calling_convention(pd);
  1375. end;
  1376. end;
  1377. else
  1378. if (token=_KLAMMERAFFE) and (m_iso in current_settings.modeswitches) then
  1379. begin
  1380. consume(_KLAMMERAFFE);
  1381. single_type(tt2,(block_type=bt_type),false);
  1382. def:=tpointerdef.create(tt2);
  1383. if tt2.typ=forwarddef then
  1384. current_module.checkforwarddefs.add(def);
  1385. end
  1386. else
  1387. expr_type;
  1388. end;
  1389. if def=nil then
  1390. def:=generrordef;
  1391. end;
  1392. procedure read_anon_type(var def : tdef;parseprocvardir:boolean);
  1393. begin
  1394. read_named_type(def,'',nil,nil,parseprocvardir);
  1395. end;
  1396. procedure write_persistent_type_info(st:tsymtable);
  1397. var
  1398. i : longint;
  1399. def : tdef;
  1400. vmtwriter : TVMTWriter;
  1401. begin
  1402. for i:=0 to st.DefList.Count-1 do
  1403. begin
  1404. def:=tdef(st.DefList[i]);
  1405. case def.typ of
  1406. recorddef :
  1407. write_persistent_type_info(trecorddef(def).symtable);
  1408. objectdef :
  1409. begin
  1410. { Skip generics and forward defs }
  1411. if (df_generic in def.defoptions) or
  1412. (oo_is_forward in tobjectdef(def).objectoptions) then
  1413. continue;
  1414. write_persistent_type_info(tobjectdef(def).symtable);
  1415. { Write also VMT if not done yet }
  1416. if not(ds_vmt_written in def.defstates) then
  1417. begin
  1418. vmtwriter:=TVMTWriter.create(tobjectdef(def));
  1419. if is_interface(tobjectdef(def)) then
  1420. vmtwriter.writeinterfaceids;
  1421. if (oo_has_vmt in tobjectdef(def).objectoptions) then
  1422. vmtwriter.writevmt;
  1423. vmtwriter.free;
  1424. include(def.defstates,ds_vmt_written);
  1425. end;
  1426. end;
  1427. procdef :
  1428. begin
  1429. if assigned(tprocdef(def).localst) and
  1430. (tprocdef(def).localst.symtabletype=localsymtable) then
  1431. write_persistent_type_info(tprocdef(def).localst);
  1432. if assigned(tprocdef(def).parast) then
  1433. write_persistent_type_info(tprocdef(def).parast);
  1434. end;
  1435. end;
  1436. { generate always persistent tables for types in the interface so it can
  1437. be reused in other units and give always the same pointer location. }
  1438. { Init }
  1439. if (
  1440. assigned(def.typesym) and
  1441. (st.symtabletype=globalsymtable) and
  1442. not is_objc_class_or_protocol(def)
  1443. ) or
  1444. is_managed_type(def) or
  1445. (ds_init_table_used in def.defstates) then
  1446. RTTIWriter.write_rtti(def,initrtti);
  1447. { RTTI }
  1448. if (
  1449. assigned(def.typesym) and
  1450. (st.symtabletype=globalsymtable) and
  1451. not is_objc_class_or_protocol(def)
  1452. ) or
  1453. (ds_rtti_table_used in def.defstates) then
  1454. RTTIWriter.write_rtti(def,fullrtti);
  1455. end;
  1456. end;
  1457. end.