ptype.pas 65 KB

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