pastree.pp 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502
  1. {
  2. This file is part of the Free Component Library
  3. Pascal parse tree classes
  4. Copyright (c) 2000-2005 by
  5. Areca Systems GmbH / Sebastian Guenther, [email protected]
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  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.
  11. **********************************************************************}
  12. unit PasTree;
  13. interface
  14. uses Classes;
  15. resourcestring
  16. // Parse tree node type names
  17. SPasTreeElement = 'generic element';
  18. SPasTreeSection = 'unit section';
  19. SPasTreeModule = 'module';
  20. SPasTreePackage = 'package';
  21. SPasTreeResString = 'resource string';
  22. SPasTreeType = 'generic type';
  23. SPasTreePointerType = 'pointer type';
  24. SPasTreeAliasType = 'alias type';
  25. SPasTreeTypeAliasType = '"type" alias type';
  26. SPasTreeClassOfType = '"class of" type';
  27. SPasTreeRangeType = 'range type';
  28. SPasTreeArrayType = 'array type';
  29. SPasTreeFileType = 'file type';
  30. SPasTreeEnumValue = 'enumeration value';
  31. SPasTreeEnumType = 'enumeration type';
  32. SPasTreeSetType = 'set type';
  33. SPasTreeRecordType = 'record type';
  34. SPasTreeObjectType = 'object';
  35. SPasTreeClassType = 'class';
  36. SPasTreeInterfaceType = 'interface';
  37. SPasTreeArgument = 'argument';
  38. SPasTreeProcedureType = 'procedure type';
  39. SPasTreeResultElement = 'function result';
  40. SPasTreeFunctionType = 'function type';
  41. SPasTreeUnresolvedTypeRef = 'unresolved type reference';
  42. SPasTreeVariable = 'variable';
  43. SPasTreeConst = 'constant';
  44. SPasTreeProperty = 'property';
  45. SPasTreeOverloadedProcedure = 'overloaded procedure';
  46. SPasTreeProcedure = 'procedure';
  47. SPasTreeFunction = 'function';
  48. SPasTreeConstructor = 'constructor';
  49. SPasTreeDestructor = 'destructor';
  50. SPasTreeProcedureImpl = 'procedure/function implementation';
  51. SPasTreeConstructorImpl = 'constructor implementation';
  52. SPasTreeDestructorImpl = 'destructor implementation';
  53. type
  54. TPasModule = class;
  55. TPasMemberVisibility = (visDefault, visPrivate, visProtected, visPublic,
  56. visPublished, visAutomated);
  57. TPasMemberVisibilities = set of TPasMemberVisibility;
  58. TPTreeElement = class of TPasElement;
  59. TPasElement = class
  60. private
  61. FRefCount: LongWord;
  62. FName: string;
  63. FParent: TPasElement;
  64. public
  65. SourceFilename: string;
  66. SourceLinenumber: Integer;
  67. constructor Create(const AName: string; AParent: TPasElement); virtual;
  68. procedure AddRef;
  69. procedure Release;
  70. function FullName: string; // Name including parent's names
  71. function PathName: string; // = Module.Name + FullName
  72. function GetModule: TPasModule;
  73. function ElementTypeName: string; virtual;
  74. function GetDeclaration(full : Boolean) : string; virtual;
  75. Visibility: TPasMemberVisibility;
  76. property RefCount: LongWord read FRefCount;
  77. property Name: string read FName write FName;
  78. property Parent: TPasElement read FParent;
  79. end;
  80. TPasSection = class(TPasElement)
  81. public
  82. constructor Create(const AName: string; AParent: TPasElement); override;
  83. destructor Destroy; override;
  84. function ElementTypeName: string; override;
  85. procedure AddUnitToUsesList(const AUnitName: string);
  86. UsesList: TList; // TPasUnresolvedTypeRef or TPasModule elements
  87. Declarations, ResStrings, Types, Consts, Classes,
  88. Functions, Variables: TList;
  89. end;
  90. TPasModule = class(TPasElement)
  91. public
  92. destructor Destroy; override;
  93. function ElementTypeName: string; override;
  94. function GetDeclaration(full : boolean) : string; override;
  95. InterfaceSection, ImplementationSection: TPasSection;
  96. PackageName: string;
  97. end;
  98. TPasPackage = class(TPasElement)
  99. public
  100. constructor Create(const AName: string; AParent: TPasElement); override;
  101. destructor Destroy; override;
  102. function ElementTypeName: string; override;
  103. Modules: TList; // List of TPasModule objects
  104. end;
  105. TPasResString = class(TPasElement)
  106. public
  107. function ElementTypeName: string; override;
  108. function GetDeclaration(full : Boolean) : string; Override;
  109. Value: string;
  110. end;
  111. TPasType = class(TPasElement)
  112. public
  113. function ElementTypeName: string; override;
  114. end;
  115. TPasPointerType = class(TPasType)
  116. public
  117. destructor Destroy; override;
  118. function ElementTypeName: string; override;
  119. function GetDeclaration(full : Boolean): string; override;
  120. DestType: TPasType;
  121. end;
  122. TPasAliasType = class(TPasType)
  123. public
  124. destructor Destroy; override;
  125. function ElementTypeName: string; override;
  126. function GetDeclaration(full : Boolean): string; override;
  127. DestType: TPasType;
  128. end;
  129. TPasTypeAliasType = class(TPasAliasType)
  130. public
  131. function ElementTypeName: string; override;
  132. end;
  133. TPasClassOfType = class(TPasAliasType)
  134. public
  135. function ElementTypeName: string; override;
  136. function GetDeclaration(full: boolean) : string; override;
  137. end;
  138. TPasRangeType = class(TPasType)
  139. public
  140. function ElementTypeName: string; override;
  141. function GetDeclaration(full : boolean) : string; override;
  142. RangeStart, RangeEnd: string;
  143. end;
  144. TPasArrayType = class(TPasType)
  145. public
  146. destructor Destroy; override;
  147. function ElementTypeName: string; override;
  148. function GetDeclaration(full : boolean) : string; override;
  149. IndexRange : string;
  150. IsPacked : Boolean; // 12/04/04 - Dave - Added
  151. ElType: TPasType;
  152. end;
  153. TPasFileType = class(TPasType)
  154. public
  155. destructor Destroy; override;
  156. function ElementTypeName: string; override;
  157. function GetDeclaration(full : boolean) : string; override;
  158. ElType: TPasType;
  159. end;
  160. TPasEnumValue = class(TPasElement)
  161. public
  162. function ElementTypeName: string; override;
  163. IsValueUsed: Boolean;
  164. Value: Integer;
  165. AssignedValue : string;
  166. end;
  167. TPasEnumType = class(TPasType)
  168. public
  169. constructor Create(const AName: string; AParent: TPasElement); override;
  170. destructor Destroy; override;
  171. function ElementTypeName: string; override;
  172. function GetDeclaration(full : boolean) : string; override;
  173. Procedure GetEnumNames(Names : TStrings);
  174. Values: TList; // List of TPasEnumValue objects
  175. end;
  176. TPasSetType = class(TPasType)
  177. public
  178. destructor Destroy; override;
  179. function ElementTypeName: string; override;
  180. function GetDeclaration(full : boolean) : string; override;
  181. EnumType: TPasType;
  182. end;
  183. TPasRecordType = class;
  184. TPasVariant = class(TPasElement)
  185. public
  186. constructor Create(const AName: string; AParent: TPasElement); override;
  187. destructor Destroy; override;
  188. Values: TStringList;
  189. Members: TPasRecordType;
  190. end;
  191. TPasRecordType = class(TPasType)
  192. public
  193. constructor Create(const AName: string; AParent: TPasElement); override;
  194. destructor Destroy; override;
  195. function ElementTypeName: string; override;
  196. function GetDeclaration(full : boolean) : string; override;
  197. IsPacked: Boolean;
  198. Members: TList; // array of TPasVariable elements
  199. VariantName: string;
  200. VariantType: TPasType;
  201. Variants: TList; // array of TPasVariant elements, may be nil!
  202. end;
  203. TPasObjKind = (okObject, okClass, okInterface);
  204. TPasClassType = class(TPasType)
  205. public
  206. constructor Create(const AName: string; AParent: TPasElement); override;
  207. destructor Destroy; override;
  208. function ElementTypeName: string; override;
  209. ObjKind: TPasObjKind;
  210. AncestorType: TPasType; // TPasClassType or TPasUnresolvedTypeRef
  211. IsPacked: Boolean; // 12/04/04 - Dave - Added
  212. Members: TList; // array of TPasElement objects
  213. end;
  214. TArgumentAccess = (argDefault, argConst, argVar, argOut);
  215. TPasArgument = class(TPasElement)
  216. public
  217. destructor Destroy; override;
  218. function ElementTypeName: string; override;
  219. function GetDeclaration(full : boolean) : string; override;
  220. Access: TArgumentAccess;
  221. ArgType: TPasType;
  222. Value: string;
  223. end;
  224. TPasProcedureType = class(TPasType)
  225. public
  226. constructor Create(const AName: string; AParent: TPasElement); override;
  227. destructor Destroy; override;
  228. class function TypeName: string; virtual;
  229. function ElementTypeName: string; override;
  230. IsOfObject: Boolean;
  231. function GetDeclaration(full : boolean) : string; override;
  232. procedure GetArguments(List : TStrings);
  233. function CreateArgument(const AName, AUnresolvedTypeName: string):
  234. TPasArgument;
  235. Args: TList; // List of TPasArgument objects
  236. end;
  237. TPasResultElement = class(TPasElement)
  238. public
  239. destructor Destroy; override;
  240. function ElementTypeName : string; override;
  241. ResultType: TPasType;
  242. end;
  243. TPasFunctionType = class(TPasProcedureType)
  244. public
  245. destructor Destroy; override;
  246. class function TypeName: string; override;
  247. function ElementTypeName: string; override;
  248. function GetDeclaration(Full : boolean) : string; override;
  249. ResultEl: TPasResultElement;
  250. end;
  251. TPasUnresolvedTypeRef = class(TPasType)
  252. public
  253. // Typerefs cannot be parented! -> AParent _must_ be NIL
  254. constructor Create(const AName: string; AParent: TPasElement); override;
  255. function ElementTypeName: string; override;
  256. end;
  257. TPasTypeRef = class(TPasUnresolvedTypeRef)
  258. public
  259. // function GetDeclaration(full : Boolean): string; override;
  260. RefType: TPasType;
  261. end;
  262. TPasVariable = class(TPasElement)
  263. public
  264. destructor Destroy; override;
  265. function ElementTypeName: string; override;
  266. function GetDeclaration(full : boolean) : string; override;
  267. VarType: TPasType;
  268. Value: string;
  269. Modifiers : string;
  270. AbsoluteLocation : String;
  271. end;
  272. TPasConst = class(TPasVariable)
  273. public
  274. function ElementTypeName: string; override;
  275. end;
  276. TPasProperty = class(TPasVariable)
  277. public
  278. constructor Create(const AName: string; AParent: TPasElement); override;
  279. destructor Destroy; override;
  280. function ElementTypeName: string; override;
  281. function GetDeclaration(full : boolean) : string; override;
  282. Args: TList; // List of TPasArgument objects
  283. IndexValue, ReadAccessorName, WriteAccessorName,
  284. StoredAccessorName, DefaultValue: string;
  285. IsDefault, IsNodefault: Boolean;
  286. end;
  287. TPasProcedureBase = class(TPasElement)
  288. public
  289. function TypeName: string; virtual; abstract;
  290. end;
  291. TPasOverloadedProc = class(TPasProcedureBase)
  292. public
  293. constructor Create(const AName: string; AParent: TPasElement); override;
  294. destructor Destroy; override;
  295. function ElementTypeName: string; override;
  296. function TypeName: string; override;
  297. Overloads: TList; // List of TPasProcedure nodes
  298. end;
  299. TPasProcedure = class(TPasProcedureBase)
  300. public
  301. destructor Destroy; override;
  302. function ElementTypeName: string; override;
  303. function TypeName: string; override;
  304. ProcType: TPasProcedureType;
  305. function GetDeclaration(full: Boolean): string; override;
  306. procedure GetModifiers(List: TStrings);
  307. IsVirtual, IsDynamic, IsAbstract, IsOverride,
  308. IsOverload, IsMessage, isReintroduced, isStatic: Boolean;
  309. end;
  310. TPasFunction = class(TPasProcedure)
  311. public
  312. function ElementTypeName: string; override;
  313. function GetDeclaration (full : boolean) : string; override;
  314. end;
  315. TPasOperator = class(TPasProcedure)
  316. public
  317. function ElementTypeName: string; override;
  318. function GetDeclaration (full : boolean) : string; override;
  319. end;
  320. TPasConstructor = class(TPasProcedure)
  321. public
  322. function ElementTypeName: string; override;
  323. function TypeName: string; override;
  324. end;
  325. TPasDestructor = class(TPasProcedure)
  326. public
  327. function ElementTypeName: string; override;
  328. function TypeName: string; override;
  329. end;
  330. TPasImplBlock = class;
  331. TPasProcedureImpl = class(TPasElement)
  332. public
  333. constructor Create(const AName: string; AParent: TPasElement); override;
  334. destructor Destroy; override;
  335. function ElementTypeName: string; override;
  336. function TypeName: string; virtual;
  337. ProcType: TPasProcedureType;
  338. Locals: TList;
  339. Body: TPasImplBlock;
  340. end;
  341. TPasConstructorImpl = class(TPasProcedureImpl)
  342. public
  343. function ElementTypeName: string; override;
  344. function TypeName: string; override;
  345. end;
  346. TPasDestructorImpl = class(TPasProcedureImpl)
  347. public
  348. function ElementTypeName: string; override;
  349. function TypeName: string; override;
  350. end;
  351. TPasImplElement = class(TPasElement)
  352. end;
  353. TPasImplCommand = class(TPasImplElement)
  354. public
  355. Command: string;
  356. end;
  357. TPasImplCommands = class(TPasImplElement)
  358. public
  359. constructor Create(const AName: string; AParent: TPasElement); override;
  360. destructor Destroy; override;
  361. Commands: TStrings;
  362. end;
  363. TPasImplIfElse = class(TPasImplElement)
  364. public
  365. destructor Destroy; override;
  366. Condition: string;
  367. IfBranch, ElseBranch: TPasImplElement;
  368. end;
  369. TPasImplForLoop = class(TPasImplElement)
  370. public
  371. destructor Destroy; override;
  372. Variable: TPasVariable;
  373. StartValue, EndValue: string;
  374. Body: TPasImplElement;
  375. end;
  376. TPasImplBlock = class(TPasImplElement)
  377. public
  378. constructor Create(const AName: string; AParent: TPasElement); override;
  379. destructor Destroy; override;
  380. function AddCommand(const ACommand: string): TPasImplCommand;
  381. function AddCommands: TPasImplCommands;
  382. function AddIfElse(const ACondition: string): TPasImplIfElse;
  383. function AddForLoop(AVar: TPasVariable;
  384. const AStartValue, AEndValue: string): TPasImplForLoop;
  385. Elements: TList; // TPasImplElement objects
  386. end;
  387. const
  388. AccessNames: array[TArgumentAccess] of string[6] = ('', 'const ', 'var ', 'out ');
  389. AllVisibilities: TPasMemberVisibilities =
  390. [visDefault, visPrivate, visProtected, visPublic,
  391. visPublished, visAutomated];
  392. VisibilityNames: array[TPasMemberVisibility] of string = (
  393. 'default', 'private', 'protected', 'public', 'published', 'automated');
  394. ObjKindNames: array[TPasObjKind] of string = (
  395. 'object', 'class', 'interface');
  396. implementation
  397. uses SysUtils;
  398. { Parse tree element type name functions }
  399. function TPasElement.ElementTypeName: string; begin Result := SPasTreeElement end;
  400. function TPasSection.ElementTypeName: string; begin Result := SPasTreeSection end;
  401. function TPasModule.ElementTypeName: string; begin Result := SPasTreeModule end;
  402. function TPasPackage.ElementTypeName: string; begin Result := SPasTreePackage end;
  403. function TPasResString.ElementTypeName: string; begin Result := SPasTreeResString end;
  404. function TPasType.ElementTypeName: string; begin Result := SPasTreeType end;
  405. function TPasPointerType.ElementTypeName: string; begin Result := SPasTreePointerType end;
  406. function TPasAliasType.ElementTypeName: string; begin Result := SPasTreeAliasType end;
  407. function TPasTypeAliasType.ElementTypeName: string; begin Result := SPasTreeTypeAliasType end;
  408. function TPasClassOfType.ElementTypeName: string; begin Result := SPasTreeClassOfType end;
  409. function TPasRangeType.ElementTypeName: string; begin Result := SPasTreeRangeType end;
  410. function TPasArrayType.ElementTypeName: string; begin Result := SPasTreeArrayType end;
  411. function TPasFileType.ElementTypeName: string; begin Result := SPasTreeFileType end;
  412. function TPasEnumValue.ElementTypeName: string; begin Result := SPasTreeEnumValue end;
  413. function TPasEnumType.ElementTypeName: string; begin Result := SPasTreeEnumType end;
  414. function TPasSetType.ElementTypeName: string; begin Result := SPasTreeSetType end;
  415. function TPasRecordType.ElementTypeName: string; begin Result := SPasTreeRecordType end;
  416. function TPasArgument.ElementTypeName: string; begin Result := SPasTreeArgument end;
  417. function TPasProcedureType.ElementTypeName: string; begin Result := SPasTreeProcedureType end;
  418. function TPasResultElement.ElementTypeName: string; begin Result := SPasTreeResultElement end;
  419. function TPasFunctionType.ElementTypeName: string; begin Result := SPasTreeFunctionType end;
  420. function TPasUnresolvedTypeRef.ElementTypeName: string; begin Result := SPasTreeUnresolvedTypeRef end;
  421. function TPasVariable.ElementTypeName: string; begin Result := SPasTreeVariable end;
  422. function TPasConst.ElementTypeName: string; begin Result := SPasTreeConst end;
  423. function TPasProperty.ElementTypeName: string; begin Result := SPasTreeProperty end;
  424. function TPasOverloadedProc.ElementTypeName: string; begin Result := SPasTreeOverloadedProcedure end;
  425. function TPasProcedure.ElementTypeName: string; begin Result := SPasTreeProcedure end;
  426. function TPasFunction.ElementTypeName: string; begin Result := SPasTreeFunction end;
  427. function TPasOperator.ElementTypeName: string; begin Result := SPasTreeFunction end;
  428. function TPasConstructor.ElementTypeName: string; begin Result := SPasTreeConstructor end;
  429. function TPasDestructor.ElementTypeName: string; begin Result := SPasTreeDestructor end;
  430. function TPasProcedureImpl.ElementTypeName: string; begin Result := SPasTreeProcedureImpl end;
  431. function TPasConstructorImpl.ElementTypeName: string; begin Result := SPasTreeConstructorImpl end;
  432. function TPasDestructorImpl.ElementTypeName: string; begin Result := SPasTreeDestructorImpl end;
  433. function TPasClassType.ElementTypeName: string;
  434. begin
  435. case ObjKind of
  436. okObject: Result := SPasTreeObjectType;
  437. okClass: Result := SPasTreeClassType;
  438. okInterface: Result := SPasTreeInterfaceType;
  439. end;
  440. end;
  441. { All other stuff: }
  442. constructor TPasElement.Create(const AName: string; AParent: TPasElement);
  443. begin
  444. inherited Create;
  445. FName := AName;
  446. FParent := AParent;
  447. end;
  448. procedure TPasElement.AddRef;
  449. begin
  450. Inc(FRefCount);
  451. end;
  452. procedure TPasElement.Release;
  453. begin
  454. if FRefCount = 0 then
  455. Free
  456. else
  457. Dec(FRefCount);
  458. end;
  459. function TPasElement.FullName: string;
  460. var
  461. p: TPasElement;
  462. begin
  463. Result := Name;
  464. p := Parent;
  465. while Assigned(p) and not p.InheritsFrom(TPasSection) do
  466. begin
  467. if (p.ClassType <> TPasOverloadedProc) and (Length(p.Name) > 0) then
  468. if Length(Result) > 0 then
  469. Result := p.Name + '.' + Result
  470. else
  471. Result := p.Name;
  472. p := p.Parent;
  473. end;
  474. end;
  475. function TPasElement.PathName: string;
  476. var
  477. p: TPasElement;
  478. begin
  479. Result := Name;
  480. p := Parent;
  481. while Assigned(p) do
  482. begin
  483. if (p.ClassType <> TPasOverloadedProc) and (Length(p.Name) > 0) then
  484. if Length(Result) > 0 then
  485. Result := p.Name + '.' + Result
  486. else
  487. Result := p.Name;
  488. p := p.Parent;
  489. end;
  490. end;
  491. function TPasElement.GetModule: TPasModule;
  492. begin
  493. if ClassType = TPasPackage then
  494. Result := nil
  495. else
  496. begin
  497. Result := TPasModule(Self);
  498. while Assigned(Result) and not (Result.ClassType = TPasModule) do
  499. Result := TPasModule(Result.Parent);
  500. end;
  501. end;
  502. function TPasElement.GetDeclaration (full : boolean): string;
  503. begin
  504. if Full then
  505. Result := Name
  506. else
  507. Result := '';
  508. end;
  509. constructor TPasSection.Create(const AName: string; AParent: TPasElement);
  510. begin
  511. inherited Create(AName, AParent);
  512. UsesList := TList.Create;
  513. Declarations := TList.Create;
  514. ResStrings := TList.Create;
  515. Types := TList.Create;
  516. Consts := TList.Create;
  517. Classes := TList.Create;
  518. Functions := TList.Create;
  519. Variables := TList.Create;
  520. end;
  521. destructor TPasSection.Destroy;
  522. var
  523. i: Integer;
  524. begin
  525. Variables.Free;
  526. Functions.Free;
  527. Classes.Free;
  528. Consts.Free;
  529. Types.Free;
  530. ResStrings.Free;
  531. for i := 0 to Declarations.Count - 1 do
  532. TPasElement(Declarations[i]).Release;
  533. Declarations.Free;
  534. for i := 0 to UsesList.Count - 1 do
  535. TPasType(UsesList[i]).Release;
  536. UsesList.Free;
  537. inherited Destroy;
  538. end;
  539. procedure TPasSection.AddUnitToUsesList(const AUnitName: string);
  540. begin
  541. UsesList.Add(TPasUnresolvedTypeRef.Create(AUnitName, Self));
  542. end;
  543. destructor TPasModule.Destroy;
  544. begin
  545. if Assigned(InterfaceSection) then
  546. InterfaceSection.Release;
  547. if Assigned(ImplementationSection) then
  548. ImplementationSection.Release;
  549. inherited Destroy;
  550. end;
  551. constructor TPasPackage.Create(const AName: string; AParent: TPasElement);
  552. begin
  553. if (Length(AName) > 0) and (AName[1] <> '#') then
  554. inherited Create('#' + AName, AParent)
  555. else
  556. inherited Create(AName, AParent);
  557. Modules := TList.Create;
  558. end;
  559. destructor TPasPackage.Destroy;
  560. var
  561. i: Integer;
  562. begin
  563. for i := 0 to Modules.Count - 1 do
  564. TPasModule(Modules[i]).Release;
  565. Modules.Free;
  566. inherited Destroy;
  567. end;
  568. destructor TPasPointerType.Destroy;
  569. begin
  570. if Assigned(DestType) then
  571. DestType.Release;
  572. inherited Destroy;
  573. end;
  574. destructor TPasAliasType.Destroy;
  575. begin
  576. if Assigned(DestType) then
  577. DestType.Release;
  578. inherited Destroy;
  579. end;
  580. destructor TPasArrayType.Destroy;
  581. begin
  582. if Assigned(ElType) then
  583. ElType.Release;
  584. inherited Destroy;
  585. end;
  586. destructor TPasFileType.Destroy;
  587. begin
  588. if Assigned(ElType) then
  589. ElType.Release;
  590. inherited Destroy;
  591. end;
  592. constructor TPasEnumType.Create(const AName: string; AParent: TPasElement);
  593. begin
  594. inherited Create(AName, AParent);
  595. Values := TList.Create;
  596. end;
  597. destructor TPasEnumType.Destroy;
  598. var
  599. i: Integer;
  600. begin
  601. for i := 0 to Values.Count - 1 do
  602. TPasEnumValue(Values[i]).Release;
  603. Values.Free;
  604. inherited Destroy;
  605. end;
  606. procedure TPasEnumType.GetEnumNames(Names: TStrings);
  607. var
  608. i: Integer;
  609. begin
  610. with Values do
  611. begin
  612. for i := 0 to Count - 2 do
  613. Names.Add(TPasEnumValue(Items[i]).Name + ',');
  614. if Count > 0 then
  615. Names.Add(TPasEnumValue(Items[Count - 1]).Name);
  616. end;
  617. end;
  618. destructor TPasSetType.Destroy;
  619. begin
  620. if Assigned(EnumType) then
  621. EnumType.Release;
  622. inherited Destroy;
  623. end;
  624. constructor TPasVariant.Create(const AName: string; AParent: TPasElement);
  625. begin
  626. inherited Create(AName, AParent);
  627. Values := TStringList.Create;
  628. end;
  629. destructor TPasVariant.Destroy;
  630. begin
  631. Values.Free;
  632. if Assigned(Members) then
  633. Members.Release;
  634. inherited Destroy;
  635. end;
  636. constructor TPasRecordType.Create(const AName: string; AParent: TPasElement);
  637. begin
  638. inherited Create(AName, AParent);
  639. Members := TList.Create;
  640. end;
  641. destructor TPasRecordType.Destroy;
  642. var
  643. i: Integer;
  644. begin
  645. for i := 0 to Members.Count - 1 do
  646. TPasVariable(Members[i]).Release;
  647. Members.Free;
  648. if Assigned(VariantType) then
  649. VariantType.Release;
  650. if Assigned(Variants) then
  651. begin
  652. for i := 0 to Variants.Count - 1 do
  653. TPasVariant(Variants[i]).Release;
  654. Variants.Free;
  655. end;
  656. inherited Destroy;
  657. end;
  658. constructor TPasClassType.Create(const AName: string; AParent: TPasElement);
  659. begin
  660. inherited Create(AName, AParent);
  661. IsPacked := False; // 12/04/04 - Dave - Added
  662. Members := TList.Create;
  663. end;
  664. destructor TPasClassType.Destroy;
  665. var
  666. i: Integer;
  667. begin
  668. for i := 0 to Members.Count - 1 do
  669. TPasElement(Members[i]).Release;
  670. Members.Free;
  671. if Assigned(AncestorType) then
  672. AncestorType.Release;
  673. inherited Destroy;
  674. end;
  675. destructor TPasArgument.Destroy;
  676. begin
  677. if Assigned(ArgType) then
  678. ArgType.Release;
  679. inherited Destroy;
  680. end;
  681. constructor TPasProcedureType.Create(const AName: string; AParent: TPasElement);
  682. begin
  683. inherited Create(AName, AParent);
  684. Args := TList.Create;
  685. end;
  686. destructor TPasProcedureType.Destroy;
  687. var
  688. i: Integer;
  689. begin
  690. for i := 0 to Args.Count - 1 do
  691. TPasArgument(Args[i]).Release;
  692. Args.Free;
  693. inherited Destroy;
  694. end;
  695. class function TPasProcedureType.TypeName: string;
  696. begin
  697. Result := 'procedure';
  698. end;
  699. function TPasProcedureType.CreateArgument(const AName,
  700. AUnresolvedTypeName: string): TPasArgument;
  701. begin
  702. Result := TPasArgument.Create(AName, Self);
  703. Args.Add(Result);
  704. Result.ArgType := TPasUnresolvedTypeRef.Create(AUnresolvedTypeName, Result);
  705. end;
  706. destructor TPasResultElement.Destroy;
  707. begin
  708. if Assigned(ResultType) then
  709. ResultType.Release;
  710. inherited Destroy;
  711. end;
  712. destructor TPasFunctionType.Destroy;
  713. begin
  714. if Assigned(ResultEl) then
  715. ResultEl.Release;
  716. inherited Destroy;
  717. end;
  718. class function TPasFunctionType.TypeName: string;
  719. begin
  720. Result := 'function';
  721. end;
  722. constructor TPasUnresolvedTypeRef.Create(const AName: string; AParent: TPasElement);
  723. begin
  724. inherited Create(AName, nil);
  725. end;
  726. destructor TPasVariable.Destroy;
  727. begin
  728. { Attention, in derived classes, VarType isn't necessarily set!
  729. (e.g. in Constants) }
  730. if Assigned(VarType) then
  731. VarType.Release;
  732. inherited Destroy;
  733. end;
  734. constructor TPasProperty.Create(const AName: string; AParent: TPasElement);
  735. begin
  736. inherited Create(AName, AParent);
  737. Args := TList.Create;
  738. end;
  739. destructor TPasProperty.Destroy;
  740. var
  741. i: Integer;
  742. begin
  743. for i := 0 to Args.Count - 1 do
  744. TPasArgument(Args[i]).Release;
  745. Args.Free;
  746. inherited Destroy;
  747. end;
  748. constructor TPasOverloadedProc.Create(const AName: string; AParent: TPasElement);
  749. begin
  750. inherited Create(AName, AParent);
  751. Overloads := TList.Create;
  752. end;
  753. destructor TPasOverloadedProc.Destroy;
  754. var
  755. i: Integer;
  756. begin
  757. for i := 0 to Overloads.Count - 1 do
  758. TPasProcedure(Overloads[i]).Release;
  759. Overloads.Free;
  760. inherited Destroy;
  761. end;
  762. function TPasOverloadedProc.TypeName: string;
  763. begin
  764. if Assigned(TPasProcedure(Overloads[0]).ProcType) then
  765. Result := TPasProcedure(Overloads[0]).ProcType.TypeName
  766. else
  767. SetLength(Result, 0);
  768. end;
  769. destructor TPasProcedure.Destroy;
  770. begin
  771. if Assigned(ProcType) then
  772. ProcType.Release;
  773. inherited Destroy;
  774. end;
  775. function TPasProcedure.TypeName: string;
  776. begin
  777. Result := ProcType.TypeName;
  778. end;
  779. function TPasConstructor.TypeName: string;
  780. begin
  781. Result := 'constructor';
  782. end;
  783. function TPasDestructor.TypeName: string;
  784. begin
  785. Result := 'destructor';
  786. end;
  787. constructor TPasProcedureImpl.Create(const AName: string; AParent: TPasElement);
  788. begin
  789. inherited Create(AName, AParent);
  790. Locals := TList.Create;
  791. end;
  792. destructor TPasProcedureImpl.Destroy;
  793. var
  794. i: Integer;
  795. begin
  796. if Assigned(Body) then
  797. Body.Release;
  798. for i := 0 to Locals.Count - 1 do
  799. TPasElement(Locals[i]).Release;
  800. Locals.Free;
  801. if Assigned(ProcType) then
  802. ProcType.Release;
  803. inherited Destroy;
  804. end;
  805. function TPasProcedureImpl.TypeName: string;
  806. begin
  807. Result := ProcType.TypeName;
  808. end;
  809. function TPasConstructorImpl.TypeName: string;
  810. begin
  811. Result := 'constructor';
  812. end;
  813. function TPasDestructorImpl.TypeName: string;
  814. begin
  815. Result := 'destructor';
  816. end;
  817. constructor TPasImplCommands.Create(const AName: string; AParent: TPasElement);
  818. begin
  819. inherited Create(AName, AParent);
  820. Commands := TStringList.Create;
  821. end;
  822. destructor TPasImplCommands.Destroy;
  823. begin
  824. Commands.Free;
  825. inherited Destroy;
  826. end;
  827. destructor TPasImplIfElse.Destroy;
  828. begin
  829. if Assigned(IfBranch) then
  830. IfBranch.Release;
  831. if Assigned(ElseBranch) then
  832. ElseBranch.Release;
  833. inherited Destroy;
  834. end;
  835. destructor TPasImplForLoop.Destroy;
  836. begin
  837. if Assigned(Variable) then
  838. Variable.Release;
  839. if Assigned(Body) then
  840. Body.Release;
  841. inherited Destroy;
  842. end;
  843. constructor TPasImplBlock.Create(const AName: string; AParent: TPasElement);
  844. begin
  845. inherited Create(AName, AParent);
  846. Elements := TList.Create;
  847. end;
  848. destructor TPasImplBlock.Destroy;
  849. var
  850. i: Integer;
  851. begin
  852. for i := 0 to Elements.Count - 1 do
  853. TPasImplElement(Elements[i]).Release;
  854. Elements.Free;
  855. inherited Destroy;
  856. end;
  857. function TPasImplBlock.AddCommand(const ACommand: string): TPasImplCommand;
  858. begin
  859. Result := TPasImplCommand.Create('', Self);
  860. Elements.Add(Result);
  861. Result.Command := ACommand;
  862. end;
  863. function TPasImplBlock.AddCommands: TPasImplCommands;
  864. begin
  865. Result := TPasImplCommands.Create('', Self);
  866. Elements.Add(Result);
  867. end;
  868. function TPasImplBlock.AddIfElse(const ACondition: string): TPasImplIfElse;
  869. begin
  870. Result := TPasImplIfElse.Create('', Self);
  871. Elements.Add(Result);
  872. Result.Condition := ACondition;
  873. end;
  874. function TPasImplBlock.AddForLoop(AVar: TPasVariable; const AStartValue,
  875. AEndValue: string): TPasImplForLoop;
  876. begin
  877. Result := TPasImplForLoop.Create('', Self);
  878. Elements.Add(Result);
  879. Result.Variable := AVar;
  880. Result.StartValue := AStartValue;
  881. Result.EndValue := AEndValue;
  882. end;
  883. { ---------------------------------------------------------------------
  884. ---------------------------------------------------------------------}
  885. function TPasModule.GetDeclaration(full : boolean): string;
  886. begin
  887. Result := 'Unit ' + Name;
  888. end;
  889. {
  890. function TPas.GetDeclaration : string;
  891. begin
  892. Result:=Name;
  893. end;
  894. }
  895. function TPasResString.GetDeclaration (full : boolean) : string;
  896. begin
  897. Result:=Value;
  898. If Full Then
  899. Result:=Name+' = '+Result;
  900. end;
  901. function TPasPointerType.GetDeclaration (full : boolean) : string;
  902. begin
  903. Result:='^'+DestType.Name;
  904. If Full then
  905. Result:=Name+' = '+Result;
  906. end;
  907. function TPasAliasType.GetDeclaration (full : boolean) : string;
  908. begin
  909. Result:=DestType.Name;
  910. If Full then
  911. Result:=Name+' = '+Result;
  912. end;
  913. function TPasClassOfType.GetDeclaration (full : boolean) : string;
  914. begin
  915. Result:='Class of '+DestType.Name;
  916. If Full then
  917. Result:=Name+' = '+Result;
  918. end;
  919. function TPasRangeType.GetDeclaration (full : boolean) : string;
  920. begin
  921. Result:=RangeStart+'..'+RangeEnd;
  922. If Full then
  923. Result:=Name+' = '+Result;
  924. end;
  925. function TPasArrayType.GetDeclaration (full : boolean) : string;
  926. begin
  927. Result:='Array['+IndexRange+'] of ';
  928. If IsPacked then
  929. Result := 'packed '+Result; // 12/04/04 Dave - Added
  930. If Assigned(Eltype) then
  931. Result:=Result+ElType.Name
  932. else
  933. Result:=Result+'const';
  934. If Full Then
  935. Result:=Name+' = '+Result;
  936. end;
  937. function TPasFileType.GetDeclaration (full : boolean) : string;
  938. begin
  939. Result:='File of ';
  940. If Assigned(Eltype) then
  941. Result:=Result+ElType.Name;
  942. If Full Then
  943. Result:=Name+' = '+Result;
  944. end;
  945. Function IndentStrings(S : TStrings; indent : Integer) : string;
  946. Var
  947. I,CurrLen,CurrPos : Integer;
  948. begin
  949. Result:='';
  950. CurrLen:=0;
  951. CurrPos:=0;
  952. For I:=0 to S.Count-1 do
  953. begin
  954. CurrLen:=Length(S[i]);
  955. If (CurrLen+CurrPos)>72 then
  956. begin
  957. Result:=Result+LineEnding+StringOfChar(' ',Indent);
  958. CurrPos:=Indent;
  959. end;
  960. Result:=Result+S[i];
  961. CurrPos:=CurrPos+CurrLen;
  962. end;
  963. end;
  964. function TPasEnumType.GetDeclaration (full : boolean) : string;
  965. Var
  966. S : TStringList;
  967. begin
  968. S:=TStringList.Create;
  969. Try
  970. If Full then
  971. S.Add(Name+' = (')
  972. else
  973. S.Add('(');
  974. GetEnumNames(S);
  975. S[S.Count-1]:=S[S.Count-1]+')';
  976. If Full then
  977. Result:=IndentStrings(S,Length(Name)+4)
  978. else
  979. Result:=IndentStrings(S,1);
  980. finally
  981. S.Free;
  982. end;
  983. end;
  984. function TPasSetType.GetDeclaration (full : boolean) : string;
  985. Var
  986. S : TStringList;
  987. i : Integer;
  988. begin
  989. If EnumType is TPasEnumType then
  990. begin
  991. S:=TStringList.Create;
  992. Try
  993. If Full then
  994. S.Add(Name+'= Set of (')
  995. else
  996. S.Add('Set of (');
  997. TPasEnumType(EnumType).GetEnumNames(S);
  998. S[S.Count-1]:=S[S.Count-1]+')';
  999. I:=Pos('(',S[0]);
  1000. Result:=IndentStrings(S,i);
  1001. finally
  1002. S.Free;
  1003. end;
  1004. end
  1005. else
  1006. begin
  1007. Result:='Set of '+EnumType.Name;
  1008. If Full then
  1009. Result:=Name+' = '+Result;
  1010. end;
  1011. end;
  1012. function TPasRecordType.GetDeclaration (full : boolean) : string;
  1013. Var
  1014. S,T : TStringList;
  1015. temp : string;
  1016. I,J : integer;
  1017. begin
  1018. S:=TStringList.Create;
  1019. T:=TstringList.Create;
  1020. Try
  1021. Temp:='record';
  1022. If IsPacked then
  1023. Temp:='packed '+Temp;
  1024. If Full then
  1025. Temp:=Name+' = '+Temp;
  1026. S.Add(Temp);
  1027. For I:=0 to Members.Count-1 do
  1028. begin
  1029. Temp:=TPasVariable(Members[i]).GetDeclaration(True);
  1030. If Pos(LineEnding,Temp)>0 then
  1031. begin
  1032. T.Text:=Temp;
  1033. For J:=0 to T.Count-1 do
  1034. if J=T.Count-1 then
  1035. S.Add(' '+T[J]+';')
  1036. else
  1037. S.Add(' '+T[J])
  1038. end
  1039. else
  1040. S.Add(' '+Temp+';');
  1041. end;
  1042. S.Add('end');
  1043. Result:=S.Text;
  1044. finally
  1045. S.free;
  1046. T.free;
  1047. end;
  1048. end;
  1049. procedure TPasProcedureType.GetArguments(List : TStrings);
  1050. Var
  1051. T : string;
  1052. I : Integer;
  1053. begin
  1054. For I:=0 to Args.Count-1 do
  1055. begin
  1056. T:=AccessNames[TPasArgument(Args[i]).Access];
  1057. T:=T+TPasArgument(Args[i]).GetDeclaration(True);
  1058. If I=0 then
  1059. T:='('+T;
  1060. If I<Args.Count-1 then
  1061. List.Add(T+';')
  1062. else
  1063. List.Add(T+')');
  1064. end;
  1065. end;
  1066. function TPasProcedureType.GetDeclaration (full : boolean) : string;
  1067. Var
  1068. S : TStringList;
  1069. begin
  1070. S:=TStringList.Create;
  1071. Try
  1072. If Full then
  1073. S.Add(Format('%s = ',[Name]));
  1074. S.Add(TypeName);
  1075. GetArguments(S);
  1076. If IsOfObject then
  1077. S.Add(' of object');
  1078. If Full then
  1079. Result:=IndentStrings(S,Length(S[0])+Length(S[1])+1)
  1080. else
  1081. Result:=IndentStrings(S,Length(S[0])+1);
  1082. finally
  1083. S.Free;
  1084. end;
  1085. end;
  1086. function TPasFunctionType.GetDeclaration (full : boolean) : string;
  1087. Var
  1088. S : TStringList;
  1089. T : string;
  1090. begin
  1091. S:=TStringList.Create;
  1092. Try
  1093. If Full then
  1094. S.Add(Format('%s = ',[Name]));
  1095. S.Add(TypeName);
  1096. GetArguments(S);
  1097. If Assigned(ResultEl) then
  1098. begin
  1099. T:=' : ';
  1100. If (ResultEl.ResultType.Name<>'') then
  1101. T:=T+ResultEl.ResultType.Name
  1102. else
  1103. T:=T+ResultEl.ResultType.GetDeclaration(False);
  1104. S.Add(T);
  1105. end;
  1106. If IsOfObject then
  1107. S.Add(' of object');
  1108. If Full then
  1109. Result:=IndentStrings(S,Length(S[0])+Length(S[1])+1)
  1110. else
  1111. Result:=IndentStrings(S,Length(S[0])+1);
  1112. finally
  1113. S.Free;
  1114. end;
  1115. end;
  1116. function TPasVariable.GetDeclaration (full : boolean) : string;
  1117. Const
  1118. Seps : Array[Boolean] of Char = ('=',':');
  1119. begin
  1120. If Assigned(VarType) then
  1121. begin
  1122. If VarType.Name='' then
  1123. Result:=VarType.GetDeclaration(False)
  1124. else
  1125. Result:=VarType.Name;
  1126. Result:=Result+Modifiers;
  1127. if (Value<>'') then
  1128. Result:=Result+' = '+Value;
  1129. end
  1130. else
  1131. Result:=Value;
  1132. If Full then
  1133. Result:=Name+' '+Seps[Assigned(VarType)]+' '+Result;
  1134. end;
  1135. function TPasProperty.GetDeclaration (full : boolean) : string;
  1136. Var
  1137. S : string;
  1138. I : Integer;
  1139. begin
  1140. If Assigned(VarType) then
  1141. begin
  1142. If VarType.Name='' then
  1143. Result:=VarType.GetDeclaration(False)
  1144. else
  1145. Result:=VarType.Name;
  1146. end
  1147. else
  1148. Result:=Value;
  1149. S:='';
  1150. If Assigned(Args) and (Args.Count>0) then
  1151. begin
  1152. For I:=0 to Args.Count-1 do
  1153. begin
  1154. If (S<>'') then
  1155. S:=S+';';
  1156. S:=S+TPasElement(Args[i]).GetDeclaration(true);
  1157. end;
  1158. end;
  1159. If S<>'' then
  1160. S:='['+S+']'
  1161. else
  1162. S:=' ';
  1163. If Full then
  1164. Result:=Name+S+': '+Result;
  1165. If IsDefault then
  1166. Result:=Result+'; default'
  1167. end;
  1168. Procedure TPasProcedure.GetModifiers(List : TStrings);
  1169. Procedure DoAdd(B : Boolean; S : string);
  1170. begin
  1171. if B then
  1172. List.add('; '+S);
  1173. end;
  1174. begin
  1175. Doadd(IsVirtual,' Virtual');
  1176. DoAdd(IsDynamic,' Dynamic');
  1177. DoAdd(IsOverride,' Override');
  1178. DoAdd(IsAbstract,' Abstract');
  1179. DoAdd(IsOverload,' Overload');
  1180. DoAdd(IsReintroduced,' Reintroduce');
  1181. DoAdd(IsStatic,' Static');
  1182. DoAdd(IsMessage,' Message');
  1183. end;
  1184. function TPasProcedure.GetDeclaration (full : boolean) : string;
  1185. Var
  1186. S : TStringList;
  1187. begin
  1188. S:=TStringList.Create;
  1189. try
  1190. If Full then
  1191. S.Add(TypeName+' '+Name);
  1192. ProcType.GetArguments(S);
  1193. GetModifiers(S);
  1194. Result:=IndentStrings(S,Length(S[0]));
  1195. finally
  1196. S.Free;
  1197. end;
  1198. end;
  1199. function TPasFunction.GetDeclaration (full : boolean) : string;
  1200. Var
  1201. S : TStringList;
  1202. T : string;
  1203. begin
  1204. S:=TStringList.Create;
  1205. try
  1206. If Full then
  1207. S.Add(TypeName+' '+Name);
  1208. ProcType.GetArguments(S);
  1209. If Assigned((Proctype as TPasFunctionType).ResultEl) then
  1210. With TPasFunctionType(ProcType).ResultEl.ResultType do
  1211. begin
  1212. T:=' : ';
  1213. If (Name<>'') then
  1214. T:=T+Name
  1215. else
  1216. T:=T+GetDeclaration(False);
  1217. S.Add(T);
  1218. end;
  1219. GetModifiers(S);
  1220. Result:=IndentStrings(S,Length(S[0]));
  1221. finally
  1222. S.Free;
  1223. end;
  1224. end;
  1225. function TPasOperator.GetDeclaration (full : boolean) : string;
  1226. Var
  1227. S : TStringList;
  1228. T : string;
  1229. begin
  1230. S:=TStringList.Create;
  1231. try
  1232. If Full then
  1233. S.Add(TypeName+' '+Name);
  1234. ProcType.GetArguments(S);
  1235. If Assigned((Proctype as TPasFunctionType).ResultEl) then
  1236. With TPasFunctionType(ProcType).ResultEl.ResultType do
  1237. begin
  1238. T:=' : ';
  1239. If (Name<>'') then
  1240. T:=T+Name
  1241. else
  1242. T:=T+GetDeclaration(False);
  1243. S.Add(T);
  1244. end;
  1245. GetModifiers(S);
  1246. Result:=IndentStrings(S,Length(S[0]));
  1247. finally
  1248. S.Free;
  1249. end;
  1250. end;
  1251. function TPasArgument.GetDeclaration (full : boolean) : string;
  1252. begin
  1253. If Assigned(ArgType) then
  1254. begin
  1255. If ArgType.Name<>'' then
  1256. Result:=ArgType.Name
  1257. else
  1258. Result:=ArgType.GetDeclaration(False);
  1259. If Full then
  1260. Result:=Name+': '+Result;
  1261. end
  1262. else If Full then
  1263. Result:=Name
  1264. else
  1265. Result:='';
  1266. end;
  1267. end.