ptype.pas 66 KB

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