pastree.pp 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501
  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. end;
  271. TPasConst = class(TPasVariable)
  272. public
  273. function ElementTypeName: string; override;
  274. end;
  275. TPasProperty = class(TPasVariable)
  276. public
  277. constructor Create(const AName: string; AParent: TPasElement); override;
  278. destructor Destroy; override;
  279. function ElementTypeName: string; override;
  280. function GetDeclaration(full : boolean) : string; override;
  281. Args: TList; // List of TPasArgument objects
  282. IndexValue, ReadAccessorName, WriteAccessorName,
  283. StoredAccessorName, DefaultValue: string;
  284. IsDefault, IsNodefault: Boolean;
  285. end;
  286. TPasProcedureBase = class(TPasElement)
  287. public
  288. function TypeName: string; virtual; abstract;
  289. end;
  290. TPasOverloadedProc = class(TPasProcedureBase)
  291. public
  292. constructor Create(const AName: string; AParent: TPasElement); override;
  293. destructor Destroy; override;
  294. function ElementTypeName: string; override;
  295. function TypeName: string; override;
  296. Overloads: TList; // List of TPasProcedure nodes
  297. end;
  298. TPasProcedure = class(TPasProcedureBase)
  299. public
  300. destructor Destroy; override;
  301. function ElementTypeName: string; override;
  302. function TypeName: string; override;
  303. ProcType: TPasProcedureType;
  304. function GetDeclaration(full: Boolean): string; override;
  305. procedure GetModifiers(List: TStrings);
  306. IsVirtual, IsDynamic, IsAbstract, IsOverride,
  307. IsOverload, IsMessage, isReintroduced, isStatic: Boolean;
  308. end;
  309. TPasFunction = class(TPasProcedure)
  310. public
  311. function ElementTypeName: string; override;
  312. function GetDeclaration (full : boolean) : string; override;
  313. end;
  314. TPasOperator = class(TPasProcedure)
  315. public
  316. function ElementTypeName: string; override;
  317. function GetDeclaration (full : boolean) : string; override;
  318. end;
  319. TPasConstructor = class(TPasProcedure)
  320. public
  321. function ElementTypeName: string; override;
  322. function TypeName: string; override;
  323. end;
  324. TPasDestructor = class(TPasProcedure)
  325. public
  326. function ElementTypeName: string; override;
  327. function TypeName: string; override;
  328. end;
  329. TPasImplBlock = class;
  330. TPasProcedureImpl = class(TPasElement)
  331. public
  332. constructor Create(const AName: string; AParent: TPasElement); override;
  333. destructor Destroy; override;
  334. function ElementTypeName: string; override;
  335. function TypeName: string; virtual;
  336. ProcType: TPasProcedureType;
  337. Locals: TList;
  338. Body: TPasImplBlock;
  339. end;
  340. TPasConstructorImpl = class(TPasProcedureImpl)
  341. public
  342. function ElementTypeName: string; override;
  343. function TypeName: string; override;
  344. end;
  345. TPasDestructorImpl = class(TPasProcedureImpl)
  346. public
  347. function ElementTypeName: string; override;
  348. function TypeName: string; override;
  349. end;
  350. TPasImplElement = class(TPasElement)
  351. end;
  352. TPasImplCommand = class(TPasImplElement)
  353. public
  354. Command: string;
  355. end;
  356. TPasImplCommands = class(TPasImplElement)
  357. public
  358. constructor Create(const AName: string; AParent: TPasElement); override;
  359. destructor Destroy; override;
  360. Commands: TStrings;
  361. end;
  362. TPasImplIfElse = class(TPasImplElement)
  363. public
  364. destructor Destroy; override;
  365. Condition: string;
  366. IfBranch, ElseBranch: TPasImplElement;
  367. end;
  368. TPasImplForLoop = class(TPasImplElement)
  369. public
  370. destructor Destroy; override;
  371. Variable: TPasVariable;
  372. StartValue, EndValue: string;
  373. Body: TPasImplElement;
  374. end;
  375. TPasImplBlock = class(TPasImplElement)
  376. public
  377. constructor Create(const AName: string; AParent: TPasElement); override;
  378. destructor Destroy; override;
  379. function AddCommand(const ACommand: string): TPasImplCommand;
  380. function AddCommands: TPasImplCommands;
  381. function AddIfElse(const ACondition: string): TPasImplIfElse;
  382. function AddForLoop(AVar: TPasVariable;
  383. const AStartValue, AEndValue: string): TPasImplForLoop;
  384. Elements: TList; // TPasImplElement objects
  385. end;
  386. const
  387. AccessNames: array[TArgumentAccess] of string[6] = ('', 'const ', 'var ', 'out ');
  388. AllVisibilities: TPasMemberVisibilities =
  389. [visDefault, visPrivate, visProtected, visPublic,
  390. visPublished, visAutomated];
  391. VisibilityNames: array[TPasMemberVisibility] of string = (
  392. 'default', 'private', 'protected', 'public', 'published', 'automated');
  393. ObjKindNames: array[TPasObjKind] of string = (
  394. 'object', 'class', 'interface');
  395. implementation
  396. uses SysUtils;
  397. { Parse tree element type name functions }
  398. function TPasElement.ElementTypeName: string; begin Result := SPasTreeElement end;
  399. function TPasSection.ElementTypeName: string; begin Result := SPasTreeSection end;
  400. function TPasModule.ElementTypeName: string; begin Result := SPasTreeModule end;
  401. function TPasPackage.ElementTypeName: string; begin Result := SPasTreePackage end;
  402. function TPasResString.ElementTypeName: string; begin Result := SPasTreeResString end;
  403. function TPasType.ElementTypeName: string; begin Result := SPasTreeType end;
  404. function TPasPointerType.ElementTypeName: string; begin Result := SPasTreePointerType end;
  405. function TPasAliasType.ElementTypeName: string; begin Result := SPasTreeAliasType end;
  406. function TPasTypeAliasType.ElementTypeName: string; begin Result := SPasTreeTypeAliasType end;
  407. function TPasClassOfType.ElementTypeName: string; begin Result := SPasTreeClassOfType end;
  408. function TPasRangeType.ElementTypeName: string; begin Result := SPasTreeRangeType end;
  409. function TPasArrayType.ElementTypeName: string; begin Result := SPasTreeArrayType end;
  410. function TPasFileType.ElementTypeName: string; begin Result := SPasTreeFileType end;
  411. function TPasEnumValue.ElementTypeName: string; begin Result := SPasTreeEnumValue end;
  412. function TPasEnumType.ElementTypeName: string; begin Result := SPasTreeEnumType end;
  413. function TPasSetType.ElementTypeName: string; begin Result := SPasTreeSetType end;
  414. function TPasRecordType.ElementTypeName: string; begin Result := SPasTreeRecordType end;
  415. function TPasArgument.ElementTypeName: string; begin Result := SPasTreeArgument end;
  416. function TPasProcedureType.ElementTypeName: string; begin Result := SPasTreeProcedureType end;
  417. function TPasResultElement.ElementTypeName: string; begin Result := SPasTreeResultElement end;
  418. function TPasFunctionType.ElementTypeName: string; begin Result := SPasTreeFunctionType end;
  419. function TPasUnresolvedTypeRef.ElementTypeName: string; begin Result := SPasTreeUnresolvedTypeRef end;
  420. function TPasVariable.ElementTypeName: string; begin Result := SPasTreeVariable end;
  421. function TPasConst.ElementTypeName: string; begin Result := SPasTreeConst end;
  422. function TPasProperty.ElementTypeName: string; begin Result := SPasTreeProperty end;
  423. function TPasOverloadedProc.ElementTypeName: string; begin Result := SPasTreeOverloadedProcedure end;
  424. function TPasProcedure.ElementTypeName: string; begin Result := SPasTreeProcedure end;
  425. function TPasFunction.ElementTypeName: string; begin Result := SPasTreeFunction end;
  426. function TPasOperator.ElementTypeName: string; begin Result := SPasTreeFunction end;
  427. function TPasConstructor.ElementTypeName: string; begin Result := SPasTreeConstructor end;
  428. function TPasDestructor.ElementTypeName: string; begin Result := SPasTreeDestructor end;
  429. function TPasProcedureImpl.ElementTypeName: string; begin Result := SPasTreeProcedureImpl end;
  430. function TPasConstructorImpl.ElementTypeName: string; begin Result := SPasTreeConstructorImpl end;
  431. function TPasDestructorImpl.ElementTypeName: string; begin Result := SPasTreeDestructorImpl end;
  432. function TPasClassType.ElementTypeName: string;
  433. begin
  434. case ObjKind of
  435. okObject: Result := SPasTreeObjectType;
  436. okClass: Result := SPasTreeClassType;
  437. okInterface: Result := SPasTreeInterfaceType;
  438. end;
  439. end;
  440. { All other stuff: }
  441. constructor TPasElement.Create(const AName: string; AParent: TPasElement);
  442. begin
  443. inherited Create;
  444. FName := AName;
  445. FParent := AParent;
  446. end;
  447. procedure TPasElement.AddRef;
  448. begin
  449. Inc(FRefCount);
  450. end;
  451. procedure TPasElement.Release;
  452. begin
  453. if FRefCount = 0 then
  454. Free
  455. else
  456. Dec(FRefCount);
  457. end;
  458. function TPasElement.FullName: string;
  459. var
  460. p: TPasElement;
  461. begin
  462. Result := Name;
  463. p := Parent;
  464. while Assigned(p) and not p.InheritsFrom(TPasSection) do
  465. begin
  466. if (p.ClassType <> TPasOverloadedProc) and (Length(p.Name) > 0) then
  467. if Length(Result) > 0 then
  468. Result := p.Name + '.' + Result
  469. else
  470. Result := p.Name;
  471. p := p.Parent;
  472. end;
  473. end;
  474. function TPasElement.PathName: string;
  475. var
  476. p: TPasElement;
  477. begin
  478. Result := Name;
  479. p := Parent;
  480. while Assigned(p) do
  481. begin
  482. if (p.ClassType <> TPasOverloadedProc) and (Length(p.Name) > 0) then
  483. if Length(Result) > 0 then
  484. Result := p.Name + '.' + Result
  485. else
  486. Result := p.Name;
  487. p := p.Parent;
  488. end;
  489. end;
  490. function TPasElement.GetModule: TPasModule;
  491. begin
  492. if ClassType = TPasPackage then
  493. Result := nil
  494. else
  495. begin
  496. Result := TPasModule(Self);
  497. while Assigned(Result) and not (Result.ClassType = TPasModule) do
  498. Result := TPasModule(Result.Parent);
  499. end;
  500. end;
  501. function TPasElement.GetDeclaration (full : boolean): string;
  502. begin
  503. if Full then
  504. Result := Name
  505. else
  506. Result := '';
  507. end;
  508. constructor TPasSection.Create(const AName: string; AParent: TPasElement);
  509. begin
  510. inherited Create(AName, AParent);
  511. UsesList := TList.Create;
  512. Declarations := TList.Create;
  513. ResStrings := TList.Create;
  514. Types := TList.Create;
  515. Consts := TList.Create;
  516. Classes := TList.Create;
  517. Functions := TList.Create;
  518. Variables := TList.Create;
  519. end;
  520. destructor TPasSection.Destroy;
  521. var
  522. i: Integer;
  523. begin
  524. Variables.Free;
  525. Functions.Free;
  526. Classes.Free;
  527. Consts.Free;
  528. Types.Free;
  529. ResStrings.Free;
  530. for i := 0 to Declarations.Count - 1 do
  531. TPasElement(Declarations[i]).Release;
  532. Declarations.Free;
  533. for i := 0 to UsesList.Count - 1 do
  534. TPasType(UsesList[i]).Release;
  535. UsesList.Free;
  536. inherited Destroy;
  537. end;
  538. procedure TPasSection.AddUnitToUsesList(const AUnitName: string);
  539. begin
  540. UsesList.Add(TPasUnresolvedTypeRef.Create(AUnitName, Self));
  541. end;
  542. destructor TPasModule.Destroy;
  543. begin
  544. if Assigned(InterfaceSection) then
  545. InterfaceSection.Release;
  546. if Assigned(ImplementationSection) then
  547. ImplementationSection.Release;
  548. inherited Destroy;
  549. end;
  550. constructor TPasPackage.Create(const AName: string; AParent: TPasElement);
  551. begin
  552. if (Length(AName) > 0) and (AName[1] <> '#') then
  553. inherited Create('#' + AName, AParent)
  554. else
  555. inherited Create(AName, AParent);
  556. Modules := TList.Create;
  557. end;
  558. destructor TPasPackage.Destroy;
  559. var
  560. i: Integer;
  561. begin
  562. for i := 0 to Modules.Count - 1 do
  563. TPasModule(Modules[i]).Release;
  564. Modules.Free;
  565. inherited Destroy;
  566. end;
  567. destructor TPasPointerType.Destroy;
  568. begin
  569. if Assigned(DestType) then
  570. DestType.Release;
  571. inherited Destroy;
  572. end;
  573. destructor TPasAliasType.Destroy;
  574. begin
  575. if Assigned(DestType) then
  576. DestType.Release;
  577. inherited Destroy;
  578. end;
  579. destructor TPasArrayType.Destroy;
  580. begin
  581. if Assigned(ElType) then
  582. ElType.Release;
  583. inherited Destroy;
  584. end;
  585. destructor TPasFileType.Destroy;
  586. begin
  587. if Assigned(ElType) then
  588. ElType.Release;
  589. inherited Destroy;
  590. end;
  591. constructor TPasEnumType.Create(const AName: string; AParent: TPasElement);
  592. begin
  593. inherited Create(AName, AParent);
  594. Values := TList.Create;
  595. end;
  596. destructor TPasEnumType.Destroy;
  597. var
  598. i: Integer;
  599. begin
  600. for i := 0 to Values.Count - 1 do
  601. TPasEnumValue(Values[i]).Release;
  602. Values.Free;
  603. inherited Destroy;
  604. end;
  605. procedure TPasEnumType.GetEnumNames(Names: TStrings);
  606. var
  607. i: Integer;
  608. begin
  609. with Values do
  610. begin
  611. for i := 0 to Count - 2 do
  612. Names.Add(TPasEnumValue(Items[i]).Name + ',');
  613. if Count > 0 then
  614. Names.Add(TPasEnumValue(Items[Count - 1]).Name);
  615. end;
  616. end;
  617. destructor TPasSetType.Destroy;
  618. begin
  619. if Assigned(EnumType) then
  620. EnumType.Release;
  621. inherited Destroy;
  622. end;
  623. constructor TPasVariant.Create(const AName: string; AParent: TPasElement);
  624. begin
  625. inherited Create(AName, AParent);
  626. Values := TStringList.Create;
  627. end;
  628. destructor TPasVariant.Destroy;
  629. begin
  630. Values.Free;
  631. if Assigned(Members) then
  632. Members.Release;
  633. inherited Destroy;
  634. end;
  635. constructor TPasRecordType.Create(const AName: string; AParent: TPasElement);
  636. begin
  637. inherited Create(AName, AParent);
  638. Members := TList.Create;
  639. end;
  640. destructor TPasRecordType.Destroy;
  641. var
  642. i: Integer;
  643. begin
  644. for i := 0 to Members.Count - 1 do
  645. TPasVariable(Members[i]).Release;
  646. Members.Free;
  647. if Assigned(VariantType) then
  648. VariantType.Release;
  649. if Assigned(Variants) then
  650. begin
  651. for i := 0 to Variants.Count - 1 do
  652. TPasVariant(Variants[i]).Release;
  653. Variants.Free;
  654. end;
  655. inherited Destroy;
  656. end;
  657. constructor TPasClassType.Create(const AName: string; AParent: TPasElement);
  658. begin
  659. inherited Create(AName, AParent);
  660. IsPacked := False; // 12/04/04 - Dave - Added
  661. Members := TList.Create;
  662. end;
  663. destructor TPasClassType.Destroy;
  664. var
  665. i: Integer;
  666. begin
  667. for i := 0 to Members.Count - 1 do
  668. TPasElement(Members[i]).Release;
  669. Members.Free;
  670. if Assigned(AncestorType) then
  671. AncestorType.Release;
  672. inherited Destroy;
  673. end;
  674. destructor TPasArgument.Destroy;
  675. begin
  676. if Assigned(ArgType) then
  677. ArgType.Release;
  678. inherited Destroy;
  679. end;
  680. constructor TPasProcedureType.Create(const AName: string; AParent: TPasElement);
  681. begin
  682. inherited Create(AName, AParent);
  683. Args := TList.Create;
  684. end;
  685. destructor TPasProcedureType.Destroy;
  686. var
  687. i: Integer;
  688. begin
  689. for i := 0 to Args.Count - 1 do
  690. TPasArgument(Args[i]).Release;
  691. Args.Free;
  692. inherited Destroy;
  693. end;
  694. class function TPasProcedureType.TypeName: string;
  695. begin
  696. Result := 'procedure';
  697. end;
  698. function TPasProcedureType.CreateArgument(const AName,
  699. AUnresolvedTypeName: string): TPasArgument;
  700. begin
  701. Result := TPasArgument.Create(AName, Self);
  702. Args.Add(Result);
  703. Result.ArgType := TPasUnresolvedTypeRef.Create(AUnresolvedTypeName, Result);
  704. end;
  705. destructor TPasResultElement.Destroy;
  706. begin
  707. if Assigned(ResultType) then
  708. ResultType.Release;
  709. inherited Destroy;
  710. end;
  711. destructor TPasFunctionType.Destroy;
  712. begin
  713. if Assigned(ResultEl) then
  714. ResultEl.Release;
  715. inherited Destroy;
  716. end;
  717. class function TPasFunctionType.TypeName: string;
  718. begin
  719. Result := 'function';
  720. end;
  721. constructor TPasUnresolvedTypeRef.Create(const AName: string; AParent: TPasElement);
  722. begin
  723. inherited Create(AName, nil);
  724. end;
  725. destructor TPasVariable.Destroy;
  726. begin
  727. { Attention, in derived classes, VarType isn't necessarily set!
  728. (e.g. in Constants) }
  729. if Assigned(VarType) then
  730. VarType.Release;
  731. inherited Destroy;
  732. end;
  733. constructor TPasProperty.Create(const AName: string; AParent: TPasElement);
  734. begin
  735. inherited Create(AName, AParent);
  736. Args := TList.Create;
  737. end;
  738. destructor TPasProperty.Destroy;
  739. var
  740. i: Integer;
  741. begin
  742. for i := 0 to Args.Count - 1 do
  743. TPasArgument(Args[i]).Release;
  744. Args.Free;
  745. inherited Destroy;
  746. end;
  747. constructor TPasOverloadedProc.Create(const AName: string; AParent: TPasElement);
  748. begin
  749. inherited Create(AName, AParent);
  750. Overloads := TList.Create;
  751. end;
  752. destructor TPasOverloadedProc.Destroy;
  753. var
  754. i: Integer;
  755. begin
  756. for i := 0 to Overloads.Count - 1 do
  757. TPasProcedure(Overloads[i]).Release;
  758. Overloads.Free;
  759. inherited Destroy;
  760. end;
  761. function TPasOverloadedProc.TypeName: string;
  762. begin
  763. if Assigned(TPasProcedure(Overloads[0]).ProcType) then
  764. Result := TPasProcedure(Overloads[0]).ProcType.TypeName
  765. else
  766. SetLength(Result, 0);
  767. end;
  768. destructor TPasProcedure.Destroy;
  769. begin
  770. if Assigned(ProcType) then
  771. ProcType.Release;
  772. inherited Destroy;
  773. end;
  774. function TPasProcedure.TypeName: string;
  775. begin
  776. Result := ProcType.TypeName;
  777. end;
  778. function TPasConstructor.TypeName: string;
  779. begin
  780. Result := 'constructor';
  781. end;
  782. function TPasDestructor.TypeName: string;
  783. begin
  784. Result := 'destructor';
  785. end;
  786. constructor TPasProcedureImpl.Create(const AName: string; AParent: TPasElement);
  787. begin
  788. inherited Create(AName, AParent);
  789. Locals := TList.Create;
  790. end;
  791. destructor TPasProcedureImpl.Destroy;
  792. var
  793. i: Integer;
  794. begin
  795. if Assigned(Body) then
  796. Body.Release;
  797. for i := 0 to Locals.Count - 1 do
  798. TPasElement(Locals[i]).Release;
  799. Locals.Free;
  800. if Assigned(ProcType) then
  801. ProcType.Release;
  802. inherited Destroy;
  803. end;
  804. function TPasProcedureImpl.TypeName: string;
  805. begin
  806. Result := ProcType.TypeName;
  807. end;
  808. function TPasConstructorImpl.TypeName: string;
  809. begin
  810. Result := 'constructor';
  811. end;
  812. function TPasDestructorImpl.TypeName: string;
  813. begin
  814. Result := 'destructor';
  815. end;
  816. constructor TPasImplCommands.Create(const AName: string; AParent: TPasElement);
  817. begin
  818. inherited Create(AName, AParent);
  819. Commands := TStringList.Create;
  820. end;
  821. destructor TPasImplCommands.Destroy;
  822. begin
  823. Commands.Free;
  824. inherited Destroy;
  825. end;
  826. destructor TPasImplIfElse.Destroy;
  827. begin
  828. if Assigned(IfBranch) then
  829. IfBranch.Release;
  830. if Assigned(ElseBranch) then
  831. ElseBranch.Release;
  832. inherited Destroy;
  833. end;
  834. destructor TPasImplForLoop.Destroy;
  835. begin
  836. if Assigned(Variable) then
  837. Variable.Release;
  838. if Assigned(Body) then
  839. Body.Release;
  840. inherited Destroy;
  841. end;
  842. constructor TPasImplBlock.Create(const AName: string; AParent: TPasElement);
  843. begin
  844. inherited Create(AName, AParent);
  845. Elements := TList.Create;
  846. end;
  847. destructor TPasImplBlock.Destroy;
  848. var
  849. i: Integer;
  850. begin
  851. for i := 0 to Elements.Count - 1 do
  852. TPasImplElement(Elements[i]).Release;
  853. Elements.Free;
  854. inherited Destroy;
  855. end;
  856. function TPasImplBlock.AddCommand(const ACommand: string): TPasImplCommand;
  857. begin
  858. Result := TPasImplCommand.Create('', Self);
  859. Elements.Add(Result);
  860. Result.Command := ACommand;
  861. end;
  862. function TPasImplBlock.AddCommands: TPasImplCommands;
  863. begin
  864. Result := TPasImplCommands.Create('', Self);
  865. Elements.Add(Result);
  866. end;
  867. function TPasImplBlock.AddIfElse(const ACondition: string): TPasImplIfElse;
  868. begin
  869. Result := TPasImplIfElse.Create('', Self);
  870. Elements.Add(Result);
  871. Result.Condition := ACondition;
  872. end;
  873. function TPasImplBlock.AddForLoop(AVar: TPasVariable; const AStartValue,
  874. AEndValue: string): TPasImplForLoop;
  875. begin
  876. Result := TPasImplForLoop.Create('', Self);
  877. Elements.Add(Result);
  878. Result.Variable := AVar;
  879. Result.StartValue := AStartValue;
  880. Result.EndValue := AEndValue;
  881. end;
  882. { ---------------------------------------------------------------------
  883. ---------------------------------------------------------------------}
  884. function TPasModule.GetDeclaration(full : boolean): string;
  885. begin
  886. Result := 'Unit ' + Name;
  887. end;
  888. {
  889. function TPas.GetDeclaration : string;
  890. begin
  891. Result:=Name;
  892. end;
  893. }
  894. function TPasResString.GetDeclaration (full : boolean) : string;
  895. begin
  896. Result:=Value;
  897. If Full Then
  898. Result:=Name+' = '+Result;
  899. end;
  900. function TPasPointerType.GetDeclaration (full : boolean) : string;
  901. begin
  902. Result:='^'+DestType.Name;
  903. If Full then
  904. Result:=Name+' = '+Result;
  905. end;
  906. function TPasAliasType.GetDeclaration (full : boolean) : string;
  907. begin
  908. Result:=DestType.Name;
  909. If Full then
  910. Result:=Name+' = '+Result;
  911. end;
  912. function TPasClassOfType.GetDeclaration (full : boolean) : string;
  913. begin
  914. Result:='Class of '+DestType.Name;
  915. If Full then
  916. Result:=Name+' = '+Result;
  917. end;
  918. function TPasRangeType.GetDeclaration (full : boolean) : string;
  919. begin
  920. Result:=RangeStart+'..'+RangeEnd;
  921. If Full then
  922. Result:=Name+' = '+Result;
  923. end;
  924. function TPasArrayType.GetDeclaration (full : boolean) : string;
  925. begin
  926. Result:='Array['+IndexRange+'] of ';
  927. If IsPacked then
  928. Result := 'packed '+Result; // 12/04/04 Dave - Added
  929. If Assigned(Eltype) then
  930. Result:=Result+ElType.Name
  931. else
  932. Result:=Result+'const';
  933. If Full Then
  934. Result:=Name+' = '+Result;
  935. end;
  936. function TPasFileType.GetDeclaration (full : boolean) : string;
  937. begin
  938. Result:='File of ';
  939. If Assigned(Eltype) then
  940. Result:=Result+ElType.Name;
  941. If Full Then
  942. Result:=Name+' = '+Result;
  943. end;
  944. Function IndentStrings(S : TStrings; indent : Integer) : string;
  945. Var
  946. I,CurrLen,CurrPos : Integer;
  947. begin
  948. Result:='';
  949. CurrLen:=0;
  950. CurrPos:=0;
  951. For I:=0 to S.Count-1 do
  952. begin
  953. CurrLen:=Length(S[i]);
  954. If (CurrLen+CurrPos)>72 then
  955. begin
  956. Result:=Result+LineEnding+StringOfChar(' ',Indent);
  957. CurrPos:=Indent;
  958. end;
  959. Result:=Result+S[i];
  960. CurrPos:=CurrPos+CurrLen;
  961. end;
  962. end;
  963. function TPasEnumType.GetDeclaration (full : boolean) : string;
  964. Var
  965. S : TStringList;
  966. begin
  967. S:=TStringList.Create;
  968. Try
  969. If Full then
  970. S.Add(Name+' = (')
  971. else
  972. S.Add('(');
  973. GetEnumNames(S);
  974. S[S.Count-1]:=S[S.Count-1]+')';
  975. If Full then
  976. Result:=IndentStrings(S,Length(Name)+4)
  977. else
  978. Result:=IndentStrings(S,1);
  979. finally
  980. S.Free;
  981. end;
  982. end;
  983. function TPasSetType.GetDeclaration (full : boolean) : string;
  984. Var
  985. S : TStringList;
  986. i : Integer;
  987. begin
  988. If EnumType is TPasEnumType then
  989. begin
  990. S:=TStringList.Create;
  991. Try
  992. If Full then
  993. S.Add(Name+'= Set of (')
  994. else
  995. S.Add('Set of (');
  996. TPasEnumType(EnumType).GetEnumNames(S);
  997. S[S.Count-1]:=S[S.Count-1]+')';
  998. I:=Pos('(',S[0]);
  999. Result:=IndentStrings(S,i);
  1000. finally
  1001. S.Free;
  1002. end;
  1003. end
  1004. else
  1005. begin
  1006. Result:='Set of '+EnumType.Name;
  1007. If Full then
  1008. Result:=Name+' = '+Result;
  1009. end;
  1010. end;
  1011. function TPasRecordType.GetDeclaration (full : boolean) : string;
  1012. Var
  1013. S,T : TStringList;
  1014. temp : string;
  1015. I,J : integer;
  1016. begin
  1017. S:=TStringList.Create;
  1018. T:=TstringList.Create;
  1019. Try
  1020. Temp:='record';
  1021. If IsPacked then
  1022. Temp:='packed '+Temp;
  1023. If Full then
  1024. Temp:=Name+' = '+Temp;
  1025. S.Add(Temp);
  1026. For I:=0 to Members.Count-1 do
  1027. begin
  1028. Temp:=TPasVariable(Members[i]).GetDeclaration(True);
  1029. If Pos(LineEnding,Temp)>0 then
  1030. begin
  1031. T.Text:=Temp;
  1032. For J:=0 to T.Count-1 do
  1033. if J=T.Count-1 then
  1034. S.Add(' '+T[J]+';')
  1035. else
  1036. S.Add(' '+T[J])
  1037. end
  1038. else
  1039. S.Add(' '+Temp+';');
  1040. end;
  1041. S.Add('end');
  1042. Result:=S.Text;
  1043. finally
  1044. S.free;
  1045. T.free;
  1046. end;
  1047. end;
  1048. procedure TPasProcedureType.GetArguments(List : TStrings);
  1049. Var
  1050. T : string;
  1051. I : Integer;
  1052. begin
  1053. For I:=0 to Args.Count-1 do
  1054. begin
  1055. T:=AccessNames[TPasArgument(Args[i]).Access];
  1056. T:=T+TPasArgument(Args[i]).GetDeclaration(True);
  1057. If I=0 then
  1058. T:='('+T;
  1059. If I<Args.Count-1 then
  1060. List.Add(T+';')
  1061. else
  1062. List.Add(T+')');
  1063. end;
  1064. end;
  1065. function TPasProcedureType.GetDeclaration (full : boolean) : string;
  1066. Var
  1067. S : TStringList;
  1068. begin
  1069. S:=TStringList.Create;
  1070. Try
  1071. If Full then
  1072. S.Add(Format('%s = ',[Name]));
  1073. S.Add(TypeName);
  1074. GetArguments(S);
  1075. If IsOfObject then
  1076. S.Add(' of object');
  1077. If Full then
  1078. Result:=IndentStrings(S,Length(S[0])+Length(S[1])+1)
  1079. else
  1080. Result:=IndentStrings(S,Length(S[0])+1);
  1081. finally
  1082. S.Free;
  1083. end;
  1084. end;
  1085. function TPasFunctionType.GetDeclaration (full : boolean) : string;
  1086. Var
  1087. S : TStringList;
  1088. T : string;
  1089. begin
  1090. S:=TStringList.Create;
  1091. Try
  1092. If Full then
  1093. S.Add(Format('%s = ',[Name]));
  1094. S.Add(TypeName);
  1095. GetArguments(S);
  1096. If Assigned(ResultEl) then
  1097. begin
  1098. T:=' : ';
  1099. If (ResultEl.ResultType.Name<>'') then
  1100. T:=T+ResultEl.ResultType.Name
  1101. else
  1102. T:=T+ResultEl.ResultType.GetDeclaration(False);
  1103. S.Add(T);
  1104. end;
  1105. If IsOfObject then
  1106. S.Add(' of object');
  1107. If Full then
  1108. Result:=IndentStrings(S,Length(S[0])+Length(S[1])+1)
  1109. else
  1110. Result:=IndentStrings(S,Length(S[0])+1);
  1111. finally
  1112. S.Free;
  1113. end;
  1114. end;
  1115. function TPasVariable.GetDeclaration (full : boolean) : string;
  1116. Const
  1117. Seps : Array[Boolean] of Char = ('=',':');
  1118. begin
  1119. If Assigned(VarType) then
  1120. begin
  1121. If VarType.Name='' then
  1122. Result:=VarType.GetDeclaration(False)
  1123. else
  1124. Result:=VarType.Name;
  1125. Result:=Result+Modifiers;
  1126. if (Value<>'') then
  1127. Result:=Result+' = '+Value;
  1128. end
  1129. else
  1130. Result:=Value;
  1131. If Full then
  1132. Result:=Name+' '+Seps[Assigned(VarType)]+' '+Result;
  1133. end;
  1134. function TPasProperty.GetDeclaration (full : boolean) : string;
  1135. Var
  1136. S : string;
  1137. I : Integer;
  1138. begin
  1139. If Assigned(VarType) then
  1140. begin
  1141. If VarType.Name='' then
  1142. Result:=VarType.GetDeclaration(False)
  1143. else
  1144. Result:=VarType.Name;
  1145. end
  1146. else
  1147. Result:=Value;
  1148. S:='';
  1149. If Assigned(Args) and (Args.Count>0) then
  1150. begin
  1151. For I:=0 to Args.Count-1 do
  1152. begin
  1153. If (S<>'') then
  1154. S:=S+';';
  1155. S:=S+TPasElement(Args[i]).GetDeclaration(true);
  1156. end;
  1157. end;
  1158. If S<>'' then
  1159. S:='['+S+']'
  1160. else
  1161. S:=' ';
  1162. If Full then
  1163. Result:=Name+S+': '+Result;
  1164. If IsDefault then
  1165. Result:=Result+'; default'
  1166. end;
  1167. Procedure TPasProcedure.GetModifiers(List : TStrings);
  1168. Procedure DoAdd(B : Boolean; S : string);
  1169. begin
  1170. if B then
  1171. List.add('; '+S);
  1172. end;
  1173. begin
  1174. Doadd(IsVirtual,' Virtual');
  1175. DoAdd(IsDynamic,' Dynamic');
  1176. DoAdd(IsOverride,' Override');
  1177. DoAdd(IsAbstract,' Abstract');
  1178. DoAdd(IsOverload,' Overload');
  1179. DoAdd(IsReintroduced,' Reintroduce');
  1180. DoAdd(IsStatic,' Static');
  1181. DoAdd(IsMessage,' Message');
  1182. end;
  1183. function TPasProcedure.GetDeclaration (full : boolean) : string;
  1184. Var
  1185. S : TStringList;
  1186. begin
  1187. S:=TStringList.Create;
  1188. try
  1189. If Full then
  1190. S.Add(TypeName+' '+Name);
  1191. ProcType.GetArguments(S);
  1192. GetModifiers(S);
  1193. Result:=IndentStrings(S,Length(S[0]));
  1194. finally
  1195. S.Free;
  1196. end;
  1197. end;
  1198. function TPasFunction.GetDeclaration (full : boolean) : string;
  1199. Var
  1200. S : TStringList;
  1201. T : string;
  1202. begin
  1203. S:=TStringList.Create;
  1204. try
  1205. If Full then
  1206. S.Add(TypeName+' '+Name);
  1207. ProcType.GetArguments(S);
  1208. If Assigned((Proctype as TPasFunctionType).ResultEl) then
  1209. With TPasFunctionType(ProcType).ResultEl.ResultType do
  1210. begin
  1211. T:=' : ';
  1212. If (Name<>'') then
  1213. T:=T+Name
  1214. else
  1215. T:=T+GetDeclaration(False);
  1216. S.Add(T);
  1217. end;
  1218. GetModifiers(S);
  1219. Result:=IndentStrings(S,Length(S[0]));
  1220. finally
  1221. S.Free;
  1222. end;
  1223. end;
  1224. function TPasOperator.GetDeclaration (full : boolean) : string;
  1225. Var
  1226. S : TStringList;
  1227. T : string;
  1228. begin
  1229. S:=TStringList.Create;
  1230. try
  1231. If Full then
  1232. S.Add(TypeName+' '+Name);
  1233. ProcType.GetArguments(S);
  1234. If Assigned((Proctype as TPasFunctionType).ResultEl) then
  1235. With TPasFunctionType(ProcType).ResultEl.ResultType do
  1236. begin
  1237. T:=' : ';
  1238. If (Name<>'') then
  1239. T:=T+Name
  1240. else
  1241. T:=T+GetDeclaration(False);
  1242. S.Add(T);
  1243. end;
  1244. GetModifiers(S);
  1245. Result:=IndentStrings(S,Length(S[0]));
  1246. finally
  1247. S.Free;
  1248. end;
  1249. end;
  1250. function TPasArgument.GetDeclaration (full : boolean) : string;
  1251. begin
  1252. If Assigned(ArgType) then
  1253. begin
  1254. If ArgType.Name<>'' then
  1255. Result:=ArgType.Name
  1256. else
  1257. Result:=ArgType.GetDeclaration(False);
  1258. If Full then
  1259. Result:=Name+': '+Result;
  1260. end
  1261. else If Full then
  1262. Result:=Name
  1263. else
  1264. Result:='';
  1265. end;
  1266. end.