ptype.pas 67 KB

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