123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581 |
- {
- Copyright (c) 2013 by Yury Sidorov and the FPC Development Team
- Base classes for a custom output of a PPU File
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- ****************************************************************************}
- unit ppuout;
- {$mode objfpc}{$H+}
- {$I+}
- interface
- uses SysUtils, cclasses, Classes;
- type
- TPpuDefType = (dtNone, dtUnit, dtObject, dtRecord, dtProc, dtField, dtProp, dtParam, dtVar,
- dtTypeRef, dtConst, dtProcType, dtEnum, dtSet, dtClassRef, dtArray, dtPointer,
- dtOrd, dtFloat, dtString, dtFile, dtVariant, dtUndefined, dtFormal);
- TPpuDef = class;
- TPpuContainerDef = class;
- TPpuUnitDef = class;
- { TPpuOutput }
- TPpuOutput = class
- private
- FOutFileHandle: THandle;
- FOutBuf: array[0..10000] of char;
- FOutBufPos: integer;
- FIndent: integer;
- FIndentSize: integer;
- FIndStr: string;
- FNoIndent: boolean;
- procedure Flush;
- procedure SetIndent(AValue: integer);
- procedure SetIndentSize(AValue: integer);
- protected
- procedure WriteObjectStart(const AName: string; Def: TPpuDef = nil); virtual;
- procedure WriteObjectEnd(const AName: string; Def: TPpuDef = nil); virtual;
- procedure WriteArrayStart(const AName: string); virtual;
- procedure WriteArrayEnd(const AName: string); virtual;
- procedure WriteStr(const AName, AValue: string); virtual;
- procedure WriteInt(const AName: string; AValue: Int64; Signed: boolean = True); virtual;
- procedure WriteFloat(const AName: string; AValue: extended); virtual;
- procedure WriteBool(const AName: string; AValue: boolean); virtual;
- procedure WriteNull(const AName: string); virtual;
- public
- constructor Create(OutFileHandle: THandle); virtual;
- destructor Destroy; override;
- procedure Write(const s: string);
- procedure WriteLn(const s: string = '');
- procedure IncI; virtual;
- procedure DecI; virtual;
- procedure Init; virtual;
- procedure Done; virtual;
- property Indent: integer read FIndent write SetIndent;
- property IndentSize: integer read FIndentSize write SetIndentSize;
- end;
- { TPpuRef }
- TPpuRef = class
- private
- FId: cardinal;
- function GetId: cardinal;
- function GetIsSymId: boolean;
- procedure SetId(AValue: cardinal);
- procedure SetIsSymId(AValue: boolean);
- public
- UnitIndex: word;
- constructor Create;
- procedure Write(Output: TPpuOutput; const RefName: string);
- property Id: cardinal read GetId write SetId;
- property IsSymId: boolean read GetIsSymId write SetIsSymId;
- function IsCurUnit: boolean; inline;
- function IsNull: boolean; inline;
- end;
- TPpuFilePos = record
- FileIndex: dword;
- Line, Col: integer;
- end;
- TPpuDefVisibility = (dvPublic, dvPublished, dvProtected, dvPrivate, dvHidden);
- TPpuAttr = record
- ParaCount: LongInt;
- TypeSym: TPpuRef;
- TypeConstr: TPpuRef;
- end;
- { TPpuDef }
- TPpuDef = class
- private
- FId: cardinal;
- FParent: TPpuContainerDef;
- FParentUnit: TPpuUnitDef;
- function GetDefTypeName: string;
- function GetId: cardinal;
- function GetParentUnit: TPpuUnitDef;
- procedure SetId(AValue: cardinal);
- procedure SetParent(AValue: TPpuContainerDef);
- protected
- procedure WriteDef(Output: TPpuOutput); virtual;
- procedure Done; virtual;
- public
- DefType: TPpuDefType;
- Name: string;
- FilePos: TPpuFilePos;
- // Symbol/definition reference
- Ref: TPpuRef;
- Visibility: TPpuDefVisibility;
- Attrs: array of TPpuAttr;
- constructor Create(AParent: TPpuContainerDef); virtual; reintroduce;
- destructor Destroy; override;
- procedure Write(Output: TPpuOutput; const AttrName: string = '');
- function CanWrite: boolean; virtual;
- procedure SetSymId(AId: integer);
- property Parent: TPpuContainerDef read FParent write SetParent;
- property ParentUnit: TPpuUnitDef read GetParentUnit;
- property Id: cardinal read GetId write SetId;
- property DefTypeName: string read GetDefTypeName;
- end;
- { TPpuContainerDef }
- TPpuContainerDef = class(TPpuDef)
- private
- FItems: TList;
- function GetCount: integer;
- function GetItem(Index: Integer): TPpuDef;
- procedure SetItem(Index: Integer; AValue: TPpuDef);
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- procedure BeforeWriteItems(Output: TPpuOutput); virtual;
- procedure Done; override;
- public
- ItemsName: string;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- function Add(Def: TPpuDef): integer;
- property Items[Index: Integer]: TPpuDef read GetItem write SetItem; default;
- property Count: integer read GetCount;
- end;
- { TPpuTypeRef }
- TPpuTypeRef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- { TPpuUnitDef }
- TPpuUnitDef = class(TPpuContainerDef)
- private
- FIndexById: THashSet;
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- Version: cardinal;
- Crc, IntfCrc: cardinal;
- TargetOS, TargetCPU: string;
- UsedUnits: TPpuContainerDef;
- RefUnits: array of string;
- SourceFiles: TPpuContainerDef;
- LongVersion: Cardinal;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- function FindById(AId: integer; FindSym: boolean = False): TPpuDef;
- end;
- { TPpuSrcFile }
- TPpuSrcFile = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- FileTime: TDateTime;
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- TPpuProcOption = (poProcedure, poFunction, poConstructor, poDestructor, poOperator,
- poClassMethod, poVirtual, poAbstract, poOverriding, poOverload, poInline);
- TPpuProcOptions = set of TPpuProcOption;
- { TPpuProcDef }
- TPpuProcDef = class(TPpuContainerDef)
- protected
- procedure BeforeWriteItems(Output: TPpuOutput); override;
- public
- ReturnType: TPpuRef;
- Options: TPpuProcOptions;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- end;
- { TPpuProcTypeDef }
- TPpuProcTypeDef = class(TPpuProcDef)
- protected
- procedure BeforeWriteItems(Output: TPpuOutput); override;
- public
- MethodPtr: boolean;
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- TPpuConstType = (ctUnknown, ctInt, ctFloat, ctStr, ctSet, ctPtr);
- { TPpuConstDef }
- TPpuConstDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- ConstType: TPpuConstType;
- TypeRef: TPpuRef;
- VInt: Int64;
- VFloat: extended;
- VStr: string;
- VSet: array[0..31] of byte;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- function CanWrite: boolean; override;
- end;
- { TPpuVarDef }
- TPpuVarDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- VarType: TPpuRef;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- end;
- TPpuParamSpez = (psValue, psVar, psOut, psConst, psConstRef, psHidden);
- { TPpuParamDef }
- TPpuParamDef = class(TPpuVarDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- Spez: TPpuParamSpez;
- DefaultValue: TPpuRef;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- function CanWrite: boolean; override;
- end;
- TPpuObjType = (otUnknown, otClass, otObject, otInterface, otHelper);
- TPpuObjOption = (ooIsAbstract, ooCopied, ooAbstractMethods);
- TPpuObjOptions = set of TPpuObjOption;
- { TPpuObjectDef }
- TPpuObjectDef = class(TPpuContainerDef)
- protected
- procedure BeforeWriteItems(Output: TPpuOutput); override;
- public
- ObjType: TPpuObjType;
- Ancestor: TPpuRef;
- Options: TPpuObjOptions;
- IID: string;
- HelperParent: TPpuRef;
- Size: integer;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- function CanWrite: boolean; override;
- end;
- { TPpuFieldDef }
- TPpuFieldDef = class(TPpuVarDef)
- public
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- TPpuPropOption = (poDefault);
- TPpuPropOptions = set of TPpuPropOption;
- { TPpuPropDef }
- TPpuPropDef = class(TPpuContainerDef)
- protected
- procedure BeforeWriteItems(Output: TPpuOutput); override;
- public
- PropType: TPpuRef;
- Getter, Setter: TPpuRef;
- Options: TPpuPropOptions;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- end;
- { TPpuRecordDef }
- TPpuRecordDef = class(TPpuObjectDef)
- protected
- procedure BeforeWriteItems(Output: TPpuOutput); override;
- public
- constructor Create(AParent: TPpuContainerDef); override;
- function CanWrite: boolean; override;
- end;
- { TPpuClassRefDef }
- TPpuClassRefDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- ClassRef: TPpuRef;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- end;
- TPpuArrayOption = (aoDynamic);
- TPpuArrayOptions = set of TPpuArrayOption;
- { TPpuArrayDef }
- TPpuArrayDef = class(TPpuContainerDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- ElType: TPpuRef;
- RangeType: TPpuRef;
- RangeLow, RangeHigh: Int64;
- Options: TPpuArrayOptions;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- end;
- { TPpuEnumDef }
- TPpuEnumDef = class(TPpuContainerDef)
- protected
- procedure BeforeWriteItems(Output: TPpuOutput); override;
- public
- ElLow, ElHigh: integer;
- Size: byte;
- CopyFrom: TPpuRef;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- end;
- { TPpuSetDef }
- TPpuSetDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- ElType: TPpuRef;
- SetBase, SetMax: integer;
- Size: byte;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- end;
- { TPpuPointerDef }
- TPpuPointerDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- Ptr: TPpuRef;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- end;
- TPpuOrdType = (otVoid, otUInt, otSInt, otPasBool, otBool, otChar, otCurrency);
- { TPpuOrdDef }
- TPpuOrdDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- OrdType: TPpuOrdType;
- Size: byte;
- RangeLow, RangeHigh: Int64;
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- TPpuFloatType = (pftSingle, pftDouble, pftExtended, pftComp, pftCurrency, pftFloat128);
- { TPpuFloatDef }
- TPpuFloatDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- FloatType: TPpuFloatType;
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- TPpuStrType = (stShort, stAnsi, stWide, stUnicode, stLong);
- { TPpuStringDef }
- TPpuStringDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- StrType: TPpuStrType;
- Len: integer;
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- TPpuFileType = (ftText, ftTyped, ftUntyped);
- { TPpuFileDef }
- TPpuFileDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- FileType: TPpuFileType;
- TypeRef: TPpuRef;
- constructor Create(AParent: TPpuContainerDef); override;
- destructor Destroy; override;
- end;
- { TPpuVariantDef }
- TPpuVariantDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- IsOLE: boolean;
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- { TPpuUndefinedDef }
- TPpuUndefinedDef = class(TPpuDef)
- public
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- { TPpuFormalDef }
- TPpuFormalDef = class(TPpuDef)
- protected
- procedure WriteDef(Output: TPpuOutput); override;
- public
- IsTyped: boolean;
- constructor Create(AParent: TPpuContainerDef); override;
- end;
- implementation
- const
- DefTypeNames: array[TPpuDefType] of string =
- ('', 'unit', 'obj', 'rec', 'proc', 'field', 'prop', 'param', 'var',
- 'type', 'const', 'proctype', 'enum', 'set', 'classref', 'array', 'ptr',
- 'ord', 'float', 'string', 'file', 'variant', 'undefined', 'formal');
- ProcOptionNames: array[TPpuProcOption] of string =
- ('procedure', 'function', 'constructor', 'destructor', 'operator',
- 'classmethod', 'virtual', 'abstract', 'overriding', 'overload', 'inline');
- DefVisibilityNames: array[TPpuDefVisibility] of string =
- ('public', 'published', 'protected', 'private', '');
- ParamSpezNames: array[TPpuParamSpez] of string =
- ('value', 'var', 'out', 'const', 'constref', '');
- ObjTypeNames: array[TPpuObjType] of string =
- ('', 'class', 'object', 'interface', 'helper');
- ObjOptionNames: array[TPpuObjOption] of string =
- ('abstract','copied','abstract_methods');
- PropOptionNames: array[TPpuPropOption] of string =
- ('default');
- ArrayOptionNames: array[TPpuArrayOption] of string =
- ('dynamic');
- ConstTypeNames: array[TPpuConstType] of string =
- ('unknown', 'int', 'float', 'string', 'set', 'pointer');
- OrdTypeNames: array[TPpuOrdType] of string =
- ('void', 'uint', 'sint', 'pasbool', 'bool', 'char', 'currency');
- FloatTypeNames: array[TPpuFloatType] of string =
- ('single', 'double', 'extended', 'comp', 'currency', 'float128');
- StrTypeNames: array[TPpuStrType] of string =
- ('short', 'ansi', 'wide', 'unicode', 'long');
- FileTypeNames: array[TPpuFileType] of string =
- ('text', 'typed', 'untyped');
- SymIdBit = $80000000;
- InvalidId = cardinal(-1);
- InvalidUnit = word(-1);
- function IsSymId(Id: cardinal): boolean; inline;
- begin
- Result:=Id and SymIdBit <> 0;
- end;
- { TPpuUndefinedDef }
- constructor TPpuUndefinedDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtUndefined;
- end;
- { TPpuFormalDef }
- procedure TPpuFormalDef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- Output.WriteBool('IsTyped', IsTyped);
- end;
- constructor TPpuFormalDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtFormal;
- end;
- { TPpuVariantDef }
- procedure TPpuVariantDef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- if IsOLE then
- Output.WriteBool('OleVariant', True);
- end;
- constructor TPpuVariantDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtVariant;
- end;
- { TPpuFileDef }
- procedure TPpuFileDef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- Output.WriteStr('FileType', FileTypeNames[FileType]);
- if FileType = ftTyped then
- TypeRef.Write(Output, 'TypeRef');
- end;
- constructor TPpuFileDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtFile;
- TypeRef:=TPpuRef.Create;
- end;
- destructor TPpuFileDef.Destroy;
- begin
- TypeRef.Free;
- inherited Destroy;
- end;
- { TPpuStringDef }
- procedure TPpuStringDef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- Output.WriteStr('StrType', StrTypeNames[StrType]);
- if Len >= 0 then
- Output.WriteInt('Len', Len);
- end;
- constructor TPpuStringDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtString;
- end;
- { TPpuFloatDef }
- procedure TPpuFloatDef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- Output.WriteStr('FloatType', FloatTypeNames[FloatType]);
- end;
- constructor TPpuFloatDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtFloat;
- end;
- { TPpuOrdDef }
- procedure TPpuOrdDef.WriteDef(Output: TPpuOutput);
- var
- Signed: boolean;
- begin
- inherited WriteDef(Output);
- with Output do begin
- WriteStr('OrdType', OrdTypeNames[OrdType]);
- WriteInt('Size', Size);
- Signed:=OrdType in [otSInt, otCurrency, otBool];
- WriteInt('Low', RangeLow, Signed);
- WriteInt('High', RangeHigh, Signed);
- end;
- end;
- constructor TPpuOrdDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtOrd;
- end;
- { TPpuPointerDef }
- procedure TPpuPointerDef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- Ptr.Write(Output, 'Ptr');
- end;
- constructor TPpuPointerDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtPointer;
- Ptr:=TPpuRef.Create;
- end;
- destructor TPpuPointerDef.Destroy;
- begin
- Ptr.Free;
- inherited Destroy;
- end;
- { TPpuSetDef }
- procedure TPpuSetDef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- with Output do begin
- WriteInt('Size', Size);
- WriteInt('Base', SetBase);
- WriteInt('Max', SetMax);
- end;
- ElType.Write(Output, 'ElType');
- end;
- constructor TPpuSetDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtSet;
- ElType:=TPpuRef.Create;
- end;
- destructor TPpuSetDef.Destroy;
- begin
- ElType.Free;
- inherited Destroy;
- end;
- { TPpuEnumDef }
- procedure TPpuEnumDef.BeforeWriteItems(Output: TPpuOutput);
- begin
- inherited BeforeWriteItems(Output);
- with Output do begin
- WriteInt('Low', ElLow);
- WriteInt('High', ElHigh);
- WriteInt('Size', Size);
- end;
- if not CopyFrom.IsNull then
- CopyFrom.Write(Output, 'CopyFrom');
- end;
- constructor TPpuEnumDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtEnum;
- ItemsName:='Elements';
- CopyFrom:=TPpuRef.Create;
- end;
- destructor TPpuEnumDef.Destroy;
- begin
- CopyFrom.Free;
- inherited Destroy;
- end;
- { TPpuConstDef }
- procedure TPpuConstDef.WriteDef(Output: TPpuOutput);
- var
- s, ss: string;
- i: integer;
- begin
- inherited WriteDef(Output);
- with Output do begin
- WriteStr('ValType', ConstTypeNames[ConstType]);
- s:='Value';
- case ConstType of
- ctUnknown: ;
- ctInt:
- WriteInt(s, VInt);
- ctFloat:
- WriteFloat(s, VFloat);
- ctStr:
- WriteStr(s, VStr);
- ctPtr:
- if VInt = 0 then
- WriteNull(s)
- else
- if QWord(VInt) > $FFFFFFFF then
- WriteStr(s, hexStr(QWord(VInt), 8))
- else
- WriteStr(s, hexStr(QWord(VInt), 16));
- ctSet:
- begin
- ss:='';
- for i:=Low(VSet) to High(VSet) do
- ss:=ss + hexStr(VSet[i], 2);
- WriteStr(s, ss);
- end;
- end;
- end;
- if not TypeRef.IsNull then
- TypeRef.Write(Output, 'TypeRef');
- end;
- constructor TPpuConstDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtConst;
- TypeRef:=TPpuRef.Create;
- ConstType:=ctUnknown;
- end;
- destructor TPpuConstDef.Destroy;
- begin
- TypeRef.Free;
- inherited Destroy;
- end;
- function TPpuConstDef.CanWrite: boolean;
- begin
- Result:=inherited CanWrite and (ConstType <> ctUnknown);
- end;
- { TPpuArrayDef }
- procedure TPpuArrayDef.WriteDef(Output: TPpuOutput);
- var
- opt: TPpuArrayOption;
- begin
- inherited WriteDef(Output);
- if Options <> [] then begin
- Output.WriteArrayStart('Options');
- for opt:=Low(opt) to High(opt) do
- if opt in Options then
- Output.WriteStr('', ArrayOptionNames[opt]);
- Output.WriteArrayEnd('Options');
- end;
- ElType.Write(Output, 'ElType');
- RangeType.Write(Output, 'RangeType');;
- Output.WriteInt('Low', RangeLow);
- Output.WriteInt('High', RangeHigh);
- end;
- constructor TPpuArrayDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- ItemsName:='Types';
- DefType:=dtArray;
- ElType:=TPpuRef.Create;
- RangeType:=TPpuRef.Create;
- end;
- destructor TPpuArrayDef.Destroy;
- begin
- ElType.Free;
- RangeType.Free;
- inherited Destroy;
- end;
- { TPpuClassRefDef }
- procedure TPpuClassRefDef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- ClassRef.Write(Output, 'Ref');
- end;
- constructor TPpuClassRefDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtClassRef;
- ClassRef:=TPpuRef.Create;
- end;
- destructor TPpuClassRefDef.Destroy;
- begin
- ClassRef.Free;
- inherited Destroy;
- end;
- { TPpuRecordDef }
- procedure TPpuRecordDef.BeforeWriteItems(Output: TPpuOutput);
- begin
- inherited BeforeWriteItems(Output);
- if ooCopied in Options then
- Ancestor.Write(Output, 'CopyFrom');
- end;
- constructor TPpuRecordDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtRecord;
- end;
- function TPpuRecordDef.CanWrite: boolean;
- begin
- Result:=True;
- end;
- { TPpuPropDef }
- procedure TPpuPropDef.BeforeWriteItems(Output: TPpuOutput);
- var
- opt: TPpuPropOption;
- begin
- inherited BeforeWriteItems(Output);
- PropType.Write(Output, 'PropType');
- Getter.Write(Output, 'Getter');
- Setter.Write(Output, 'Setter');
- if Options <> [] then begin
- Output.WriteArrayStart('Options');
- for opt:=Low(opt) to High(opt) do
- if opt in Options then
- Output.WriteStr('', PropOptionNames[opt]);
- Output.WriteArrayEnd('Options');
- end;
- end;
- constructor TPpuPropDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtProp;
- ItemsName:='Params';
- PropType:=TPpuRef.Create;
- Getter:=TPpuRef.Create;
- Setter:=TPpuRef.Create;
- end;
- destructor TPpuPropDef.Destroy;
- begin
- Getter.Free;
- Setter.Free;
- PropType.Free;
- inherited Destroy;
- end;
- { TPpuTypeRef }
- procedure TPpuTypeRef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- Ref.Write(Output, 'Ref');
- end;
- constructor TPpuTypeRef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtTypeRef;
- end;
- { TPpuFieldDef }
- constructor TPpuFieldDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtField;
- end;
- { TPpuParamDef }
- procedure TPpuParamDef.WriteDef(Output: TPpuOutput);
- var
- i, j: integer;
- d: TPpuDef;
- begin
- inherited WriteDef(Output);
- if Spez <> psValue then
- Output.WriteStr('Spez', ParamSpezNames[Spez]);
- if not DefaultValue.IsNull then begin
- j:=DefaultValue.Id;
- for i:=0 to Parent.Count - 1 do begin
- d:=Parent[i];
- if (d.DefType = dtConst) and (d.Id = j) then begin
- d.Visibility:=dvPublic;
- d.Name:='';
- d.Write(Output, 'Default');
- d.Visibility:=dvHidden;
- break;
- end;
- end;
- end;
- end;
- constructor TPpuParamDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtParam;
- Spez:=psValue;
- DefaultValue:=TPpuRef.Create;
- end;
- destructor TPpuParamDef.Destroy;
- begin
- DefaultValue.Free;
- inherited Destroy;
- end;
- function TPpuParamDef.CanWrite: boolean;
- begin
- Result:=inherited CanWrite and (Spez <> psHidden);
- end;
- { TPpuVarDef }
- procedure TPpuVarDef.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- VarType.Write(Output, 'VarType');
- end;
- constructor TPpuVarDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtVar;
- VarType:=TPpuRef.Create;
- end;
- destructor TPpuVarDef.Destroy;
- begin
- VarType.Free;
- inherited Destroy;
- end;
- { TPpuObjectDef }
- procedure TPpuObjectDef.BeforeWriteItems(Output: TPpuOutput);
- var
- opt: TPpuObjOption;
- begin
- inherited BeforeWriteItems(Output);
- if ObjType <> otUnknown then begin
- Output.WriteStr('ObjType', ObjTypeNames[ObjType]);
- Ancestor.Write(Output, 'Ancestor');
- end;
- if Options <> [] then begin
- Output.WriteArrayStart('Options');
- for opt:=Low(opt) to High(opt) do
- if opt in Options then
- Output.WriteStr('', ObjOptionNames[opt]);
- Output.WriteArrayEnd('Options');
- end;
- Output.WriteInt('Size', Size);
- if IID <> '' then
- Output.WriteStr('IID', IID);
- if not HelperParent.IsNull then
- HelperParent.Write(Output, 'HelperParent');
- end;
- constructor TPpuObjectDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtObject;
- ItemsName:='Fields';
- ObjType:=otUnknown;
- Ancestor:=TPpuRef.Create;
- HelperParent:=TPpuRef.Create;
- end;
- destructor TPpuObjectDef.Destroy;
- begin
- Ancestor.Free;
- HelperParent.Free;
- inherited Destroy;
- end;
- function TPpuObjectDef.CanWrite: boolean;
- begin
- Result:=inherited CanWrite and (ObjType <> otUnknown);
- end;
- { TPpuRef }
- function TPpuRef.GetId: cardinal;
- begin
- if FId = InvalidId then
- Result:=InvalidId
- else
- Result:=FId and not SymIdBit;
- end;
- function TPpuRef.GetIsSymId: boolean;
- begin
- Result:=FId and SymIdBit <> 0;
- end;
- procedure TPpuRef.SetId(AValue: cardinal);
- begin
- if (FId = InvalidId) or (AValue = InvalidId) then
- FId:=AValue
- else
- FId:=AValue or (FId and SymIdBit);
- end;
- procedure TPpuRef.SetIsSymId(AValue: boolean);
- begin
- if AValue then
- FId:=FId or SymIdBit
- else
- FId:=FId and not SymIdBit;
- end;
- constructor TPpuRef.Create;
- begin
- UnitIndex:=InvalidUnit;
- FId:=InvalidId;
- end;
- procedure TPpuRef.Write(Output: TPpuOutput; const RefName: string);
- begin
- with Output do
- if IsNull then
- WriteNull(RefName)
- else begin
- WriteObjectStart(RefName);
- if not IsCurUnit then
- WriteInt('Unit', UnitIndex);
- if IsSymId then
- WriteInt('SymId', Id)
- else
- WriteInt('Id', Id);
- WriteObjectEnd(RefName);
- end;
- end;
- function TPpuRef.IsCurUnit: boolean;
- begin
- Result:=UnitIndex = InvalidUnit;
- end;
- function TPpuRef.IsNull: boolean;
- begin
- Result:=Id = InvalidId;
- end;
- { TPpuProcTypeDef }
- procedure TPpuProcTypeDef.BeforeWriteItems(Output: TPpuOutput);
- begin
- inherited BeforeWriteItems(Output);
- if MethodPtr then
- Output.WriteBool('MethodPtr', MethodPtr);
- end;
- constructor TPpuProcTypeDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtProcType;
- end;
- { TPpuProcDef }
- procedure TPpuProcDef.BeforeWriteItems(Output: TPpuOutput);
- var
- opt: TPpuProcOption;
- begin
- inherited BeforeWriteItems(Output);
- if Options <> [] then begin
- Output.WriteArrayStart('Options');
- for opt:=Low(opt) to High(opt) do
- if opt in Options then
- Output.WriteStr('', ProcOptionNames[opt]);
- Output.WriteArrayEnd('Options');
- end;
- ReturnType.Write(Output, 'RetType');
- end;
- constructor TPpuProcDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtProc;
- ItemsName:='Params';
- ReturnType:=TPpuRef.Create;
- end;
- destructor TPpuProcDef.Destroy;
- begin
- ReturnType.Free;
- inherited Destroy;
- end;
- { TPpuSrcFile }
- procedure TPpuSrcFile.WriteDef(Output: TPpuOutput);
- begin
- inherited WriteDef(Output);
- Output.WriteStr('Time', FormatDateTime('yyyy"-"mm"-"dd hh":"nn":"ss', FileTime));
- end;
- constructor TPpuSrcFile.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtFile;
- end;
- { TPpuOutput }
- procedure TPpuOutput.SetIndent(AValue: integer);
- begin
- if FIndent=AValue then Exit;
- FIndent:=AValue;
- if FIndent < 0 then
- FIndent:=0;
- SetLength(FIndStr, FIndent*IndentSize);
- if FIndent > 0 then
- FillChar(FIndStr[1], FIndent*IndentSize, ' ');
- end;
- procedure TPpuOutput.SetIndentSize(AValue: integer);
- begin
- if FIndentSize=AValue then Exit;
- FIndentSize:=AValue;
- end;
- procedure TPpuOutput.WriteStr(const AName, AValue: string);
- begin
- end;
- procedure TPpuOutput.WriteInt(const AName: string; AValue: Int64; Signed: boolean);
- begin
- if Signed then
- WriteStr(AName, IntToStr(AValue))
- else
- WriteStr(AName, IntToStr(QWord(AValue)));
- end;
- procedure TPpuOutput.WriteFloat(const AName: string; AValue: extended);
- var
- s: string;
- begin
- Str(AValue, s);
- WriteStr(AName, s);
- end;
- procedure TPpuOutput.WriteBool(const AName: string; AValue: boolean);
- begin
- if AValue then
- WriteStr(AName, '1')
- else
- WriteStr(AName, '0');
- end;
- procedure TPpuOutput.WriteNull(const AName: string);
- begin
- WriteStr(AName, '');
- end;
- procedure TPpuOutput.WriteArrayStart(const AName: string);
- begin
- IncI;
- end;
- procedure TPpuOutput.WriteArrayEnd(const AName: string);
- begin
- DecI;
- end;
- procedure TPpuOutput.WriteObjectStart(const AName: string; Def: TPpuDef);
- begin
- IncI;
- if Def = nil then
- exit;
- if Def.DefType <> dtNone then
- WriteStr('Type', Def.DefTypeName);
- if Def.Name <> '' then
- WriteStr('Name', Def.Name);
- end;
- procedure TPpuOutput.WriteObjectEnd(const AName: string; Def: TPpuDef);
- begin
- DecI;
- end;
- constructor TPpuOutput.Create(OutFileHandle: THandle);
- begin
- FOutFileHandle:=OutFileHandle;
- FIndentSize:=2;
- end;
- destructor TPpuOutput.Destroy;
- begin
- Flush;
- inherited Destroy;
- end;
- procedure TPpuOutput.Flush;
- var
- i, len: integer;
- begin
- i:=0;
- while FOutBufPos > 0 do begin
- len:=FileWrite(FOutFileHandle, FOutBuf[i], FOutBufPos);
- if len < 0 then
- raise Exception.CreateFmt('Error writing to file: %s', [ {$if declared(GetLastOSError) } SysErrorMessage(GetLastOSError) {$else} 'I/O error' {$endif} ]);
- Inc(i, len);
- Dec(FOutBufPos, len);
- end;
- end;
- procedure TPpuOutput.Write(const s: string);
- var
- ss: string;
- i, len, len2: integer;
- begin
- if not FNoIndent then
- ss:=FIndStr + s
- else
- ss:=s;
- i:=1;
- len:=Length(ss);
- while len > 0 do begin
- len2:=Length(FOutBuf) - FOutBufPos;
- if len2 > 0 then begin
- if len < len2 then
- len2:=len;
- Move(ss[i], FOutBuf[FOutBufPos], len2);
- Inc(FOutBufPos, len2);
- end;
- if FOutBufPos = Length(FOutBuf) then
- Flush;
- Inc(i, len2);
- Dec(len, len2);
- end;
- FNoIndent:=True;
- end;
- procedure TPpuOutput.WriteLn(const s: string);
- begin
- Self.Write(s + LineEnding);
- FNoIndent:=False;
- end;
- procedure TPpuOutput.IncI;
- begin
- Indent:=Indent + 1;
- end;
- procedure TPpuOutput.DecI;
- begin
- Indent:=Indent - 1;
- end;
- procedure TPpuOutput.Init;
- begin
- end;
- procedure TPpuOutput.Done;
- begin
- Flush;
- end;
- { TPpuUnitDef }
- procedure TPpuUnitDef.WriteDef(Output: TPpuOutput);
- var
- i: integer;
- begin
- Done;
- with Output do begin
- if Version <> 0 then
- WriteInt('Version', Version);
- if TargetCPU <> '' then
- WriteStr('TargetCPU', TargetCPU);
- if TargetOS <> '' then
- WriteStr('TargetOS', TargetOS);
- if Crc <> 0 then
- WriteStr('CRC', hexStr(Crc, 8));
- if IntfCrc <> 0 then
- WriteStr('InterfaceCRC', hexStr(IntfCrc, 8));
- UsedUnits.WriteDef(Output);
- if Length(RefUnits) > 0 then begin
- WriteArrayStart('Units');
- for i:=0 to High(RefUnits) do
- WriteStr('', RefUnits[i]);
- WriteArrayEnd('Units');
- end;
- SourceFiles.WriteDef(Output);
- end;
- inherited WriteDef(Output);
- end;
- constructor TPpuUnitDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- DefType:=dtUnit;
- ItemsName:='Interface';
- UsedUnits:=TPpuContainerDef.Create(nil);
- UsedUnits.FParent:=Self;
- UsedUnits.ItemsName:='Uses';
- SourceFiles:=TPpuContainerDef.Create(nil);
- SourceFiles.FParent:=Self;
- SourceFiles.ItemsName:='Files';
- FIndexById:=THashSet.Create(64, True, False);
- end;
- destructor TPpuUnitDef.Destroy;
- begin
- UsedUnits.Free;
- SourceFiles.Free;
- FIndexById.Free;
- inherited Destroy;
- end;
- function TPpuUnitDef.FindById(AId: integer; FindSym: boolean): TPpuDef;
- var
- h: PHashSetItem;
- i: cardinal;
- begin
- Result:=nil;
- if AId = -1 then
- exit;
- i:=AId;
- if FindSym then
- i:=i or SymIdBit;
- h:=FIndexById.Find(@i, SizeOf(i));
- if h <> nil then
- Result:=TPpuDef(h^.Data)
- else
- Result:=nil;
- end;
- { TPpuContainerDef }
- function TPpuContainerDef.GetCount: integer;
- begin
- Result:=FItems.Count;
- end;
- function TPpuContainerDef.GetItem(Index: Integer): TPpuDef;
- begin
- Result:=TPpuDef(FItems[Index]);
- end;
- procedure TPpuContainerDef.SetItem(Index: Integer; AValue: TPpuDef);
- begin
- FItems[Index]:=AValue;
- end;
- procedure TPpuContainerDef.WriteDef(Output: TPpuOutput);
- var
- i: integer;
- begin
- inherited WriteDef(Output);
- BeforeWriteItems(Output);
- if Count = 0 then
- exit;
- Output.WriteArrayStart(ItemsName);
- for i:=0 to Count - 1 do
- Items[i].Write(Output);
- Output.WriteArrayEnd(ItemsName);
- end;
- procedure TPpuContainerDef.BeforeWriteItems(Output: TPpuOutput);
- begin
- end;
- procedure TPpuContainerDef.Done;
- var
- i: integer;
- d: TPpuDef;
- begin
- i:=0;
- while i < Count do begin
- d:=Items[i];
- d.Done;
- if d.Parent = Self then
- Inc(i);
- end;
- inherited Done;
- end;
- constructor TPpuContainerDef.Create(AParent: TPpuContainerDef);
- begin
- inherited Create(AParent);
- FItems:=TList.Create;
- ItemsName:='Contents';
- end;
- destructor TPpuContainerDef.Destroy;
- var
- i: integer;
- begin
- for i:=0 to FItems.Count - 1 do
- TObject(FItems[i]).Free;
- FItems.Free;
- inherited Destroy;
- end;
- function TPpuContainerDef.Add(Def: TPpuDef): integer;
- begin
- Result:=FItems.Add(Def);
- Def.FParent:=Self;
- end;
- { TPpuDef }
- function TPpuDef.GetDefTypeName: string;
- begin
- Result:=DefTypeNames[DefType];
- end;
- function TPpuDef.GetId: cardinal;
- begin
- if FId = InvalidId then
- Result:=InvalidId
- else
- Result:=FId and not SymIdBit;
- end;
- function TPpuDef.GetParentUnit: TPpuUnitDef;
- var
- d: TPpuContainerDef;
- begin
- if FParentUnit = nil then begin
- d:=Parent;
- while (d <> nil) and (d.DefType <> dtUnit) do
- d:=d.Parent;
- FParentUnit:=TPpuUnitDef(d);
- end;
- Result:=FParentUnit;
- end;
- procedure TPpuDef.SetId(AValue: cardinal);
- var
- h: PHashSetItem;
- u: TPpuUnitDef;
- begin
- if FId = AValue then Exit;
- u:=ParentUnit;
- if (FId <> InvalidId) and (u <> nil) then begin
- h:=u.FIndexById.Find(@FId, SizeOf(FId));
- if h <> nil then
- u.FIndexById.Remove(h);
- end;
- FId:=AValue;
- if (FId <> InvalidId) and (u <> nil) then begin;
- h:=u.FIndexById.FindOrAdd(@FId, SizeOf(FId));
- h^.Data:=Self;
- end;
- end;
- procedure TPpuDef.SetParent(AValue: TPpuContainerDef);
- var
- i: cardinal;
- begin
- if FParent=AValue then Exit;
- if FParent <> nil then
- raise Exception.Create('Parent can not be modified.');
- AValue.Add(Self);
- if FId <> InvalidId then begin
- i:=FId;
- FId:=InvalidId;
- SetId(i);
- end;
- end;
- procedure TPpuDef.SetSymId(AId: integer);
- begin
- Id:=cardinal(AId) or SymIdBit;
- end;
- procedure TPpuDef.Done;
- var
- symdef: TPpuDef;
- begin
- if IsSymId(FId) then
- exit;
- if not Ref.IsNull and Ref.IsCurUnit and (Name = '') then begin
- // If there is no definition name, but there is a symbol ref -
- // get the name from the symbol and move the def to the symbol container
- symdef:=ParentUnit.FindById(Ref.Id, True);
- if symdef <> nil then begin
- Name:=symdef.Name;
- Visibility:=symdef.Visibility;
- Parent.FItems.Remove(Self);
- symdef.Parent.FItems.Add(Self);
- // Hide the symbol, since it is not needed anymore
- symdef.Visibility:=dvHidden;
- end;
- end;
- end;
- procedure TPpuDef.WriteDef(Output: TPpuOutput);
- var
- i: SizeInt;
- begin
- with Output do begin
- if FId <> InvalidId then
- if IsSymId(FId) then
- WriteInt('SymId', Id)
- else begin
- WriteInt('Id', Id);
- if not Ref.IsNull then
- WriteInt('SymId', Ref.Id);
- end;
- if FilePos.Line > 0 then begin
- WriteObjectStart('Pos');
- if FilePos.FileIndex > 0 then
- WriteInt('File', FilePos.FileIndex);
- WriteInt('Line', FilePos.Line);
- WriteInt('Col', FilePos.Col);
- WriteObjectEnd('Pos');
- end;
- if Visibility <> dvPublic then
- WriteStr('Visibility', DefVisibilityNames[Visibility]);
- if Length(Attrs) > 0 then begin
- WriteArrayStart('Attributes');
- for i:=0 to High(Attrs) do begin
- WriteObjectStart('');
- Attrs[i].TypeSym.Write(Output, 'TypeSym');
- Attrs[i].TypeConstr.Write(Output, 'TypeConstr');
- WriteInt('ParaCount', Attrs[i].ParaCount, False);
- WriteObjectEnd('');
- end;
- WriteArrayEnd('Attributes');
- end;
- end;
- end;
- constructor TPpuDef.Create(AParent: TPpuContainerDef);
- begin
- FId:=InvalidId;
- Ref:=TPpuRef.Create;
- Visibility:=dvPublic;
- if AParent <> nil then
- AParent.Add(Self);
- end;
- destructor TPpuDef.Destroy;
- begin
- Ref.Free;
- inherited Destroy;
- end;
- procedure TPpuDef.Write(Output: TPpuOutput; const AttrName: string);
- begin
- if not CanWrite then
- exit;
- if Parent <> nil then
- Output.WriteObjectStart(AttrName, Self);
- WriteDef(Output);
- if Parent <> nil then
- Output.WriteObjectEnd(AttrName, Self);
- end;
- function TPpuDef.CanWrite: boolean;
- begin
- Result:=Visibility <> dvHidden;
- end;
- end.
|