webidldefs.pp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284
  1. {
  2. This file is part of the Free Component Library
  3. WEBIDL definition containers
  4. Copyright (c) 2018 by Michael Van Canneyt [email protected]
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit webidldefs;
  12. {$mode objfpc}{$H+}
  13. interface
  14. uses
  15. Classes, SysUtils, contnrs;
  16. Type
  17. { TAttributeList }
  18. TAttributeList = Class(TPersistent)
  19. private
  20. Fattrs: TStringList;
  21. function GetAttrs(aIndex : Integer): UTF8String;
  22. function GetCount: Integer;
  23. Public
  24. Constructor Create;
  25. Destructor destroy; override;
  26. Procedure Assign(aSource : TPersistent); override;
  27. Procedure Add(aAttribute : UTF8String);
  28. Function ToLine (ASep : String): UTF8String;
  29. Function AsString (Full : Boolean = False): UTF8String;
  30. Function IndexOf(Const aName : UTF8string) : Integer;
  31. Property Attrs[aIndex : Integer] : UTF8String Read GetAttrs; default;
  32. Property Count : Integer Read GetCount;
  33. end;
  34. { TIDLDefinition }
  35. TIDLDefinition = Class;
  36. TIDLTypeDefDefinition = Class;
  37. TIDLDefinitionClass = Class of TIDLDefinition;
  38. TIDLBaseObject = Class
  39. Public
  40. // The IDLBaseobject is owner of the newly created instance !
  41. Function Add(aClass : TIDLDefinitionClass; Const AName : UTF8String) : TIDLDefinition; virtual; abstract;
  42. Function AsString(Full : Boolean): UTF8String; virtual; abstract;
  43. end;
  44. TIDLDefinition = Class(TIDLBaseObject)
  45. private
  46. FAttributes: TAttributeList;
  47. FData: TObject;
  48. FName: UTF8String;
  49. FParent: TIDLDefinition;
  50. function GetAttributes: TAttributeList;
  51. procedure SetAttributes(AValue: TAttributeList);
  52. Public
  53. Constructor Create(aParent : TIDLDefinition;Const aName : UTF8String); virtual;
  54. Function Add(aClass : TIDLDefinitionClass; Const AName : UTF8String) : TIDLDefinition; override;
  55. Destructor Destroy; override;
  56. // This definition extens an existing one. It will not be in the lookup list of symbols
  57. Function IsExtension : Boolean; virtual;
  58. Function AsString(Full : Boolean): UTF8String; override;
  59. Function HasAttributes : Boolean;
  60. Function HasSimpleAttribute(Const AName : UTF8String) : Boolean;
  61. Property Name : UTF8String Read FName Write FName;
  62. Property Data : TObject Read FData Write FData;
  63. Property Parent : TIDLDefinition Read FParent Write FParent;
  64. // Attributes are owned by the definition. If you set it, your list will be freed by the definition
  65. Property Attributes : TAttributeList Read GetAttributes Write SetAttributes;
  66. end;
  67. { TIDLDefinitionList }
  68. TIDLDefinitionList = Class;
  69. { TIDLDefinitionEnumerator }
  70. TIDLDefinitionEnumerator = class
  71. private
  72. FList: TIDLDefinitionList;
  73. FPosition: Integer;
  74. public
  75. constructor Create(AList: TIDLDefinitionList);
  76. function GetCurrent: TIDLDefinition;
  77. function MoveNext: Boolean;
  78. property Current: TIDLDefinition read GetCurrent;
  79. end;
  80. TIDLDefinitionList = Class (TIDLBaseObject)
  81. private
  82. FList : TFPObjectList;
  83. FParent: TIDLDefinition;
  84. function GetCount: Integer;
  85. function GetD(aIndex : Integer): TIDLDefinition;
  86. function GetOwnsDefinitions: Boolean;
  87. Public
  88. Constructor Create(AParent : TIDLDefinition; OwnsDefinitions : Boolean = True); virtual; overload;
  89. Destructor Destroy; override;
  90. Procedure Clear;
  91. function AsString(const aSep, aStart, aEnd, aIndent: String; aFull,
  92. AppendSep: Boolean): UTF8String;
  93. Function AsString(Full : Boolean): UTF8String; override;
  94. Function Add(aClass : TIDLDefinitionClass; Const AName : UTF8String) : TIDLDefinition; override;
  95. Function Add(aItem : TIDLDefinition) : Integer;
  96. function GetEnumerator: TIDLDefinitionEnumerator;
  97. Property Parent : TIDLDefinition Read FParent;
  98. Property Definitions[aIndex : Integer] : TIDLDefinition Read GetD;default;
  99. Property Count : Integer Read GetCount;
  100. Property OwnsDefinitions : Boolean Read GetOwnsDefinitions;
  101. end;
  102. { TIDLConstDefinition }
  103. TConstType = (ctFloat,ctInteger,ctBoolean,ctInfinity,ctNegInfinity,ctNan,ctNull,ctString,ctEmptyArray,ctEmptyObject);
  104. TIDLConstDefinition = Class(TIDLDefinition)
  105. private
  106. FConstType: TConstType;
  107. FNull: Boolean;
  108. FTypeName: UTF8String;
  109. FValue: UTF8String;
  110. Public
  111. Function AsString(Full : Boolean): UTF8String; override;
  112. Property TypeName : UTF8String Read FTypeName Write FTypeName;
  113. Property Value : UTF8String Read FValue Write FValue;
  114. Property AllowNull : Boolean Read FNull Write FNull;
  115. Property ConstType : TConstType Read FConstType Write FConstType;
  116. end;
  117. TAttributeOption = (aoStatic,aoInherit,aoReadOnly,aoStringifier);
  118. TAttributeOptions = set of TAttributeOption;
  119. { TIDLAttributeDefinition }
  120. TIDLAttributeDefinition = Class(TIDLDefinition)
  121. private
  122. FOptions : TAttributeOptions;
  123. FType: TIDLTypeDefDefinition;
  124. procedure SetType(AValue: TIDLTypeDefDefinition);
  125. Public
  126. Destructor Destroy; override;
  127. Function AsString(Full : Boolean): UTF8String; override;
  128. // Owned by definition
  129. Property AttributeType : TIDLTypeDefDefinition Read FType Write SetType;
  130. Property Options : TAttributeOptions Read FOptions Write FOptions;
  131. end;
  132. { TIDLStructuredDefinition }
  133. TIDLStructuredDefinition = Class(TIDLDefinition)
  134. Private
  135. FIsCallBack: Boolean;
  136. FPartials,
  137. FMembers: TIDLDefinitionList;
  138. FParentName: String;
  139. FPartial: Boolean;
  140. function GetMember(Aindex : Integer): TIDLDefinition;
  141. function GetMembers: TIDLDefinitionList;
  142. function GetPartial(Aindex : Integer): TIDLStructuredDefinition;
  143. function GetPartials: TIDLDefinitionList;
  144. Public
  145. Destructor Destroy; override;
  146. Function IsExtension : Boolean; override;
  147. Function GetFullMemberList(aList : TIDLDefinitionList) : Integer;
  148. Function HasMembers : Boolean;
  149. // Members are owned by this instance.
  150. Property members : TIDLDefinitionList Read GetMembers;
  151. Property Member[Aindex : Integer] : TIDLDefinition Read GetMember; default;
  152. Function HasPartials : Boolean;
  153. // Partials are NOT owned by this instance
  154. Property Partials : TIDLDefinitionList Read GetPartials;
  155. Property Partial[Aindex : Integer] : TIDLStructuredDefinition Read GetPartial;
  156. Property ParentName : String Read FParentName Write FParentName;
  157. // is this a partial definition?
  158. Property IsPartial : Boolean Read FPartial Write FPartial;
  159. // is this a callback definition?
  160. Property IsCallBack : Boolean Read FIsCallBack Write FIsCallBack;
  161. end;
  162. { TIDLInterfaceDefinition }
  163. TIDLInterfaceDefinition = Class(TIDLStructuredDefinition)
  164. private
  165. FHasSerializer: Boolean;
  166. FIsInclude: Boolean;
  167. FIsMixin: Boolean;
  168. FParentInterface: TIDLInterfaceDefinition;
  169. Public
  170. Function AsString (aFull : Boolean) : UTF8String; override;
  171. Property ParentInterface : TIDLInterfaceDefinition Read FParentInterface Write FParentInterface;
  172. Property HasSerializer : Boolean Read FHasSerializer Write FHasSerializer;
  173. // is this a mixin definition?
  174. Property IsMixin : Boolean Read FIsMixin Write FIsMixin;
  175. Property IsInclude : Boolean Read FIsInclude Write FIsInclude;
  176. end;
  177. { TIDLArgumentDefinition }
  178. TIDLArgumentDefinition = Class(TIDLDefinition)
  179. private
  180. FDefaultValue: String;
  181. FHasDefaultValue: Boolean;
  182. FHasEllipsis: Boolean;
  183. FIsOptional: Boolean;
  184. FType: TIDLTypeDefDefinition;
  185. procedure SetType(AValue: TIDLTypeDefDefinition);
  186. Public
  187. Destructor Destroy; override;
  188. Function Clone(aType : TIDLTypeDefDefinition) : TIDLArgumentDefinition; // need
  189. Function AsString(Full : Boolean) : UTF8String; override;
  190. // Owned by definition
  191. Property ArgumentType : TIDLTypeDefDefinition Read FType Write SetType;
  192. Property IsOptional : Boolean Read FIsOptional Write FIsOptional;
  193. Property HasDefaultValue : Boolean Read FHasDefaultValue Write FHasDefaultValue;
  194. Property HasEllipsis : Boolean Read FHasEllipsis Write FHasEllipsis;
  195. Property DefaultValue : String Read FDefaultValue Write FDefaultValue;
  196. end;
  197. { TIDLFunctionDefinition }
  198. TFunctionOption = (foCallBack,foStatic,foStringifier,foGetter, foSetter, foDeleter, foLegacyCaller, foConstructor);
  199. TFunctionOptions = Set of TFunctionOption;
  200. TIDLFunctionDefinition = Class(TIDLDefinition)
  201. private
  202. FOptions : TFunctionOptions;
  203. FReturnType: TIDLTypeDefDefinition;
  204. Farguments: TIDLDefinitionList;
  205. function GetA(AIndex : Integer): TIDLArgumentDefinition;
  206. function GetArguments: TIDLDefinitionList;
  207. procedure SetReturnType(AValue: TIDLTypeDefDefinition);
  208. Public
  209. Destructor Destroy; override;
  210. Function HasArguments : Boolean;
  211. Function AsString(Full : Boolean) : UTF8String; override;
  212. Property Arguments : TIDLDefinitionList Read GetArguments;
  213. Property Argument[AIndex : Integer] : TIDLArgumentDefinition Read GetA; default;
  214. // Owned by function definition.
  215. Property ReturnType : TIDLTypeDefDefinition Read FReturnType Write SetReturnType;
  216. // is this a callback function definition?
  217. Property Options : TFunctionOptions Read FOptions Write FOptions;
  218. end;
  219. TSerializerKind = (skObject,skArray,skSingle,skFunction);
  220. { TIDLSerializerDefinition }
  221. TIDLSerializerDefinition = Class(TIDLDefinition)
  222. private
  223. FKind: TSerializerKind;
  224. FIdentifiers : TAttributeList;
  225. FSerializerFunction: TIDLFunctionDefinition;
  226. procedure SetIdentifierList(AValue: TAttributeList);
  227. Procedure SetSerializerFunction (aValue : TIDLFunctionDefinition);
  228. function GetIdentifierList: TAttributeList;
  229. Public
  230. Destructor Destroy; override;
  231. Function HasIdentifiers : Boolean;
  232. Property Identifiers : TAttributeList Read GetIdentifierList Write SetIDentifierList;
  233. Property SerializerFunction : TIDLFunctionDefinition Read FSerializerFunction Write SetSerializerFunction;
  234. Property Kind : TSerializerKind Read FKind Write FKind;
  235. end;
  236. { TIDLDictionaryMemberDefinition }
  237. TIDLDictionaryMemberDefinition = Class(TIDLDefinition)
  238. private
  239. FDefaultValue: TIDLConstDefinition;
  240. FMemberType: TIDLTypeDefDefinition;
  241. FRequired: Boolean;
  242. Public
  243. Destructor Destroy; override;
  244. Function AsString(Full : Boolean) : UTF8String; override;
  245. Property IsRequired : Boolean Read FRequired Write FRequired;
  246. // Owned by memberdefinition
  247. Property MemberType : TIDLTypeDefDefinition Read FMemberType Write FMemberType;
  248. Property DefaultValue : TIDLConstDefinition Read FDefaultValue Write FDefaultValue;
  249. end;
  250. { TIDLDictionaryDefinition }
  251. TIDLDictionaryDefinition = Class(TIDLStructuredDefinition)
  252. private
  253. FParentDictionary: TIDLDictionaryDefinition;
  254. function GetDM(AIndex : Integer): TIDLDictionaryMemberDefinition;
  255. Public
  256. Function AsString(Full : Boolean) : UTF8String; override;
  257. Property ParentDictionary : TIDLDictionaryDefinition Read FParentDictionary Write FParentDictionary;
  258. Property DictionaryMembers[AIndex : Integer] : TIDLDictionaryMemberDefinition Read GetDM; default;
  259. end;
  260. { TIDLEnumDefinition }
  261. TIDLEnumDefinition = Class(TIDLDefinition)
  262. private
  263. FValues: TStrings;
  264. Public
  265. Constructor Create(aParent : TIDLDefinition;Const aName : UTF8String); override;
  266. Destructor Destroy; override;
  267. Procedure AddValue(Const aValue : String);
  268. Property Values : TStrings Read FValues;
  269. end;
  270. { TIDLTypeDefDefinition }
  271. TIDLTypeDefDefinition = Class(TIDLDefinition)
  272. private
  273. FNull: Boolean;
  274. FTypeName: String;
  275. Public
  276. Function Clone (aParent : TIDLDefinition) : TIDLTypeDefDefinition; virtual;
  277. Function AsString(Full: Boolean): UTF8String; override;
  278. Property TypeName : String Read FTypeName Write FTypeName;
  279. Property AllowNull : Boolean Read FNull Write FNull;
  280. end;
  281. TIDLTypeDefDefinitionClass = Class of TIDLTypeDefDefinition;
  282. { TIDLPromiseTypeDefDefinition }
  283. TIDLPromiseTypeDefDefinition = Class(TIDLTypeDefDefinition)
  284. private
  285. FReturnType: TIDLTypeDefDefinition;
  286. procedure SetReturnType(AValue: TIDLTypeDefDefinition);
  287. Public
  288. Destructor Destroy; override;
  289. Function Clone (aParent : TIDLDefinition) : TIDLTypeDefDefinition; override;
  290. Function AsString(Full: Boolean): UTF8String; override;
  291. property ReturnType : TIDLTypeDefDefinition Read FReturnType Write SetReturnType;
  292. end;
  293. { TIDLMapLikeDefinition }
  294. { TIDLKeyValueDefinition }
  295. TIDLKeyValueDefinition = Class(TIDLTypeDefDefinition)
  296. private
  297. FKeyType: TIDLTypeDefDefinition;
  298. FValueType: TIDLTypeDefDefinition;
  299. procedure SetKeyType(AValue: TIDLTypeDefDefinition);
  300. procedure SetValueType(AValue: TIDLTypeDefDefinition);
  301. Public
  302. Destructor Destroy; override;
  303. Function Clone (aParent : TIDLDefinition) : TIDLTypeDefDefinition; override;
  304. property KeyType : TIDLTypeDefDefinition Read FKeyType Write SetKeyType;
  305. property ValueType : TIDLTypeDefDefinition Read FValueType Write SetValueType;
  306. end;
  307. TIDLMapLikeDefinition = Class(TIDLKeyValueDefinition)
  308. private
  309. FIsReadonly: Boolean;
  310. Public
  311. Function Clone (aParent : TIDLDefinition) : TIDLTypeDefDefinition; override;
  312. Function AsString(Full: Boolean): UTF8String; override;
  313. property IsReadonly: Boolean Read FIsReadonly Write FIsReadonly;
  314. end;
  315. { TIDLRecordDefinition }
  316. TIDLRecordDefinition = Class(TIDLKeyValueDefinition)
  317. Public
  318. Function AsString(Full: Boolean): UTF8String; override;
  319. end;
  320. { TIDLSequenceTypeDefDefinition }
  321. TIDLSequenceTypeDefDefinition = Class(TIDLTypeDefDefinition)
  322. private
  323. FElementType: TIDLTypeDefDefinition;
  324. procedure SetElementType(AValue: TIDLTypeDefDefinition);
  325. Public
  326. Function AsString(Full: Boolean): UTF8String; override;
  327. Function Clone (aParent : TIDLDefinition) : TIDLTypeDefDefinition; override;
  328. Destructor Destroy; override;
  329. property ElementType : TIDLTypeDefDefinition Read FElementType Write SetElementType;
  330. end;
  331. { TIDLSetlikeDefinition }
  332. TIDLSetlikeDefinition = Class(TIDLDefinition)
  333. private
  334. FElementType: TIDLTypeDefDefinition;
  335. FIsReadonly: Boolean;
  336. procedure SetElementType(AValue: TIDLTypeDefDefinition);
  337. Public
  338. Function AsString(Full: Boolean): UTF8String; override;
  339. Destructor Destroy; override;
  340. property ElementType : TIDLTypeDefDefinition Read FElementType Write SetElementType;
  341. property IsReadonly: Boolean Read FIsReadonly Write FIsReadonly;
  342. end;
  343. { TIDLUnionTypeDefDefinition }
  344. TIDLUnionTypeDefDefinition = Class(TIDLTypeDefDefinition)
  345. private
  346. FUnion: TIDLDefinitionList;
  347. Public
  348. Constructor Create(aParent : TIDLDefinition;Const aName : UTF8String); override;
  349. Destructor Destroy; override;
  350. Function Clone (aParent : TIDLDefinition) : TIDLTypeDefDefinition; override;
  351. Function AsString(Full: Boolean): UTF8String; override;
  352. property Union : TIDLDefinitionList Read FUnion;
  353. end;
  354. { TIDLImplementsDefinition }
  355. TIDLImplementsOrIncludesDefinition = Class(TIDLDefinition);
  356. TIDLImplementsDefinition = Class(TIDLImplementsOrIncludesDefinition)
  357. private
  358. FImplementedInterface: UTF8String;
  359. Public
  360. Function IsExtension : Boolean; override;
  361. Function AsString(Full: Boolean): UTF8String; override;
  362. Property ImplementedInterface : UTF8String Read FImplementedInterface Write FImplementedInterface;
  363. end;
  364. { TIDLIncludesDefinition }
  365. TIDLIncludesDefinition = Class(TIDLImplementsOrIncludesDefinition)
  366. private
  367. FIncludedInterface : UTF8String;
  368. Public
  369. Function IsExtension : Boolean; override;
  370. Function AsString(Full: Boolean): UTF8String; override;
  371. Property IncludedInterface : UTF8String Read FIncludedInterface Write FIncludedInterface;
  372. end;
  373. { TIDLIterableDefinition }
  374. TIDLIterableDefinition = Class(TIDLDefinition)
  375. private
  376. FValueType: TIDLTypeDefDefinition;
  377. FKeyType: TIDLTypeDefDefinition;
  378. procedure SetKeyType(AValue: TIDLTypeDefDefinition);
  379. procedure SetValueType(AValue: TIDLTypeDefDefinition);
  380. Public
  381. Destructor Destroy; override;
  382. property ValueType : TIDLTypeDefDefinition Read FValueType Write SetValueType;
  383. property KeyType : TIDLTypeDefDefinition Read FKeyType Write SetKeyType;
  384. end;
  385. implementation
  386. { TIDLSetlikeDefinition }
  387. procedure TIDLSetlikeDefinition.SetElementType(
  388. AValue: TIDLTypeDefDefinition);
  389. begin
  390. if FElementType=AValue then Exit;
  391. FreeAndNil(FElementType);
  392. FElementType:=AValue;
  393. if Assigned(FElementType) then
  394. FElementType.Parent:=Self
  395. end;
  396. function TIDLSetlikeDefinition.AsString(Full: Boolean): UTF8String;
  397. begin
  398. Result:='setlike <'+ElementType.TypeName+'>';
  399. if IsReadonly then
  400. Result:='readonly '+Result;
  401. if full and HasAttributes then
  402. Result:=Attributes.AsString(True)+' '+Result;
  403. end;
  404. destructor TIDLSetlikeDefinition.Destroy;
  405. begin
  406. FreeAndNil(FElementType);
  407. inherited Destroy;
  408. end;
  409. { TIDLRecordDefinition }
  410. function TIDLRecordDefinition.AsString(Full: Boolean): UTF8String;
  411. begin
  412. Result:='record <'+KeyType.AsString(False)+','+ValueType.AsString(False)+'>';
  413. if AllowNull then
  414. Result:=Result+'?';
  415. if Full then
  416. begin
  417. Result:='typedef '+Result;
  418. if HasAttributes then
  419. Result:=Attributes.AsString(True)+' '+Result;
  420. end;
  421. end;
  422. { TIDLMapLikeDefinition }
  423. procedure TIDLKeyValueDefinition.SetKeyType(AValue: TIDLTypeDefDefinition);
  424. begin
  425. if FKeyType=AValue then Exit;
  426. FreeAndNil(FKeyType);
  427. FKeyType:=AValue;
  428. if Assigned(FKeyType) then
  429. FKeyType.Parent:=Self
  430. end;
  431. procedure TIDLKeyValueDefinition.SetValueType(AValue: TIDLTypeDefDefinition);
  432. begin
  433. if FValueType=AValue then Exit;
  434. FreeAndNil(FValueType);
  435. FValueType:=AValue;
  436. if Assigned(FValueType) then
  437. FValueType.Parent:=Self
  438. end;
  439. destructor TIDLKeyValueDefinition.Destroy;
  440. begin
  441. FreeAndNil(FKeyType);
  442. FreeAndNil(FValueType);
  443. inherited Destroy;
  444. end;
  445. function TIDLKeyValueDefinition.Clone(aParent: TIDLDefinition
  446. ): TIDLTypeDefDefinition;
  447. begin
  448. Result:=inherited Clone(aParent);
  449. if Assigned(KeyType) then
  450. TIDLKeyValueDefinition(Result).KeyType:=KeyType.Clone(Result);
  451. if Assigned(ValueType) then
  452. TIDLKeyValueDefinition(Result).ValueType:=ValueType.Clone(Result);
  453. end;
  454. function TIDLMapLikeDefinition.Clone(aParent: TIDLDefinition
  455. ): TIDLTypeDefDefinition;
  456. begin
  457. Result:=inherited Clone(aParent);
  458. TIDLMapLikeDefinition(Result).IsReadonly:=IsReadonly;
  459. end;
  460. function TIDLMapLikeDefinition.AsString(Full: Boolean): UTF8String;
  461. begin
  462. Result:='maplike <'+KeyType.AsString(False)+','+ValueType.AsString(False)+'>';
  463. if IsReadonly then
  464. Result:='readonly '+Result;
  465. if Full and HasAttributes then
  466. Result:=Attributes.AsString(True)+' '+Result;
  467. end;
  468. { TIDLIncludesDefinition }
  469. function TIDLIncludesDefinition.IsExtension: Boolean;
  470. begin
  471. Result:=True;
  472. end;
  473. function TIDLIncludesDefinition.AsString(Full: Boolean): UTF8String;
  474. begin
  475. Result:=Name+' includes '+IncludedInterface;
  476. If Full and HasAttributes then
  477. Result:=Attributes.AsString(True)+' '+Result;
  478. end;
  479. { TIDLDefinitionEnumerator }
  480. constructor TIDLDefinitionEnumerator.Create(AList: TIDLDefinitionList);
  481. begin
  482. FList:=AList;
  483. FPosition:=-1;
  484. end;
  485. function TIDLDefinitionEnumerator.GetCurrent: TIDLDefinition;
  486. begin
  487. Result := FList[FPosition];
  488. end;
  489. function TIDLDefinitionEnumerator.MoveNext: Boolean;
  490. begin
  491. Inc(FPosition);
  492. Result := FPosition < FList.Count;
  493. end;
  494. { TIDLInterfaceDefinition }
  495. function TIDLInterfaceDefinition.AsString(aFull: Boolean): UTF8String;
  496. begin
  497. Result:='interface '+Name;
  498. if IsPartial then
  499. Result:='partial '+Result
  500. else if IsCallBack then
  501. Result:='callback '+Result;
  502. if ParentName<>'' then
  503. Result:=Result+' : '+ParentName;
  504. if Not HasMembers then
  505. Result:=Result+' {'+sLineBreak+'}'
  506. else
  507. Result:=Result+' '+members.AsString(true);
  508. if aFull and HasAttributes then
  509. Result:=Attributes.AsString(true)+' '+Result;
  510. end;
  511. { TIDLTypeDefDefinition }
  512. function TIDLTypeDefDefinition.Clone(aParent: TIDLDefinition): TIDLTypeDefDefinition;
  513. begin
  514. Result:=TIDLTypeDefDefinitionClass(Self.ClassType).Create(aParent,Name);
  515. Result.TypeName:=Self.TypeName;
  516. end;
  517. function TIDLTypeDefDefinition.AsString(Full: Boolean): UTF8String;
  518. begin
  519. Result:=TypeName;
  520. if AllowNull then
  521. Result:=Result+'?';
  522. If Full then
  523. begin
  524. Result:='typedef '+Result+' '+Name;
  525. if HasAttributes then
  526. Result:=Attributes.AsString(True)+' '+Result;
  527. end;
  528. end;
  529. { TIDLImplementsDefinition }
  530. function TIDLImplementsDefinition.IsExtension: Boolean;
  531. begin
  532. Result:=True;
  533. end;
  534. function TIDLImplementsDefinition.AsString(Full: Boolean): UTF8String;
  535. begin
  536. Result:=Name+' implements '+ImplementedInterface;
  537. If Full and HasAttributes then
  538. Result:=Attributes.AsString(True)+' '+Result;
  539. end;
  540. { TIDLConstDefinition }
  541. function TIDLConstDefinition.AsString(Full: Boolean): UTF8String;
  542. begin
  543. Result:=TypeName+' '+Name+' '+Value;
  544. If Full then
  545. begin
  546. Result:='const '+Result;
  547. if HasAttributes then
  548. Result:=Attributes.AsString(True)+' '+Result;
  549. end;
  550. end;
  551. { TIDLSerializerDefinition }
  552. procedure TIDLSerializerDefinition.SetSerializerFunction(aValue: TIDLFunctionDefinition);
  553. begin
  554. if (FSerializerFunction=aValue) then exit;
  555. FreeAndNil(FSerializerFunction);
  556. FSerializerFunction:=aValue;
  557. if AValue<>Nil then
  558. Kind:=skFunction;
  559. end;
  560. procedure TIDLSerializerDefinition.SetIdentifierList(AValue: TAttributeList);
  561. begin
  562. If (FIdentifiers=AValue) then
  563. exit;
  564. FreeAndNil(FAttributes);
  565. FAttributes:=AValue;
  566. end;
  567. function TIDLSerializerDefinition.GetIdentifierList: TAttributeList;
  568. begin
  569. If FIdentifiers=Nil then
  570. FIdentifiers:=TAttributeList.Create;
  571. Result:=FIdentifiers;
  572. end;
  573. destructor TIDLSerializerDefinition.Destroy;
  574. begin
  575. FreeAndNil(FIdentifiers);
  576. FreeAndNil(FSerializerFunction);
  577. inherited Destroy;
  578. end;
  579. function TIDLSerializerDefinition.HasIdentifiers: Boolean;
  580. begin
  581. Result:=Assigned(FIdentifiers) and (FIdentifiers.Count>0);
  582. end;
  583. { TIDLIterableDefinition }
  584. procedure TIDLIterableDefinition.SetKeyType(AValue: TIDLTypeDefDefinition);
  585. begin
  586. if (AValue=FKeyType) then exit;
  587. FreeAndNil(FKeyType);
  588. FKeyType:=AValue;
  589. end;
  590. procedure TIDLIterableDefinition.SetValueType(AValue: TIDLTypeDefDefinition);
  591. begin
  592. if (AValue=FValueType) then exit;
  593. FreeAndNil(FValueType);
  594. FValueType:=AValue;
  595. end;
  596. destructor TIDLIterableDefinition.Destroy;
  597. begin
  598. ValueType:=Nil;
  599. KeyType:=Nil;
  600. inherited Destroy;
  601. end;
  602. { TIDLAttributeDefinition }
  603. procedure TIDLAttributeDefinition.SetType(AValue: TIDLTypeDefDefinition);
  604. begin
  605. If (AValue=FType) then exit;
  606. FreeAndNil(FType);
  607. FType:=AValue;
  608. end;
  609. destructor TIDLAttributeDefinition.Destroy;
  610. begin
  611. AttributeType:=Nil;
  612. inherited Destroy;
  613. end;
  614. function TIDLAttributeDefinition.AsString(Full: Boolean): UTF8String;
  615. begin
  616. Result:=Name;
  617. if Assigned(AttributeType) then
  618. Result:=AttributeType.TypeName+' '+Result;
  619. if Full then
  620. begin
  621. Result:='attribute '+Result;
  622. if (aoReadonly in Options) then
  623. Result:='readonly '+Result;
  624. if (aoInherit in Options) then
  625. Result:='inherit '+Result;
  626. if (aoStatic in Options) then
  627. Result:='static '+Result;
  628. if (aoStringifier in Options) then
  629. Result:='stringifier '+Result;
  630. if HasAttributes then
  631. Result:=Attributes.AsString(True)+' '+Result;
  632. end;
  633. end;
  634. { TIDLArgumentDefinition }
  635. procedure TIDLArgumentDefinition.SetType(AValue: TIDLTypeDefDefinition);
  636. begin
  637. if FType=AValue then Exit;
  638. FreeAndNil(FType);
  639. FType:=AValue;
  640. end;
  641. destructor TIDLArgumentDefinition.Destroy;
  642. begin
  643. ArgumentType:=Nil;
  644. inherited Destroy;
  645. end;
  646. function TIDLArgumentDefinition.Clone(aType: TIDLTypeDefDefinition): TIDLArgumentDefinition;
  647. begin
  648. Result:=TIDLArgumentDefinition.Create(Nil,Self.Name);
  649. if (AType=Nil) and Assigned(ArgumentType) then
  650. begin
  651. AType:=ArgumentType.Clone(Result);
  652. AType.TypeName:=Self.ArgumentType.TypeName;
  653. end;
  654. Result.ArgumentType:=aType;
  655. end;
  656. function TIDLArgumentDefinition.AsString(Full: Boolean): UTF8String;
  657. begin
  658. Result:=ArgumentType.AsString(False)+' '+Name;
  659. If IsOptional then
  660. Result:='optional '+Result;
  661. if HasDefaultValue then
  662. if DefaultValue='' then
  663. Result:=Result+' = ""'
  664. else
  665. Result:=Result+' = '+DefaultValue;
  666. if Full and HasAttributes then
  667. Result:=Attributes.AsString(True)+' '+Result;
  668. end;
  669. { TIDLFunctionDefinition }
  670. procedure TIDLFunctionDefinition.SetReturnType(AValue: TIDLTypeDefDefinition);
  671. begin
  672. if FReturnType=AValue then Exit;
  673. FreeAndNil(FReturnType);
  674. FReturnType:=AValue;
  675. end;
  676. function TIDLFunctionDefinition.GetArguments: TIDLDefinitionList;
  677. begin
  678. if FArguments=nil then
  679. Farguments:=TIDLDefinitionList.Create(Self);
  680. Result:=Farguments;
  681. end;
  682. function TIDLFunctionDefinition.GetA(AIndex : Integer): TIDLArgumentDefinition;
  683. begin
  684. Result:=Arguments[AIndex] as TIDLArgumentDefinition;
  685. end;
  686. destructor TIDLFunctionDefinition.Destroy;
  687. begin
  688. FreeAndNil(FArguments);
  689. ReturnType:=nil;
  690. inherited Destroy;
  691. end;
  692. function TIDLFunctionDefinition.HasArguments: Boolean;
  693. begin
  694. Result:=Assigned(FArguments) and (FArguments.Count>0);
  695. end;
  696. function TIDLFunctionDefinition.AsString(Full: Boolean): UTF8String;
  697. Procedure MaybeAdd(O : TFunctionOption; S : String);
  698. begin
  699. if O in options then
  700. Result:=S+' '+Result;
  701. end;
  702. begin
  703. if foCallBack in Options then
  704. Result:=Name+' = '+ReturnType.AsString(False)
  705. else
  706. Result:=ReturnType.AsString(False)+' '+Name;
  707. Result:=Result+' '+Arguments.AsString(', ','(',')','',True,False);
  708. MaybeAdd(foCallback,'callback');
  709. MaybeAdd(foStatic,'static');
  710. MaybeAdd(foGetter,'getter');
  711. MaybeAdd(foSetter,'setter');
  712. MaybeAdd(foDeleter,'deleter');
  713. MaybeAdd(foStringifier,'stringifier');
  714. if Full and HasAttributes then
  715. Result:=Attributes.AsString(Full)+' '+Result;
  716. end;
  717. { TIDLDictionaryDefinition }
  718. function TIDLDictionaryDefinition.GetDM(AIndex : Integer
  719. ): TIDLDictionaryMemberDefinition;
  720. begin
  721. Result:=Members[aIndex] as TIDLDictionaryMemberDefinition;
  722. end;
  723. function TIDLDictionaryDefinition.AsString(Full: Boolean): UTF8String;
  724. begin
  725. Result:='dictionary '+Name;
  726. if (ParentName<>'') then
  727. Result:=Result+' : '+ParentName;
  728. if Not HasMembers then
  729. Result:=Result+' {'+sLineBreak+'}'
  730. else
  731. Result:=Result+' '+members.AsString(true);
  732. if Full and HasAttributes then
  733. Result:=Attributes.AsString(True)+' '+Result
  734. end;
  735. { TIDLDictionaryMemberDefinition }
  736. destructor TIDLDictionaryMemberDefinition.Destroy;
  737. begin
  738. FreeAndNil(FMemberType);
  739. FreeAndNil(FDefaultValue);
  740. inherited Destroy;
  741. end;
  742. function TIDLDictionaryMemberDefinition.AsString(Full: Boolean): UTF8String;
  743. begin
  744. Result:=MemberType.AsString(False)+' '+Name;
  745. if IsRequired then
  746. Result:='required '+Result;
  747. If DefaultValue<>Nil then
  748. Result:=Result+' = '+DefaultValue.Value;
  749. if Full and HasAttributes then
  750. Result:=Attributes.AsString(True)+' '+Result;
  751. end;
  752. { TIDLSequenceTypeDefDefinition }
  753. procedure TIDLSequenceTypeDefDefinition.SetElementType(
  754. AValue: TIDLTypeDefDefinition);
  755. begin
  756. if FElementType=AValue then Exit;
  757. FreeAndNil(FElementType);
  758. FElementType:=AValue;
  759. if Assigned(FElementType) then
  760. FElementType.Parent:=Self
  761. end;
  762. function TIDLSequenceTypeDefDefinition.AsString(Full: Boolean): UTF8String;
  763. begin
  764. if Full then
  765. Result:='typedef sequence <'+ElementType.TypeName+'> '+Name
  766. else
  767. Result:='sequence <'+ElementType.TypeName+'>';
  768. if full and HasAttributes then
  769. Result:=Attributes.AsString(True)+' '+Result;
  770. end;
  771. function TIDLSequenceTypeDefDefinition.Clone(aParent: TIDLDefinition
  772. ): TIDLTypeDefDefinition;
  773. begin
  774. Result:=inherited Clone(aParent);
  775. if Assigned(ElementType) then
  776. TIDLSequenceTypeDefDefinition(Result).ElementType:=ElementType.Clone(Result);
  777. end;
  778. destructor TIDLSequenceTypeDefDefinition.Destroy;
  779. begin
  780. ElementType:=nil;
  781. inherited Destroy;
  782. end;
  783. { TIDLPromiseTypeDefDefinition }
  784. procedure TIDLPromiseTypeDefDefinition.SetReturnType(AValue: TIDLTypeDefDefinition);
  785. begin
  786. if FReturnType=AValue then Exit;
  787. FreeAndNil(FReturnType);
  788. FReturnType:=AValue;
  789. end;
  790. destructor TIDLPromiseTypeDefDefinition.Destroy;
  791. begin
  792. ReturnType:=Nil;
  793. inherited Destroy;
  794. end;
  795. function TIDLPromiseTypeDefDefinition.Clone(aParent: TIDLDefinition
  796. ): TIDLTypeDefDefinition;
  797. begin
  798. Result:=inherited Clone(aParent);
  799. if Assigned(ReturnType) then
  800. TIDLPromiseTypeDefDefinition(Result).ReturnType:=ReturnType.Clone(Result);
  801. end;
  802. function TIDLPromiseTypeDefDefinition.AsString(Full: Boolean): UTF8String;
  803. begin
  804. Result:='promise <'+ReturnType.AsString(False)+'>';
  805. if AllowNull then
  806. Result:=Result+'?';
  807. if Full then
  808. begin
  809. Result:='typedef '+Result+' '+Name;
  810. If HasAttributes then
  811. Result:=Attributes.AsString(True)+' '+Result;
  812. end;
  813. end;
  814. { TIDLUnionTypeDefDefinition }
  815. constructor TIDLUnionTypeDefDefinition.Create(aParent: TIDLDefinition;
  816. const aName: UTF8String);
  817. begin
  818. inherited Create(aParent, aName);
  819. FUnion:=TIDLDefinitionList.Create(Self,True);
  820. end;
  821. destructor TIDLUnionTypeDefDefinition.Destroy;
  822. begin
  823. FreeAndNil(FUnion);
  824. inherited Destroy;
  825. end;
  826. function TIDLUnionTypeDefDefinition.Clone(aParent: TIDLDefinition
  827. ): TIDLTypeDefDefinition;
  828. Var
  829. D : TIDLDefinition;
  830. begin
  831. Result:=inherited Clone(aParent);
  832. For D in Union do
  833. if D is TIDLTypeDefDefinition then
  834. TIDLUnionTypeDefDefinition(Result).Union.Add(TIDLTypeDefDefinition(D).Clone(Result));
  835. end;
  836. function TIDLUnionTypeDefDefinition.AsString(Full: Boolean): UTF8String;
  837. begin
  838. Result:=Union.AsString(' or ','(',')','',false,False);
  839. if Full then
  840. begin
  841. Result:='typedef '+Result+' '+Name;
  842. if HasAttributes then
  843. Result:=Attributes.AsString(True)+' '+Result;
  844. end;
  845. end;
  846. { TIDLEnumDefinition }
  847. constructor TIDLEnumDefinition.Create(aParent: TIDLDefinition;
  848. const aName: UTF8String);
  849. begin
  850. inherited Create(aParent, aName);
  851. FValues:=TStringList.Create;
  852. end;
  853. destructor TIDLEnumDefinition.Destroy;
  854. begin
  855. FreeAndNil(FValues);
  856. inherited Destroy;
  857. end;
  858. procedure TIDLEnumDefinition.AddValue(const aValue: String);
  859. begin
  860. FValues.Add(aValue);
  861. end;
  862. { TIDLInterfaceDefinition }
  863. function TIDLStructuredDefinition.GetMembers: TIDLDefinitionList;
  864. begin
  865. if Not Assigned(FMembers) then
  866. FMembers:=TIDLDefinitionList.Create(Self);
  867. Result:=FMembers;
  868. end;
  869. function TIDLStructuredDefinition.GetMember(Aindex : Integer): TIDLDefinition;
  870. begin
  871. Result:=Members[AIndex] as TIDLDefinition;
  872. end;
  873. function TIDLStructuredDefinition.GetPartial(Aindex : Integer
  874. ): TIDLStructuredDefinition;
  875. begin
  876. Result:=Partials[AIndex] as TIDLStructuredDefinition;
  877. end;
  878. function TIDLStructuredDefinition.GetPartials: TIDLDefinitionList;
  879. begin
  880. if Not Assigned(FPartials) then
  881. FPartials:=TIDLDefinitionList.Create(Self,False);
  882. Result:=FPartials;
  883. end;
  884. destructor TIDLStructuredDefinition.Destroy;
  885. begin
  886. FreeAndNil(FMembers);
  887. FreeAndNil(FPartials);
  888. inherited Destroy;
  889. end;
  890. function TIDLStructuredDefinition.IsExtension: Boolean;
  891. begin
  892. Result:=IsPartial;
  893. end;
  894. function TIDLStructuredDefinition.GetFullMemberList(aList: TIDLDefinitionList): Integer;
  895. Var
  896. D : TIDLDefinition;
  897. begin
  898. Result:=aList.Count;
  899. For D in Members do
  900. aList.Add(D);
  901. Result:=aList.Count-Result;
  902. For D in Partials do
  903. Result:=Result+(D as TIDLStructuredDefinition).GetFullMemberList(aList);
  904. end;
  905. function TIDLStructuredDefinition.HasMembers: Boolean;
  906. begin
  907. Result:=Assigned(FMembers) and (FMembers.Count>0)
  908. end;
  909. function TIDLStructuredDefinition.HasPartials: Boolean;
  910. begin
  911. Result:=Assigned(FPartials) and (FPartials.Count>0);
  912. end;
  913. { TAttributeList }
  914. function TAttributeList.GetAttrs(aIndex : Integer): UTF8String;
  915. begin
  916. Result:=FAttrs[aIndex];
  917. end;
  918. function TAttributeList.GetCount: Integer;
  919. begin
  920. Result:=FAttrs.Count;
  921. end;
  922. constructor TAttributeList.Create;
  923. begin
  924. Fattrs:=TStringList.Create;
  925. end;
  926. destructor TAttributeList.destroy;
  927. begin
  928. FreeAndNil(Fattrs);
  929. inherited;
  930. end;
  931. procedure TAttributeList.Assign(aSource: TPersistent);
  932. begin
  933. If aSource is TAttributeList then
  934. Fattrs.Assign(TAttributeList(aSource).Fattrs);
  935. end;
  936. procedure TAttributeList.Add(aAttribute: UTF8String);
  937. begin
  938. FAttrs.Add(aAttribute);
  939. end;
  940. function TAttributeList.ToLine(ASep: String): UTF8String;
  941. Var
  942. I : Integer;
  943. begin
  944. Result:='';
  945. For I:=0 to Count-1 do
  946. begin
  947. if (Result<>'') then
  948. Result:=Result+ASep;
  949. Result:=Result+Attrs[I];
  950. end;
  951. end;
  952. function TAttributeList.AsString(Full: Boolean): UTF8String;
  953. begin
  954. Result:=ToLine(',');
  955. if Full and (Result<>'') then
  956. Result:='['+Result+']';
  957. end;
  958. function TAttributeList.IndexOf(const aName: UTF8string): Integer;
  959. begin
  960. Result:=Fattrs.IndexOf(aName);
  961. end;
  962. { TIDLDefinitionList }
  963. function TIDLDefinitionList.GetD(aIndex : Integer): TIDLDefinition;
  964. begin
  965. Result:= FList[aIndex] as TIDLDefinition;
  966. end;
  967. function TIDLDefinitionList.GetOwnsDefinitions: Boolean;
  968. begin
  969. Result:=FList.OwnsObjects;
  970. end;
  971. function TIDLDefinitionList.GetCount: Integer;
  972. begin
  973. Result:=FList.Count;
  974. end;
  975. constructor TIDLDefinitionList.Create(AParent: TIDLDefinition; OwnsDefinitions : Boolean = True);
  976. begin
  977. FParent:=AParent;
  978. FList:=TFPObjectList.Create(OwnsDefinitions);
  979. end;
  980. destructor TIDLDefinitionList.Destroy;
  981. begin
  982. FreeAndNil(FList);
  983. inherited Destroy;
  984. end;
  985. procedure TIDLDefinitionList.Clear;
  986. begin
  987. FList.Clear;
  988. end;
  989. function TIDLDefinitionList.AsString(const aSep, aStart, aEnd, aIndent : String; aFull,AppendSep : Boolean): UTF8String;
  990. Var
  991. I : Integer;
  992. begin
  993. Result:=aStart;
  994. if Count>0 then
  995. begin
  996. Result:=Result+aIndent+Definitions[0].AsString(aFull);
  997. For I:=1 to Count-1 do
  998. begin
  999. Result:=Result+aSep;
  1000. Result:=Result+aIndent+Definitions[I].AsString(aFull);
  1001. end;
  1002. If AppendSep and (Count>0) then
  1003. Result:=Result+aSep;
  1004. end;
  1005. Result:=Result+aEnd;
  1006. end;
  1007. function TIDLDefinitionList.AsString(Full: Boolean): UTF8String;
  1008. begin
  1009. if Full then
  1010. Result:=AsString(';'+sLineBreak,'{'+sLineBreak,'}',' ',Full,True)
  1011. else
  1012. Result:=AsString(';'+sLineBreak,'','','',Full,true);
  1013. end;
  1014. function TIDLDefinitionList.Add(aClass: TIDLDefinitionClass;
  1015. const AName: UTF8String): TIDLDefinition;
  1016. begin
  1017. Result:=aClass.Create(FParent,aName);
  1018. FList.Add(Result);
  1019. end;
  1020. function TIDLDefinitionList.Add(aItem: TIDLDefinition): Integer;
  1021. begin
  1022. Result:=FList.Add(aItem);
  1023. if (FParent<>nil) then
  1024. aItem.Parent:=FParent;
  1025. end;
  1026. function TIDLDefinitionList.GetEnumerator: TIDLDefinitionEnumerator;
  1027. begin
  1028. Result:=TIDLDefinitionEnumerator.Create(Self);
  1029. end;
  1030. { TIDLDefinition }
  1031. procedure TIDLDefinition.SetAttributes(AValue: TAttributeList);
  1032. begin
  1033. if FAttributes=AValue then Exit;
  1034. FreeAndNil(FAttributes);
  1035. FAttributes:=AValue;
  1036. end;
  1037. function TIDLDefinition.GetAttributes: TAttributeList;
  1038. begin
  1039. if FAttributes=Nil then
  1040. Fattributes:=TAttributeList.Create;
  1041. Result:=Fattributes;
  1042. end;
  1043. constructor TIDLDefinition.Create(aParent : TIDLDefinition; const aName: UTF8String);
  1044. begin
  1045. FName:=AName;
  1046. FParent:=AParent;
  1047. end;
  1048. function TIDLDefinition.Add(aClass: TIDLDefinitionClass; const AName: UTF8String
  1049. ): TIDLDefinition;
  1050. begin
  1051. Result:=aClass.Create(Self,AName);
  1052. end;
  1053. destructor TIDLDefinition.Destroy;
  1054. begin
  1055. FreeAndNil(FAttributes);
  1056. Inherited;
  1057. end;
  1058. function TIDLDefinition.IsExtension: Boolean;
  1059. begin
  1060. Result:=False;
  1061. end;
  1062. function TIDLDefinition.AsString(Full: Boolean): UTF8String;
  1063. begin
  1064. Result:=Name;
  1065. if Full and HasAttributes then
  1066. Result:=Attributes.AsString(True)+' '+Result;
  1067. end;
  1068. function TIDLDefinition.HasAttributes: Boolean;
  1069. begin
  1070. Result:=Assigned(FAttributes) and (FAttributes.Count>0)
  1071. end;
  1072. function TIDLDefinition.HasSimpleAttribute(const AName : UTF8String): Boolean;
  1073. begin
  1074. Result:=HasAttributes and (FAttributes.IndexOf(aName)<>-1);
  1075. end;
  1076. end.