jstree.pp 85 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629
  1. { *********************************************************************
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 2016 Michael Van Canneyt.
  4. Javascript syntax tree definitions
  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 jstree;
  12. {$mode objfpc}{$H+}
  13. { $DEFINE NOCLASSES}
  14. interface
  15. uses
  16. {$IFNDEF NOCLASSES} Classes, {$ENDIF} SysUtils, jsbase, jstoken;
  17. Type
  18. {$IFDEF NOCLASSES}
  19. { TStrings }
  20. {$M+}
  21. TStrings = Class(TObject)
  22. private
  23. FCount: Integer;
  24. FStrings : Array of String;
  25. function GetCount: Integer;
  26. function GetS(AIndex : Integer): String;
  27. procedure SetS(AIndex : Integer; AValue: String);
  28. Public
  29. Function Add(Const S : String) : Integer;
  30. Procedure Assign(Source : TStrings);
  31. Property Strings[AIndex : Integer] : String Read GetS Write SetS; default;
  32. Property Count : Integer Read GetCount;
  33. end;
  34. TStringList = TStrings;
  35. EListError = Class(Exception);
  36. TCollection = Class;
  37. { TCollectionItem }
  38. TCollectionItem = Class
  39. Private
  40. FCollection : TCollection;
  41. Public
  42. Constructor Create(ACollection : TCollection);
  43. Destructor Destroy; override;
  44. end;
  45. TCollectionItemClass = Class of TCollectionItem;
  46. { TCollection }
  47. TCollection = Class
  48. private
  49. FCount: Integer;
  50. FItems : Array of TCollectionItem;
  51. FItemClass : TCollectionItemClass;
  52. function GetCount: Integer;
  53. function GetI(AIndex : Integer): TCollectionItem;
  54. public
  55. Constructor Create(AItemClass : TCollectionItemClass);
  56. Destructor Destroy; override;
  57. Procedure Clear;
  58. Procedure Remove(AItem : TCollectionItem);
  59. Function Add : TCollectionItem;
  60. Property Items[AIndex : Integer] : TCollectionItem Read GetI;default;
  61. Property Count : Integer Read GetCount;
  62. end;
  63. {$M-}
  64. {$ENDIF}
  65. TJSElementFlag = (elIsConst,elIsConstValid);
  66. TJSElementFlags = set of TJSElementFlag;
  67. TJSFunctionBody = Class;
  68. TJSElementNodes = class;
  69. TJSObjectTypeDef = Class;
  70. { TJSElement }
  71. { TJSObject }
  72. TJSObject = Class(TObject);
  73. { TJSLabelSet }
  74. TJSLabelSet = Class(TJSObject)
  75. private
  76. FCont: Boolean;
  77. FNext: TJSLabelSet;
  78. FTarget: Cardinal;
  79. Public
  80. Property Target : Cardinal Read FTarget Write FTarget;
  81. Property Next : TJSLabelSet Read FNext Write FNext; // Linked list
  82. Property Continuable : Boolean Read FCont Write FCont;
  83. end;
  84. { TJSLabel }
  85. TJSLabel = Class(TJSObject)
  86. private
  87. FLabelSet: TJSLabelSet;
  88. FLocationLine: Integer;
  89. FLocationPos: Integer;
  90. FLocationSource: String;
  91. FName: jsBase.TJSString;
  92. FNext: TJSLabel;
  93. Public
  94. Property Name : jsBase.TJSString Read FName Write FName;
  95. Property LabelSet : TJSLabelSet Read FLabelSet Write FLabelSet;
  96. Property LocationSource : String Read FLocationSource Write FLocationSource;
  97. Property LocationLine : Integer Read FLocationLine Write FLocationLine;
  98. Property LocationPos : Integer Read FLocationPos Write FLocationPos;
  99. Property Next : TJSLabel Read FNext Write FNext;
  100. end;
  101. TJSString = jsbase.TJSString; // beware of jstoken.tjsString
  102. { TJSFuncDef - part of TJSFunctionDeclarationStatement, e.g. 'function Name(Params)Body' }
  103. TJSTypedParams = Class;
  104. TJSTypeDef = Class;
  105. TJSEnumTypeDef = Class;
  106. TJSFuncDef = Class(TJSObject)
  107. private
  108. FBody: TJSFunctionBody;
  109. FIsAsserts: Boolean;
  110. FIsAsync: Boolean;
  111. FIsConstructor: Boolean;
  112. FIsEmpty: Boolean;
  113. FName: TJSString;
  114. FParams: TStrings;
  115. FResultType: TJSTypeDef;
  116. FTypedParams: TJSTypedParams;
  117. FGenericParams : TJSElementNodes;
  118. Public
  119. Constructor Create;
  120. Destructor Destroy; override;
  121. Procedure UpdateParams;
  122. Property TypedParams : TJSTypedParams Read FTypedParams;
  123. Property ResultType : TJSTypeDef Read FResultType Write FResultType;
  124. Property Params : TStrings Read FParams; deprecated 'use TypedParams instead';
  125. Property Body : TJSFunctionBody Read FBody Write FBody; // can be nil
  126. Property Name : TJSString Read FName Write FName;
  127. Property IsEmpty : Boolean Read FIsEmpty Write FIsEmpty;
  128. Property IsAsync : Boolean Read FIsAsync Write FIsAsync;
  129. Property IsAsserts : Boolean Read FIsAsserts Write FIsAsserts;
  130. Property IsConstructor : Boolean Read FIsConstructor Write FIsConstructor;
  131. Property GenericParams : TJSElementNodes Read FGenericParams Write FGenericParams;
  132. end;
  133. { TJSElement }
  134. TJSElement = Class(TJSObject)
  135. private
  136. FData: TObject;
  137. FFlags: TJSElementFlags;
  138. FLine: Integer;
  139. FColumn: Integer;
  140. FSource: String;
  141. Public
  142. Type
  143. TFreeNotifyEvent = Procedure(aEl : TJSElement) of object;
  144. class var
  145. GlobalFreeHook : TFreeNotifyEvent;
  146. Public
  147. Constructor Create(ALine,AColumn : Integer; Const ASource : String = ''); virtual;
  148. Destructor Destroy; override;
  149. Procedure AssignPosition(El: TJSElement); virtual;
  150. Property Source : String Read FSource Write FSource;
  151. Property Line : Integer Read FLine Write FLine;
  152. Property Column : Integer Read FColumn Write FColumn;
  153. Property Flags : TJSElementFlags Read FFlags Write FFlags;
  154. Property Data : TObject Read FData write FData;
  155. end;
  156. TJSElementClass = Class of TJSElement;
  157. TJSElementArray = array of TJSElement;
  158. { TJSEmptyBlockStatement - empty curly brackets }
  159. TJSStatement = Class(TJSElement);
  160. TJSEmptyBlockStatement = Class(TJSStatement);
  161. { TJSEmptyStatement - a dummy placeholder, needs sometimes a single semicolon }
  162. TJSEmptyStatement = Class(TJSStatement);
  163. { TJSLiteral }
  164. TJSLiteral = Class(TJSElement)
  165. private
  166. FValue: TJSValue;
  167. Public
  168. Constructor Create(ALine,AColumn : Integer; Const ASource : String = ''); override;
  169. Destructor Destroy; override;
  170. Property Value : TJSValue Read FValue Write FValue;
  171. end;
  172. { TJSRegularExpressionLiteral - /Pattern/PatternFlags }
  173. TJSRegularExpressionLiteral = Class(TJSElement)
  174. private
  175. FPattern: TJSValue;
  176. FPatternFlags: TJSValue;
  177. FArgv : Array[0..1] of TJSValue;
  178. function GetA(AIndex : integer): TJSValue;
  179. procedure SetA(AIndex : integer; const AValue: TJSValue);
  180. Public
  181. Constructor Create(ALine,AColumn : Integer; Const ASource : String = ''); override;
  182. Destructor Destroy; override;
  183. Property Pattern : TJSValue Read FPattern Write FPattern;
  184. Property PatternFlags : TJSValue Read FPatternFlags Write FPatternFlags;
  185. Property Argv[AIndex : integer] : TJSValue Read GetA Write SetA;
  186. end;
  187. TJSPrimaryExpression = Class(TJSElement);
  188. TJSPrimaryExpressionThis = Class(TJSPrimaryExpression); // 'this'
  189. { TJSPrimaryExpressionIdent }
  190. TJSPrimaryExpressionIdent = Class(TJSPrimaryExpression)
  191. private
  192. FName: TJSString;
  193. Public
  194. Property Name : TJSString Read FName Write FName;
  195. end;
  196. { TJSArrayLiteralElement - an item of a TJSArrayLiteralElements }
  197. TJSArrayLiteralElement = Class(TCollectionItem)
  198. private
  199. FExpr: TJSelement;
  200. FElementIndex: Integer;
  201. Public
  202. Destructor Destroy; override;
  203. Property Expr : TJSElement Read FExpr Write FExpr;
  204. Property ElementIndex : Integer Read FElementIndex Write FElementIndex;
  205. end;
  206. { TJSArrayLiteralElements - Elements property of TJSArrayLiteral }
  207. TJSArrayLiteralElements = Class(TCollection)
  208. private
  209. function GetE(AIndex : Integer): TJSArrayLiteralElement;
  210. Public
  211. Function AddElement : TJSArrayLiteralElement;
  212. Property Elements[AIndex : Integer] : TJSArrayLiteralElement Read GetE ; default;
  213. end;
  214. { TJSArrayLiteral - [element1,...] or Args of a function }
  215. TJSArrayLiteral = Class(TJSElement)
  216. private
  217. FElements: TJSArrayLiteralElements;
  218. function GetCount: Integer;
  219. Public
  220. Constructor Create(ALine,AColumn : Integer; const ASource : String = ''); override;
  221. procedure AddElement(El: TJSElement);
  222. Destructor Destroy; override;
  223. Property Elements : TJSArrayLiteralElements Read FElements;
  224. Property Count : Integer Read GetCount;
  225. end;
  226. { TJSObjectLiteralElement - an item of TJSObjectLiteralElements }
  227. TJSObjectLiteralElement = Class(TCollectionItem)
  228. private
  229. FExpr: TJSelement;
  230. FName: TJSString;
  231. Public
  232. Destructor Destroy; override;
  233. Property Expr : TJSElement Read FExpr Write FExpr;
  234. Property Name : TJSString Read FName Write FName;
  235. end;
  236. { TJSObjectLiteralElements - Elements property of TJSObjectLiteral }
  237. TJSObjectLiteralElements = Class(TCollection)
  238. private
  239. function GetE(AIndex : Integer): TJSObjectLiteralElement;
  240. Public
  241. Function AddElement : TJSObjectLiteralElement;
  242. Property Elements[AIndex : Integer] : TJSObjectLiteralElement Read GetE ; default;
  243. end;
  244. { TJSObjectLiteral }
  245. TJSObjectLiteral = Class(TJSElement)
  246. private
  247. FElements: TJSObjectLiteralElements;
  248. Public
  249. Constructor Create(ALine,AColumn : Integer; const ASource : String = ''); override;
  250. Destructor Destroy; override;
  251. Property Elements : TJSObjectLiteralElements Read FElements;
  252. end;
  253. { TJSArguments - (element1,...) }
  254. TJSArguments = Class(TJSArrayLiteral);
  255. { TJSMemberExpression - base class }
  256. TJSMemberExpression = Class(TJSElement)
  257. private
  258. FMExpr: TJSElement;
  259. Public
  260. Destructor Destroy; override;
  261. Property MExpr : TJSElement Read FMExpr Write FMExpr;
  262. end;
  263. { TJSNewMemberExpression - e.g. 'new MExpr(Args)' }
  264. TJSNewMemberExpression = Class(TJSMemberExpression)
  265. private
  266. FArgs: TJSArguments;
  267. Public
  268. Destructor Destroy; override;
  269. procedure AddArg(El: TJSElement);
  270. Property Args : TJSArguments Read FArgs Write FArgs;
  271. end;
  272. { TJSDotMemberExpression - e.g. 'MExpr.Name' }
  273. TJSDotMemberExpression = Class(TJSMemberExpression)
  274. private
  275. FName: TJSString;
  276. Public
  277. Property Name : TJSString Read FName Write FName;
  278. end;
  279. { TJSBracketMemberExpression - e.g. 'MExpr[Name]' }
  280. TJSBracketMemberExpression = Class(TJSMemberExpression)
  281. private
  282. FName: TJSElement;
  283. Public
  284. Destructor Destroy; override;
  285. Property Name : TJSElement Read FName Write FName;
  286. end;
  287. { TJSCallExpression - e.g. 'Expr(Args)'}
  288. TJSCallExpression = Class(TJSElement)
  289. private
  290. FArgs: TJSArguments;
  291. FExpr: TJSElement;
  292. Public
  293. Destructor Destroy; override;
  294. procedure AddArg(El: TJSElement);
  295. procedure InsertArg(Index: integer; El: TJSElement);
  296. Property Expr : TJSElement Read FExpr Write FExpr;
  297. Property Args : TJSArguments Read FArgs Write FArgs;
  298. end;
  299. { TJSUnary - e.g. 'PrefixOperator A PostFixOperator', '--i' }
  300. TJSUnary = Class(TJSElement)
  301. private
  302. FA: TJSElement;
  303. Public
  304. Class function PrefixOperatorToken : tjsToken; virtual;
  305. Class function PostFixOperatorToken : tjsToken; virtual;
  306. Class function PrefixOperator : String;
  307. Class function PostFixOperator : String;
  308. Destructor Destroy; override;
  309. Property A : TJSElement Read FA Write FA;
  310. end;
  311. TJSUnaryClass = class of TJSUnary;
  312. TJSDeclarationStatement = Class(TJSElement)
  313. Public
  314. Function GetDeclaration : TJSElement; virtual; abstract;
  315. end;
  316. { TJSVariableStatement - e.g. 'var A' 'let A', 'const a'}
  317. TJSVarType = (vtVar,vtLet,vtConst);
  318. TJSVarTypes = Set of TJSVarType;
  319. TJSVariableStatement = Class(TJSDeclarationStatement)
  320. private
  321. FA: TJSElement;
  322. FVarType: TJSVarType;
  323. Public
  324. Property VarType : TJSVarType Read FVarType Write FVarType;
  325. Destructor Destroy; override;
  326. Function GetDeclaration : TJSElement; override;
  327. // For backwards Compatibility
  328. Property A : TJSElement Read FA Write FA; deprecated 'Use VarDecl instead';
  329. Property VarDecl : TJSElement Read FA Write FA;
  330. end;
  331. { TJSExpressionStatement - A; }
  332. TJSExpressionStatement = Class(TJSUnary);
  333. { TJSThrowStatement - e.g. 'throw A' }
  334. TJSThrowStatement = Class(TJSUnary)
  335. Public
  336. Class function PrefixOperatorToken : tjsToken; Override;
  337. end;
  338. TJSUnaryExpression = Class(TJSUnary);
  339. { TJSUnaryDeleteExpression - e.g. 'delete A' }
  340. TJSUnaryDeleteExpression = Class(TJSUnaryExpression)
  341. Public
  342. Class function PrefixOperatorToken : tjsToken; override;
  343. end;
  344. { TJSUnaryVoidExpression - e.g. 'void A' }
  345. TJSUnaryVoidExpression = Class(TJSUnaryExpression)
  346. Public
  347. Class function PrefixOperatorToken : tjsToken; override;
  348. end;
  349. { TJSUnaryTypeOfExpression - e.g. 'typeof A' }
  350. TJSUnaryTypeOfExpression = Class(TJSUnaryExpression)
  351. Public
  352. Class function PrefixOperatorToken : tjsToken; override;
  353. end;
  354. { TJSAwaitExpression - e.g. 'await A' }
  355. TJSAwaitExpression = Class(TJSUnaryExpression)
  356. Public
  357. Class function PrefixOperatorToken : tjsToken; Override;
  358. end;
  359. { TJSYieldExpression }
  360. TJSYieldExpression = Class(TJSUnaryExpression)
  361. Public
  362. Class function PrefixOperatorToken : tjsToken; Override;
  363. end;
  364. { TJSUnaryPrePlusPlusExpression - e.g. '++A' }
  365. TJSUnaryPrePlusPlusExpression = Class(TJSUnaryExpression)
  366. Public
  367. Class function PrefixOperatorToken : tjsToken; override;
  368. end;
  369. { TJSUnaryPreMinusMinusExpression - e.g. '--A' }
  370. TJSUnaryPreMinusMinusExpression = Class(TJSUnaryExpression)
  371. Public
  372. Class function PrefixOperatorToken : tjsToken; override;
  373. end;
  374. { TJSUnaryPlusExpression - e.g. '+A' }
  375. TJSUnaryPlusExpression = Class(TJSUnaryExpression)
  376. Public
  377. Class function PrefixOperatorToken : tjsToken; override;
  378. end;
  379. { TJSUnaryMinusExpression - e.g. '-A' }
  380. TJSUnaryMinusExpression = Class(TJSUnaryExpression)
  381. Public
  382. Class function PrefixOperatorToken : tjsToken; override;
  383. end;
  384. { TJSUnaryInvExpression - e.g. '~A' }
  385. TJSUnaryInvExpression = Class(TJSUnaryExpression)
  386. Public
  387. Class function PrefixOperatorToken : tjsToken; override;
  388. end;
  389. { TJSUnaryNotExpression - e.g. '!A' }
  390. TJSUnaryNotExpression = Class(TJSUnaryExpression)
  391. Public
  392. Class function PrefixOperatorToken : tjsToken; override;
  393. end;
  394. { TJSUnaryPostPlusPlusExpression - e.g. 'A++' }
  395. TJSUnaryPostPlusPlusExpression = Class(TJSUnaryExpression)
  396. Public
  397. Class function PostFixOperatorToken : tjsToken; override;
  398. end;
  399. { TJSUnaryPostMinusMinusExpression - e.g. 'A--' }
  400. TJSUnaryPostMinusMinusExpression = Class(TJSUnaryExpression)
  401. Public
  402. Class function PostFixOperatorToken : tjsToken; override;
  403. end;
  404. { TJSUnaryBracketsExpression - e.g. '(A)' }
  405. TJSUnaryBracketsExpression = Class(TJSUnaryExpression)
  406. Public
  407. Class function PrefixOperatorToken : tjsToken; override;
  408. Class function PostFixOperatorToken : tjsToken; override;
  409. end;
  410. { TJSBinary - base class }
  411. TJSBinary = Class(TJSElement)
  412. private
  413. FA: TJSElement;
  414. FB: TJSElement;
  415. Public
  416. Destructor Destroy; override;
  417. Property A : TJSElement Read FA Write FA;
  418. Property B : TJSElement Read FB Write FB;
  419. end;
  420. TJSBinaryClass = Class of TJSBinary;
  421. { TJSStatementList - a list of statements enclosed in curly brackets }
  422. TJSStatementList = Class(TJSBinary); // A->first statement, B->next in list, chained.
  423. { TJSVariableDeclarationList }
  424. TJSVariableDeclarationList = Class(TJSBinary); // A->first variable, B->next in list, chained.
  425. { TJSWithStatement - with(A)do B; }
  426. TJSWithStatement = Class(TJSBinary); // A-> with expression, B->statement(s)
  427. { TJSBinaryExpression - e.g. A operator B }
  428. TJSBinaryExpression = Class(TJSBinary)
  429. Public
  430. Class function OperatorToken : tjsToken; virtual;
  431. Class function OperatorString : string;
  432. Class Function AllowCompact : Boolean; virtual;
  433. end;
  434. { TJSLogicalOrExpression - e.g. A || B }
  435. TJSLogicalOrExpression = Class (TJSBinaryExpression)
  436. Class function OperatorToken : tjsToken; override;
  437. end;
  438. { TJSLogicalAndExpression - e.g. A && B }
  439. TJSLogicalAndExpression = Class (TJSBinaryExpression)
  440. Class function OperatorToken : tjsToken; override;
  441. end;
  442. { TJSBitwiseAndExpression - e.g. A & B }
  443. TJSBitwiseAndExpression = Class (TJSBinaryExpression)
  444. Class function OperatorToken : tjsToken; override;
  445. end;
  446. { TJSBitwiseOrExpression - e.g. A | B }
  447. TJSBitwiseOrExpression = Class (TJSBinaryExpression)
  448. Class function OperatorToken : tjsToken; override;
  449. end;
  450. { TJSBitwiseXOrExpression - e.g. A ^ B }
  451. TJSBitwiseXOrExpression = Class (TJSBinaryExpression)
  452. Class function OperatorToken : tjsToken; override;
  453. end;
  454. TJSEqualityExpression = Class (TJSBinaryExpression);
  455. { TJSEqualityExpressionEQ - e.g. A == B }
  456. TJSEqualityExpressionEQ = Class(TJSEqualityExpression)
  457. Class function OperatorToken : tjsToken; override;
  458. end;
  459. { TJSEqualityExpressionNE - e.g. A != B }
  460. TJSEqualityExpressionNE = Class(TJSEqualityExpression)
  461. Class function OperatorToken : tjsToken; override;
  462. end;
  463. { TJSEqualityExpressionSEQ strict equal - e.g. A === B }
  464. TJSEqualityExpressionSEQ = Class(TJSEqualityExpression)
  465. Class function OperatorToken : tjsToken; override;
  466. end;
  467. { TJSEqualityExpressionSNE not strict equal - e.g. A !== B }
  468. TJSEqualityExpressionSNE = Class(TJSEqualityExpression)
  469. Class function OperatorToken : tjsToken; override;
  470. end;
  471. TJSRelationalExpression = Class(TJSBinaryExpression);
  472. { TJSRelationalExpressionLT lower than - e.g. A < B }
  473. TJSRelationalExpressionLT = Class(TJSRelationalExpression)
  474. Class function OperatorToken : tjsToken; override;
  475. end;
  476. { TJSRelationalExpressionGT greater than - e.g. A > B }
  477. TJSRelationalExpressionGT = Class(TJSRelationalExpression)
  478. Class function OperatorToken : tjsToken; override;
  479. end;
  480. { TJSRelationalExpressionLE lower equal - e.g. A <= B }
  481. TJSRelationalExpressionLE = Class(TJSRelationalExpression)
  482. Class function OperatorToken : tjsToken; override;
  483. end;
  484. { TJSRelationalExpressionGE greater equal - e.g. A >= B }
  485. TJSRelationalExpressionGE = Class(TJSRelationalExpression)
  486. Class function OperatorToken : tjsToken; override;
  487. end;
  488. { TJSRelationalExpressionIn - e.g. A in B }
  489. TJSRelationalExpressionIn = Class(TJSRelationalExpression)
  490. Class function OperatorToken : tjsToken; override;
  491. Class Function AllowCompact : Boolean; override;
  492. end;
  493. { TJSRelationalExpressionInstanceOf - e.g. A instanceof B }
  494. TJSRelationalExpressionInstanceOf = Class(TJSRelationalExpression)
  495. Class function OperatorToken : tjsToken; override;
  496. Class Function AllowCompact : Boolean; override;
  497. end;
  498. TJSShiftExpression = Class(TJSBinaryExpression);
  499. { TJSLShiftExpression - e.g. A << B }
  500. TJSLShiftExpression = Class(TJSShiftExpression)
  501. Class function OperatorToken : tjsToken; override;
  502. end;
  503. { TJSRShiftExpression right shift keep sign - e.g. A >> B }
  504. TJSRShiftExpression = Class(TJSShiftExpression)
  505. Class function OperatorToken : tjsToken; override;
  506. end;
  507. { TJSURShiftExpression right shift unsigned, insert zeroes - e.g. A >>> B }
  508. TJSURShiftExpression = Class(TJSShiftExpression)
  509. Class function OperatorToken : tjsToken; override;
  510. end;
  511. TJSAdditiveExpression = Class(TJSBinaryExpression);
  512. { TJSAdditiveExpressionPlus - e.g. A + B }
  513. TJSAdditiveExpressionPlus = Class(TJSAdditiveExpression)
  514. Class function OperatorToken : tjsToken; override;
  515. end;
  516. { TJSAdditiveExpressionMinus - e.g. A - B }
  517. TJSAdditiveExpressionMinus = Class(TJSAdditiveExpression)
  518. Class function OperatorToken : tjsToken; override;
  519. end;
  520. TJSMultiplicativeExpression = Class(TJSBinaryExpression);
  521. { TJSMultiplicativeExpressionMul - e.g. A * B }
  522. TJSMultiplicativeExpressionMul = Class(TJSMultiplicativeExpression)
  523. Class function OperatorToken : tjsToken; override;
  524. end;
  525. { TJSMultiplicativeExpressionDiv - e.g. A / B }
  526. TJSMultiplicativeExpressionDiv = Class(TJSMultiplicativeExpression)
  527. Class function OperatorToken : tjsToken; override;
  528. end;
  529. { TJSMultiplicativeExpressionMod - e.g. A % B }
  530. TJSMultiplicativeExpressionMod = Class(TJSMultiplicativeExpression)
  531. Class function OperatorToken : tjsToken; override;
  532. end;
  533. { TJSCommaExpression - e.g. A , B }
  534. TJSCommaExpression = Class(TJSBinaryExpression)
  535. Class function OperatorToken : tjsToken; override;
  536. end;
  537. { TJSConditionalExpression - e.g. A ? B :C }
  538. TJSConditionalExpression = Class(TJSElement)
  539. private
  540. FA: TJSElement;
  541. FB: TJSElement;
  542. FC: TJSElement;
  543. Public
  544. Destructor Destroy; override;
  545. Property A : TJSElement Read FA Write FA;
  546. Property B : TJSElement Read FB Write FB;
  547. Property C : TJSElement Read FC Write FC;
  548. end;
  549. TJSDebuggerStatement = Class(TJSStatement);
  550. { TJSAssignStatement - e.g. LHS operator Expr }
  551. TJSAssignStatement = Class(TJSStatement)
  552. private
  553. FExpr: TJSElement;
  554. FLHS: TJSElement;
  555. Public
  556. Destructor Destroy; override;
  557. Class function OperatorToken : tjsToken; virtual;
  558. Class function OperatorString : String;
  559. Property Expr : TJSElement Read FExpr Write FExpr;
  560. Property LHS : TJSElement Read FLHS Write FLHS;
  561. end;
  562. TJSAssignStatementClass = Class of TJSAssignStatement;
  563. { TJSSimpleAssignStatement - e.g. LHS=Expr }
  564. TJSSimpleAssignStatement = Class(TJSAssignStatement)
  565. Public
  566. Class function OperatorToken : tjsToken; override;
  567. end;
  568. { LHS => Expr }
  569. { TJSArrowFunction }
  570. TJSArrowFunction = Class(TJSAssignStatement)
  571. Public
  572. Class function OperatorToken : tjsToken; override;
  573. end;
  574. { TJSMulEqAssignStatement - e.g. LHS*=Expr }
  575. TJSMulEqAssignStatement = Class(TJSAssignStatement)
  576. Public
  577. Class function OperatorToken : tjsToken; override;
  578. end;
  579. { TJSDivEqAssignStatement - e.g. LHS/=Expr }
  580. TJSDivEqAssignStatement = Class(TJSAssignStatement)
  581. Public
  582. Class function OperatorToken : tjsToken; override;
  583. end;
  584. { TJSModEqAssignStatement - e.g. LHS%=Expr }
  585. TJSModEqAssignStatement = Class(TJSAssignStatement)
  586. Public
  587. Class function OperatorToken : tjsToken; override;
  588. end;
  589. { TJSAddEqAssignStatement - e.g. LHS+=Expr }
  590. TJSAddEqAssignStatement = Class(TJSAssignStatement)
  591. Public
  592. Class function OperatorToken : tjsToken; override;
  593. end;
  594. { TJSSubEqAssignStatement - e.g. LHS-=Expr }
  595. TJSSubEqAssignStatement = Class(TJSAssignStatement)
  596. Public
  597. Class function OperatorToken : tjsToken; override;
  598. end;
  599. { TJSLShiftEqAssignStatement - e.g. LHS<<=Expr }
  600. TJSLShiftEqAssignStatement = Class(TJSAssignStatement)
  601. Public
  602. Class function OperatorToken : tjsToken; override;
  603. end;
  604. { TJSRShiftEqAssignStatement - e.g. LHS>>=Expr keep sign }
  605. TJSRShiftEqAssignStatement = Class(TJSAssignStatement)
  606. Public
  607. Class function OperatorToken : tjsToken; override;
  608. end;
  609. { TJSURShiftEqAssignStatement - e.g. LHS>>>=Expr unsigned, insert zeroes }
  610. TJSURShiftEqAssignStatement = Class(TJSAssignStatement)
  611. Public
  612. Class function OperatorToken : tjsToken; override;
  613. end;
  614. { TJSANDEqAssignStatement - e.g. LHS&=Expr }
  615. TJSANDEqAssignStatement = Class(TJSAssignStatement)
  616. Public
  617. Class function OperatorToken : tjsToken; override;
  618. end;
  619. { TJSOREqAssignStatement - e.g. LHS|=Expr }
  620. TJSOREqAssignStatement = Class(TJSAssignStatement)
  621. Public
  622. Class function OperatorToken : tjsToken; override;
  623. end;
  624. { TJSXOREqAssignStatement - e.g. LHS^=Expr }
  625. TJSXOREqAssignStatement = Class(TJSAssignStatement)
  626. Public
  627. Class function OperatorToken : tjsToken; override;
  628. end;
  629. { TJSVarDeclaration - e.g. Name=Init }
  630. TJSVarDeclaration = Class(TJSElement)
  631. private
  632. FInit: TJSElement;
  633. FIsUnique: Boolean;
  634. FName: TJSString;
  635. FOwnsType: Boolean;
  636. FTyped: TJSTypeDef;
  637. FVarType: TJSVarType;
  638. procedure SetTyped(AValue: TJSTypeDef);
  639. Public
  640. Destructor Destroy; override;
  641. procedure SetForeignType(AValue: TJSTypeDef);
  642. Property Name : TJSString Read FName Write FName;
  643. Property Init : TJSElement Read FInit Write FInit;
  644. // let, var, const
  645. Property VarType : TJSVarType Read FVarType Write FVarType;
  646. // Typescript type. Setting to non-nil value will set OwnsType
  647. Property Typed : TJSTypeDef Read FTyped Write SetTyped;
  648. Property OwnsType : Boolean Read FOwnsType;
  649. Property IsUnique : Boolean Read FIsUnique Write FIsUnique;
  650. end;
  651. { TJSIfStatement - e.g. if (Cond) btrue else bfalse }
  652. TJSIfStatement = Class(TJSStatement)
  653. private
  654. FBFalse: TJSElement;
  655. FBTrue: TJSElement;
  656. FCond: TJSElement;
  657. Public
  658. Destructor Destroy; override;
  659. Property Cond : TJSElement Read FCond Write FCond;
  660. Property BTrue : TJSElement Read FBTrue Write FBTrue;
  661. Property BFalse : TJSElement Read FBFalse Write FBFalse;
  662. end;
  663. { TJSTargetStatement
  664. - base class for statements targetable by continue and break
  665. - TargetName can be empty }
  666. TJSTargetStatement = Class(TJSStatement)
  667. private
  668. FTarget: Cardinal;
  669. FTargetName: TJSString;
  670. Public
  671. Property Target : Cardinal Read FTarget Write FTarget;
  672. Property TargetName : TJSString Read FTargetName Write FTargetName;
  673. end;
  674. { TJSBodyStatement - base class }
  675. TJSBodyStatement = Class(TJSTargetStatement)
  676. private
  677. FBody: TJSElement;
  678. Public
  679. Destructor Destroy; override;
  680. Property Body : TJSElement Read FBody Write FBody;
  681. end;
  682. { TJSCondLoopStatement - base class for do..while and while..do }
  683. TJSCondLoopStatement = Class(TJSBodyStatement)
  684. private
  685. FCond: TJSElement;
  686. Public
  687. Destructor Destroy; override;
  688. Property Cond : TJSElement Read FCond Write FCond;
  689. end;
  690. { TJSWhileStatement - e.g. 'while(Cond) Body' }
  691. TJSWhileStatement = Class(TJSCondLoopStatement);
  692. { TJSDoWhileStatement - e.g. 'do Body while(Cond)' }
  693. TJSDoWhileStatement = Class(TJSWhileStatement);
  694. { TJSForStatement - e.g. 'for(Init;Cond;Incr) Body' }
  695. TJSForStatement = Class(TJSCondLoopStatement)
  696. private
  697. FIncr: TJSElement;
  698. FInit: TJSElement;
  699. Public
  700. Destructor Destroy; override;
  701. Property Incr : TJSElement Read FIncr Write FIncr;
  702. Property Init : TJSElement Read FInit Write FInit;
  703. end;
  704. { TJSForInStatement - e.g. 'for(LHS in List) Body' }
  705. TJSForInStatement = Class(TJSBodyStatement)
  706. private
  707. FLhs: TJSElement;
  708. FList: TJSElement;
  709. Public
  710. Destructor Destroy; override;
  711. Property LHS : TJSElement Read FLHS Write FLHS;
  712. Property List : TJSElement Read FList Write FList;
  713. end;
  714. TJSAliasElement = Class(TCollectionItem)
  715. private
  716. FName : TJSString;
  717. FAlias : TJSString;
  718. Public
  719. Property Name : TJSString Read FName Write FName;
  720. Property Alias : TJSString Read FAlias Write FAlias;
  721. end;
  722. { TJSAliasElements }
  723. TJSAliasElements = Class(TCollection)
  724. private
  725. function GetA(AIndex : Integer): TJSAliasElement;
  726. Public
  727. Function AddAlias : TJSAliasElement;
  728. Property Imports[AIndex : Integer] : TJSAliasElement Read GetA; default;
  729. end;
  730. TJSNamedImportElement = Class(TJSAliasElement);
  731. { TJSNamedImportElements - NamedImports property of TJSImportStatement }
  732. TJSNamedImportElements = Class(TJSAliasElements)
  733. private
  734. function GetE(AIndex : Integer): TJSNamedImportElement;
  735. Public
  736. Function AddElement : TJSNamedImportElement;
  737. Property Imports[AIndex : Integer] : TJSNamedImportElement Read GetE; default;
  738. end;
  739. { TJSImportStatement }
  740. TJSImportStatement = class(TJSStatement)
  741. Private
  742. FDefaultBinding: TJSString;
  743. FExpression: TJSElement;
  744. FModuleName: TJSString;
  745. FNamedImports : TJSNamedImportElements;
  746. FNameSpaceImport: TJSString;
  747. function GetHaveNamedImports: Boolean;
  748. function GetNamedImports: TJSNamedImportElements;
  749. Public
  750. Destructor Destroy; override;
  751. Property ModuleName : TJSString Read FModuleName Write FModuleName;
  752. Property DefaultBinding : TJSString Read FDefaultBinding Write FDefaultBinding;
  753. Property NameSpaceImport : TJSString Read FNameSpaceImport Write FNameSpaceImport;
  754. Property HaveNamedImports : Boolean Read GetHaveNamedImports;
  755. Property NamedImports : TJSNamedImportElements Read GetNamedImports;
  756. // TypeScript : import A = require('a');
  757. Property Expression : TJSElement Read FExpression Write FExpression;
  758. end;
  759. TJSExportNameElement = Class(TJSAliasElement);
  760. { TJSExportNameElements - NamedExports property of TJSExportStatement
  761. e.g. 'Name' or 'Name as Alias'}
  762. TJSExportNameElements = Class(TJSAliasElements)
  763. private
  764. function GetE(AIndex : Integer): TJSExportNameElement;
  765. Public
  766. Function AddElement : TJSExportNameElement;
  767. Property ExportedNames[AIndex : Integer] : TJSExportNameElement Read GetE ;default;
  768. end;
  769. { TJSExportStatement - e.g. 'export Declaration' }
  770. // export [default] Declaration
  771. // export [default] NameSpaceExport [from ModuleName]
  772. // export [default] * [from ModuleName]
  773. // export { ExportNames[1], ExportNames[2], ... } [from ModuleName]
  774. TJSExportStatement = class(TJSStatement)
  775. Private
  776. FDeclaration: TJSElement;
  777. FIsDefault: Boolean;
  778. FModuleName: TJSString;
  779. FNamedExports: TJSExportNameElements;
  780. FNameSpaceExport: TJSString;
  781. function GetHaveNamedExports: Boolean;
  782. function GetNamedExports: TJSExportNameElements;
  783. Public
  784. Destructor Destroy; override;
  785. Property IsDefault : Boolean Read FIsDefault Write FIsDefault; // write "default"
  786. Property Declaration : TJSElement Read FDeclaration Write FDeclaration;
  787. Property NameSpaceExport : TJSString Read FNameSpaceExport Write FNameSpaceExport;// can be '*'
  788. Property ModuleName : TJSString Read FModuleName Write FModuleName;
  789. Property HaveExportNames : Boolean Read GetHaveNamedExports;
  790. Property ExportNames : TJSExportNameElements Read GetNamedExports;
  791. end;
  792. { TJSContinueStatement - e.g. 'continue'}
  793. TJSContinueStatement = Class(TJSTargetStatement);
  794. { TJSBreakStatement - e.g. 'break' }
  795. TJSBreakStatement = Class(TJSTargetStatement);
  796. { TJSReturn - e.g. 'return Expr'}
  797. TJSReturnStatement = Class(TJSStatement)
  798. private
  799. FExpr: TJSElement;
  800. Public
  801. Destructor Destroy; override;
  802. Property Expr : TJSElement Read FExpr Write FExpr;
  803. end;
  804. { TJSCaseElement - element of TJSCaseElements, e.g. 'case Expr: Body' }
  805. TJSCaseElement = Class(TCollectionItem)
  806. private
  807. FBody: TJSElement;
  808. FExpr: TJSelement;
  809. Public
  810. Destructor Destroy; override;
  811. Property Expr : TJSelement Read FExpr Write FExpr;
  812. Property Body : TJSElement Read FBody Write FBody;
  813. end;
  814. { TJSCaseElements - Cases property of TJSSwitch }
  815. TJSCaseElements = Class(TCollection)
  816. private
  817. function GetC(AIndex : Integer): TJSCaseElement;
  818. Public
  819. Function AddCase : TJSCaseElement;
  820. Property Cases[AIndex : Integer] : TJSCaseElement Read GetC ;default;
  821. end;
  822. { TJSSwitch - e.g. switch(Cond) Cases }
  823. TJSSwitchStatement = Class(TJSTargetStatement)
  824. private
  825. FCases: TJSCaseElements;
  826. FCond: TJSelement;
  827. FDefault: TJSCaseElement;
  828. Public
  829. Constructor Create(ALine,AColumn : Integer; const ASource : String = ''); override;
  830. Destructor Destroy; override;
  831. Property Cond : TJSElement Read FCond Write FCond;
  832. Property Cases : TJSCaseElements Read FCases;
  833. Property TheDefault : TJSCaseElement Read FDefault Write FDefault; // one of Cases
  834. end;
  835. { TJSLabeledStatement - e.g. 'TheLabel : A' }
  836. TJSLabeledStatement = Class(TJSUnary)
  837. private
  838. FLabel: TJSLabel;
  839. FTarget: Integer;
  840. Public
  841. Destructor Destroy; override;
  842. Property Target: Integer Read FTarget Write FTarget;
  843. Property TheLabel : TJSLabel Read FLabel Write Flabel;
  844. end;
  845. { TJSTryStatement - e.g. 'try Block catch(Ident) BCatch finally BFinally' }
  846. TJSTryStatement = Class(TJSStatement)
  847. private
  848. FBCatch: TJSElement;
  849. FBFinally: TJSElement;
  850. FBlock: TJSElement;
  851. FIdent: TJSString;
  852. Public
  853. Destructor Destroy; override;
  854. Property Block : TJSElement Read FBlock Write FBlock;
  855. Property BCatch : TJSElement Read FBCatch Write FBCatch;
  856. Property BFinally : TJSElement Read FBFinally Write FBFinally;
  857. Property Ident : TJSString Read FIdent Write FIDent;
  858. end;
  859. TJSTryCatchFinallyStatement = Class(TJSTryStatement);
  860. TJSTryCatchStatement = Class(TJSTryStatement);
  861. TJSTryFinallyStatement = Class(TJSTryStatement);
  862. { TJSFunctionStatement - same as TJSFuncDef, except as a TJSElement }
  863. TJSFunctionStatement = Class(TJSStatement)
  864. private
  865. FFuncDef: TJSFuncDef;
  866. FIsGenerator: Boolean;
  867. Public
  868. Destructor Destroy; override;
  869. Property AFunction : TJSFuncDef Read FFuncDef Write FFuncDef;
  870. Property IsGenerator : Boolean Read FIsGenerator Write FIsGenerator;
  871. end;
  872. TJSFunctionDeclarationStatement = TJSFunctionStatement;
  873. { TJSFunctionBody - the statement block of a function }
  874. TJSFunctionBody = Class(TJSUnary)
  875. private
  876. FIsProgram: Boolean;
  877. Public
  878. Property isProgram : Boolean Read FIsProgram Write FIsProgram;
  879. end;
  880. { TJSElementNode - element of TJSElementNodes }
  881. TJSElementNode = Class(TCollectionItem)
  882. private
  883. FIsAmbient: Boolean;
  884. FIsExport: Boolean;
  885. FNode: TJSElement;
  886. Public
  887. Destructor Destroy; override;
  888. Procedure Assign(aSource : TPersistent); override;
  889. Property Node : TJSElement Read FNode Write FNode;
  890. Property IsAmbient : Boolean Read FIsAmbient Write FIsAmbient;
  891. Property IsExport : Boolean Read FIsExport Write FIsExport;
  892. end;
  893. { TJSTransientElementNode }
  894. // Will not free the node.
  895. TJSTransientElementNode = Class(TJSElementNode)
  896. Public
  897. Destructor Destroy; override;
  898. end;
  899. { TElementNodeEnumerator }
  900. TElementNodeEnumerator = Class(TCollectionEnumerator)
  901. public
  902. function GetCurrent: TJSElementNode; reintroduce;
  903. property Current: TJSElementNode read GetCurrent;
  904. end;
  905. { TJSElementNodes - see TJSSourceElements }
  906. TJSElementNodes = Class(TCollection)
  907. private
  908. FClearNodes: Boolean;
  909. FNodeType: String;
  910. function GetE(AIndex : Integer): TJSElement;
  911. function GetN(AIndex : Integer): TJSElementNode;
  912. Public
  913. Destructor Destroy; override;
  914. Procedure ClearNodes;
  915. Function GetEnumerator : TElementNodeEnumerator; reintroduce;
  916. Function AddNode(aIsAmbient : Boolean = False; aIsExport : Boolean = False) : TJSElementNode;
  917. Function AddNode(aEl : TJSElement; aIsAmbient : Boolean = False; aIsExport : Boolean = False) : TJSElementNode;
  918. Function InsertNode(Index: integer) : TJSElementNode;
  919. Property Nodes[AIndex : Integer] : TJSElementNode Read GetN ; default;
  920. Property JSElements[AIndex : Integer] : TJSElement Read GetE ;
  921. Property NodeType : String Read FNodeType Write FNodeType;
  922. Property DoClearNodes : Boolean Read FClearNodes Write FClearNodes;
  923. end;
  924. { TJSTypedParam }
  925. TJSTypedParam = Class(TJSElementNode)
  926. private
  927. FDestructured: TJSObjectTypeDef;
  928. FIsInferred: Boolean;
  929. FIsOptional: Boolean;
  930. FIsSpread: Boolean;
  931. FName: jsbase.TJSString;
  932. function GetTypeDef: TJSTypeDef;
  933. Public
  934. Procedure Assign(Source : TPersistent); override;
  935. Destructor Destroy; override;
  936. Property Type_ : TJSTypeDef read GetTypeDef;
  937. Property Name : jsbase.TJSString Read FName Write FName;
  938. Property IsInferred : Boolean Read FIsInferred Write FIsInferred;
  939. Property IsOptional : Boolean Read FIsOptional Write FIsOptional;
  940. Property IsSpread : Boolean Read FIsSpread Write FIsSpread;
  941. Property Destructured : TJSObjectTypeDef Read FDestructured Write FDestructured;
  942. end;
  943. { TJSTransientParamType }
  944. TJSTransientParamType = Class(TJSTypedParam)
  945. Public
  946. Destructor Destroy; override;
  947. end;
  948. { TJSTypedParams }
  949. TJSTypedParams = class(TJSElementNodes)
  950. private
  951. function GetNames(aIndex : Integer): TJSString;
  952. function GetParams(aIndex : Integer): TJSTypedParam;
  953. function GetTypes(aIndex : Integer): TJSElement;
  954. Public
  955. Constructor Create; Reintroduce;
  956. Constructor CreateTransient;
  957. function AddParam(aName : jsBase.TJSString) : TJSTypedParam;
  958. Property Params[aIndex : Integer] : TJSTypedParam Read GetParams; default;
  959. Property Types[aIndex : Integer] : TJSElement Read GetTypes;
  960. Property Names[aIndex : Integer] : TJSString Read GetNames;
  961. end;
  962. { TJSSourceElements - a list of elements, every element ends in semicolon,
  963. first Vars, then Functions, finally Statements }
  964. TJSSourceElements = Class(TJSElement)
  965. private
  966. FClasses: TJSElementNodes;
  967. FEnums: TJSElementNodes;
  968. FFunctions: TJSElementNodes;
  969. FInterfaces : TJSElementNodes;
  970. FModules: TJSElementNodes;
  971. FNamespaces: TJSElementNodes;
  972. FStatements: TJSElementNodes;
  973. FTypes: TJSElementNodes;
  974. FVars: TJSElementNodes;
  975. Public
  976. Constructor Create(ALine,AColumn : Integer; const ASource : String = ''); override;
  977. Destructor Destroy; override;
  978. Property Vars : TJSElementNodes Read FVars;
  979. Property Functions : TJSElementNodes Read FFunctions;
  980. Property Statements : TJSElementNodes Read FStatements;
  981. Property Classes : TJSElementNodes Read FClasses;
  982. Property Modules : TJSElementNodes Read FModules;
  983. Property Types : TJSElementNodes Read FTypes;
  984. Property Interfaces : TJSElementNodes Read FInterfaces;
  985. Property Enums : TJSElementNodes Read FEnums;
  986. Property Namespaces : TJSElementNodes Read FNamespaces;
  987. end;
  988. { TJSFunctionBody - the statement block of a function }
  989. TJSNamedElement = class(TJSElement)
  990. Private
  991. FName: TJSString;
  992. Public
  993. Property Name : TJSString Read FName Write FName;
  994. end;
  995. { TJSTypeDef }
  996. TTypeGuardKind = (tgkIs,tgkExtendsCond,tgkExtendsEquals);
  997. TJSTypeDef = class(TJSElement)
  998. Private
  999. FIsInferred: Boolean;
  1000. FIsKeyOf : Boolean;
  1001. FIsExtends : Boolean;
  1002. FIsReadonly: Boolean;
  1003. FIsSpread: Boolean;
  1004. FIsTypeOf: Boolean;
  1005. FTypeGuard: TJSTypeDef;
  1006. FExtendsCond : TJSTypeDef;
  1007. FExtendsTrue : TJSTypeDef;
  1008. FExtendsFalse : TJSTypeDef;
  1009. FTypeGuardKind: TTypeGuardKind;
  1010. Public
  1011. Destructor destroy; override;
  1012. Property IsKeyOf : Boolean Read FIsKeyOf Write FIsKeyof;
  1013. Property IsReadonly : Boolean Read FIsReadonly Write FIsReadonly;
  1014. Property IsInferred : Boolean Read FIsInferred Write FIsInferred;
  1015. Property IsTypeOf : Boolean Read FIsTypeOf Write FIsTypeOf;
  1016. Property IsExtends : Boolean Read FIsExtends Write FIsExtends;
  1017. Property IsSpread : Boolean Read FIsSpread Write FIsSpread;
  1018. property TypeGuard : TJSTypeDef Read FTypeGuard Write FTypeGuard;
  1019. property TypeGuardKind : TTypeGuardKind Read FTypeGuardKind Write FTypeGuardKind;
  1020. Property ExtendsCond : TJSTypeDef Read FExtendsCond Write FExtendsCond;
  1021. Property ExtendsTrue : TJSTypeDef Read FExtendsTrue Write FExtendsTrue;
  1022. Property ExtendsFalse : TJSTypeDef Read FExtendsFalse Write FExtendsFalse;
  1023. end;
  1024. { TJSNamedParamTypeDef }
  1025. TJSNamedParamTypeDef = Class(TJSTypeDef)
  1026. private
  1027. FName: TJSTypeDef;
  1028. FParamType: TJSTypeDef;
  1029. Public
  1030. Destructor Destroy; override;
  1031. Property ParamName : TJSTypeDef Read FName Write FName;
  1032. Property ParamType : TJSTypeDef Read FParamType Write FParamType;
  1033. end;
  1034. { TJSTypeReference }
  1035. TJSTypeReference = class(TJSTypeDef)
  1036. Private
  1037. FName: TJSString;
  1038. Public
  1039. // Type name or filename in import('filename') when IsImport is True
  1040. Property Name : TJSString Read FName Write FName;
  1041. end;
  1042. { TJSImportTypeRef }
  1043. TJSImportTypeRef = Class(TJSTypeReference)
  1044. private
  1045. FFileName: TJSString;
  1046. Public
  1047. Property FileName : TJSString Read FFileName Write FFileName;
  1048. end;
  1049. { TJSTypeFuncCall }
  1050. TJSTypeFuncCall = Class(TJSTypeReference)
  1051. private
  1052. FArgType: TJSTypeDef;
  1053. Public
  1054. Destructor Destroy; override;
  1055. Property ArgType : TJSTypeDef Read FArgType Write FargType;
  1056. end;
  1057. { TJSFixedStringReference }
  1058. { TJSFixedValueReference }
  1059. TJSFixedValueReference = Class(TJSTypeDef)
  1060. private
  1061. FFixedValue: TJSLiteral;
  1062. Public
  1063. destructor Destroy; override;
  1064. Property FixedValue: TJSLiteral Read FFixedValue Write FFixedValue;
  1065. end;
  1066. { TJSStructuredTypeDef }
  1067. TJSStructuredTypeDef = class(TJSTypeDef)
  1068. Private
  1069. FTypeParams: TJSElementNodes;
  1070. FValues: TJSElementNodes;
  1071. Public
  1072. Constructor Create(ALine, AColumn: Integer; const ASource: String=''); override;
  1073. Destructor destroy; override;
  1074. procedure AddValue(aElement : TJSElement); virtual;
  1075. property TypeParams : TJSElementNodes Read FTypeParams Write FTypeParams;
  1076. Property Values : TJSElementNodes Read FValues;
  1077. end;
  1078. { TJSEnumTypeDef }
  1079. { TJSEnumElement }
  1080. TJSEnumElement = Class(TJSElement)
  1081. private
  1082. FName: TJSString;
  1083. FValue: TJSElement;
  1084. Public
  1085. Destructor Destroy; override;
  1086. Property Name : TJSString Read FName Write FName;
  1087. Property Value : TJSElement Read FValue Write FValue;
  1088. end;
  1089. TJSEnumTypeDef = class(TJSStructuredTypeDef)
  1090. private
  1091. FIsConst: Boolean;
  1092. function GetElement(aIndex : Integer): TJSEnumElement;
  1093. function GetName(aIndex : Integer): jsBase.TJSString;
  1094. function GetNameCount: Integer;
  1095. Public
  1096. // names are TJSEnumElement.Name
  1097. Function AddName(aName : jsBase.TJSString) : TJSEnumElement;
  1098. Property IsConst : Boolean Read FIsConst Write FIsConst;
  1099. Property NameCount : Integer Read GetNameCount;
  1100. Property Names[aIndex : Integer] : jsBase.TJSString Read GetName;
  1101. Property Elements[aIndex : Integer] : TJSEnumElement Read GetElement; default;
  1102. end;
  1103. { TJSArrowFunctionTypeDef }
  1104. { TJSNamedTypedElement }
  1105. TJSNamedTypedElement = class(TJSNamedElement)
  1106. private
  1107. FElementType: TJSTypeDef;
  1108. Public
  1109. Destructor Destroy; override;
  1110. Property ElementType : TJSTypeDef Read FElementType Write FElementType;
  1111. end;
  1112. { TJSFunctionParamDef }
  1113. TJSFunctionParamDef = class(TJSNamedTypedElement)
  1114. private
  1115. function GetParamType: TJSTypeDef;
  1116. procedure SetParamType(AValue: TJSTypeDef);
  1117. Public
  1118. Property ParamType : TJSTypeDef Read GetParamType Write SetParamType;
  1119. end;
  1120. TJSArrowFunctionTypeDef = class(TJSTypeDef) // Params are in values.
  1121. private
  1122. FFunction: TJSFuncDef;
  1123. Public
  1124. Constructor Create(ALine,AColumn : Integer; Const ASource : String = ''); override;
  1125. Destructor Destroy; override;
  1126. Property aFunction : TJSFuncDef Read FFunction Write FFunction;
  1127. end;
  1128. { TJSUnionTypeDef }
  1129. TJSUnionOrTupleTypeDef = Class(TJSStructuredTypeDef)
  1130. private
  1131. function GetType(aIndex : Integer): TJSTypeDef;
  1132. function GetTypeCount: Integer;
  1133. Public
  1134. Property Types[aIndex : Integer] : TJSTypeDef Read GetType;
  1135. property TypeCount : Integer Read GetTypeCount;
  1136. end;
  1137. { TJSTupleTypeDef }
  1138. TJSTupleTypeDef = class(TJSUnionOrTupleTypeDef)
  1139. Public
  1140. Function GetEqualTypes : Boolean;
  1141. end;
  1142. TOnlyConstants = (ocFalse,ocTrue,ocAllSameTypes);
  1143. { TJSUnionOrIntersectTypeDef }
  1144. TJSUnionOrIntersectTypeDef = class(TJSUnionOrTupleTypeDef)
  1145. private
  1146. FAllowEmpty: Boolean;
  1147. Public
  1148. Function GetOnlyConstants : TOnlyConstants;
  1149. Property AllowEmpty : Boolean Read FAllowEmpty Write FAllowEmpty;
  1150. end;
  1151. TJSUnionTypeDef = Class(TJSUnionOrIntersectTypeDef);
  1152. TJSInterSectionTypeDef = class(TJSUnionOrIntersectTypeDef);
  1153. { TJSArrayTypeDef }
  1154. TJSArrayTypeDef = Class(TJSTypeDef)
  1155. private
  1156. FIndexType,
  1157. FBaseType: TJSTypeDef;
  1158. Public
  1159. Destructor Destroy; override;
  1160. Property BaseType : TJSTypeDef Read FBaseType Write FBaseType;
  1161. Property IndexType : TJSTypeDef Read FIndexType Write FIndexType;
  1162. end;
  1163. { TJSGenericTypeRef }
  1164. TJSGenericTypeRef = Class(TJSStructuredTypeDef)
  1165. private
  1166. FBaseType: TJSTypeDef;
  1167. function GetType(aIndex : Integer): TJSTypeDef;
  1168. function GetTypeCount: Integer;
  1169. Public
  1170. Destructor destroy; override;
  1171. Property BaseType : TJSTypeDef Read FBaseType Write FBaseType;
  1172. Property ParamTypes[aIndex : Integer] : TJSTypeDef Read GetType;
  1173. property ParamTypeCount : Integer Read GetTypeCount;
  1174. end;
  1175. TAccessibility = (accDefault,accPrivate,accProtected,accPublic);
  1176. { TJSObjectTypeElementDef }
  1177. TKeyOptionality = (koDefault,koOptional,koForceOptional,koDisableOptional);
  1178. TKeyOptionalities = Set of TKeyOptionality;
  1179. TJSObjectTypeElementDef = Class(TJSNamedTypedElement)
  1180. private
  1181. FAccessibility: TAccessibility;
  1182. FIsReadOnly: Boolean;
  1183. FIsStatic: Boolean;
  1184. FOptional: TKeyOptionality;
  1185. FIsAbstract : Boolean;
  1186. FIsSet : Boolean;
  1187. FIsGet : Boolean;
  1188. Public
  1189. Destructor Destroy; override;
  1190. Property Optional : TKeyOptionality Read FOptional Write FOptional;
  1191. Property Accessibility : TAccessibility Read FAccessibility Write FAccessibility;
  1192. Property IsStatic : Boolean Read FIsStatic Write FIsStatic;
  1193. Property IsReadOnly : Boolean Read FIsReadOnly Write FIsReadOnly;
  1194. Property IsAbstract : Boolean Read FIsAbstract Write FIsAbstract;
  1195. Property IsGet : Boolean Read FIsGet Write FIsGet;
  1196. Property IsSet : Boolean Read FIsSet Write FIsSet;
  1197. end;
  1198. { TJSPropertyDeclaration }
  1199. TJSPropertyDeclaration = Class(TJSObjectTypeElementDef)
  1200. private
  1201. function GetFixedStringValue: jsBase.TJSString;
  1202. Public
  1203. Property FixedStringValue : jsBase.TJSString Read GetFixedStringValue;
  1204. end;
  1205. { TJSClassConstDeclaration }
  1206. TJSClassConstDeclaration = Class(TJSObjectTypeElementDef)
  1207. private
  1208. FValue: TJSElement;
  1209. Public
  1210. Destructor Destroy; override;
  1211. Property Value : TJSElement Read FValue Write FValue;
  1212. end;
  1213. { TJSIndexSignatureDeclaration }
  1214. TJSIndexSignatureDeclaration = Class(TJSObjectTypeElementDef)
  1215. private
  1216. FIndexName: TJSString;
  1217. FindexType: TJSString;
  1218. FInIndexType: TJSTypeDef;
  1219. FIsFunction: Boolean;
  1220. Public
  1221. Destructor Destroy; override;
  1222. Property IndexName : TJSString Read FIndexName Write FindexName;
  1223. Property IndexType : TJSString Read FindexType Write FindexType;
  1224. Property InIndexType : TJSTypeDef Read FInIndexType Write FInIndexType;
  1225. Property IsFunction : Boolean Read FIsFunction Write FIsFunction;
  1226. end;
  1227. { TJSMethodDeclaration }
  1228. TJSMethodDeclaration = Class(TJSObjectTypeElementDef)
  1229. private
  1230. FFuncDef: TJSFuncDef;
  1231. FTypeParams: TJSElementNodes;
  1232. Public
  1233. Destructor Destroy; override;
  1234. Property TypeParams : TJSElementNodes Read FTypeParams Write FTypeParams;
  1235. Property FuncDef : TJSFuncDef Read FFuncDef Write FFuncDef;
  1236. end;
  1237. { TJSObjectTypeDef }
  1238. TJSObjectTypeDef = Class(TJSStructuredTypeDef)
  1239. private
  1240. FName: TJSString;
  1241. function GetElement(aIndex : Integer): TJSObjectTypeElementDef;
  1242. function GetElementCount: Integer;
  1243. Public
  1244. procedure AddElement(const aEl: TJSObjectTypeElementDef);
  1245. function HasSetter(const aName: TJSString): Boolean;
  1246. Function HasAccessMembers(aAccess : TAccessibility) : Boolean;
  1247. Function HasProperties : Boolean;
  1248. Function IsFunctionDef : Boolean;
  1249. Function FunctionDef : TJSFuncDef;
  1250. Property Name : TJSString Read FName Write FName;
  1251. Property Elements[aIndex : Integer] : TJSObjectTypeElementDef Read GetElement;
  1252. Property ElementCount : Integer Read GetElementCount;
  1253. end;
  1254. { TJSTypeDeclaration }
  1255. TJSTypeDeclaration = class(TJSNamedElement)
  1256. Private
  1257. FTypeDef : TJSTypeDef;
  1258. FTypeParams : TJSElementNodes;
  1259. Public
  1260. Destructor Destroy; override;
  1261. Property TypeParams : TJSElementNodes Read FTypeParams Write FTypeParams;
  1262. Property TypeDef : TJSTypeDef Read FTypeDef Write FTypeDef;
  1263. end;
  1264. { TJSTypeStatement }
  1265. TJSTypeStatement = Class(TJSDeclarationStatement)
  1266. private
  1267. FTypeDecl: TJSTypeDeclaration;
  1268. Public
  1269. Destructor Destroy; override;
  1270. Function GetDeclaration: TJSElement; override;
  1271. Property TypeDecl : TJSTypeDeclaration Read FTypeDecl Write FTypeDecl;
  1272. end;
  1273. { TJSEnumDeclaration }
  1274. TJSEnumDeclaration = Class(TJSTypeDeclaration)
  1275. private
  1276. function GetEnumDef: TJSEnumTypeDef;
  1277. procedure SetEnumDef(AValue: TJSEnumTypeDef);
  1278. Public
  1279. Property EnumDef : TJSEnumTypeDef Read GetEnumDef Write SetEnumDef;
  1280. end;
  1281. { TJSTypeStatement }
  1282. { TJSEnumStatement }
  1283. TJSEnumStatement = Class(TJSDeclarationStatement)
  1284. private
  1285. FEnumDecl : TJSEnumDeclaration;
  1286. Public
  1287. Destructor Destroy; override;
  1288. Function GetDeclaration: TJSElement; override;
  1289. Property EnumDecl : TJSEnumDeclaration Read FEnumDecl Write FEnumDecl;
  1290. end;
  1291. { TJSClassDeclaration }
  1292. TJSMembersDeclaration = Class(TJSElement)
  1293. Private
  1294. FMembers: TJSSourceElements;
  1295. procedure SetMembers(AValue: TJSSourceElements);
  1296. Public
  1297. Destructor Destroy; override;
  1298. property Members : TJSSourceElements Read FMembers Write SetMembers;
  1299. end;
  1300. TJSNamedMembersDeclaration = Class(TJSMembersDeclaration)
  1301. Private
  1302. FName: TJSString;
  1303. Public
  1304. Property Name : TJSString Read FName Write FName;
  1305. end;
  1306. TJSClassDeclaration = Class(TJSNamedMembersDeclaration)
  1307. private
  1308. FExtends: TJSTypeDef;
  1309. FImplementsTypes: TJSElementNodes;
  1310. FisAbstract: Boolean;
  1311. FTypeParams: TJSElementNodes;
  1312. Public
  1313. Destructor Destroy; override;
  1314. Property TypeParams : TJSElementNodes Read FTypeParams Write FTypeParams;
  1315. Property ImplementsTypes : TJSElementNodes Read FImplementsTypes Write FImplementsTypes;
  1316. Property Extends : TJSTypeDef Read FExtends Write FExtends;
  1317. Property IsAbstract : Boolean Read FisAbstract Write FisAbstract;
  1318. end;
  1319. //
  1320. { TJSAmbientClassDeclaration }
  1321. TJSAmbientClassDeclaration = class(TJSClassDeclaration)
  1322. private
  1323. FClassDef: TJSObjectTypeDef;
  1324. Public
  1325. Destructor Destroy; override;
  1326. Property ClassDef : TJSObjectTypeDef Read FClassDef Write FClassDef;
  1327. end;
  1328. TJSAmbientClassDeclarationArray = Array of TJSAmbientClassDeclaration;
  1329. { TJSClassStatement }
  1330. TJSClassStatement = Class(TJSDeclarationStatement)
  1331. private
  1332. FDecl: TJSClassDeclaration;
  1333. Public
  1334. Destructor Destroy; override;
  1335. Function GetDeclaration: TJSElement; override;
  1336. Property Decl : TJSClassDeclaration Read FDecl Write FDecl;
  1337. end;
  1338. { TJSInterfaceDeclaration }
  1339. TJSInterfaceDeclaration = Class(TJSObjectTypeDef)
  1340. private
  1341. FExtends: TJSElementNodes;
  1342. Public
  1343. Destructor Destroy; override;
  1344. Procedure AddExtends(Const aName : TJSString);
  1345. property Extends : TJSElementNodes Read FExtends;
  1346. end;
  1347. TJSInterfaceDeclarationArray = array of TJSInterfaceDeclaration;
  1348. { TJSInterfaceStatement }
  1349. TJSInterfaceStatement = Class(TJSDeclarationStatement)
  1350. private
  1351. FDecl: TJSInterfaceDeclaration;
  1352. Public
  1353. Destructor Destroy; override;
  1354. Function GetDeclaration: TJSElement; override;
  1355. Property Decl : TJSInterfaceDeclaration Read FDecl Write FDecl;
  1356. end;
  1357. { TJSIndexSignatureStatement }
  1358. TJSIndexSignatureStatement = Class(TJSDeclarationStatement)
  1359. private
  1360. FDecl: TJSIndexSignatureDeclaration;
  1361. Public
  1362. Destructor Destroy; override;
  1363. Function GetDeclaration: TJSElement; override;
  1364. Property Decl : TJSIndexSignatureDeclaration Read FDecl Write FDecl;
  1365. end;
  1366. { TJSModuleDeclaration }
  1367. TJSModuleDeclaration = Class(TJSNamedMembersDeclaration);
  1368. { TJSModuleStatement }
  1369. TJSModuleStatement = Class(TJSDeclarationStatement)
  1370. private
  1371. FDecl: TJSModuleDeclaration;
  1372. Public
  1373. Destructor Destroy; override;
  1374. Function GetDeclaration: TJSElement; override;
  1375. Property Decl : TJSModuleDeclaration Read FDecl Write FDecl;
  1376. end;
  1377. { TJSNamespaceDeclaration }
  1378. TJSNamespaceDeclaration = Class(TJSNamedMembersDeclaration)
  1379. Private
  1380. FIsGlobal : Boolean;
  1381. Public
  1382. Property IsGlobal : Boolean Read FIsGLobal Write FIsGlobal;
  1383. end;
  1384. { TJSNameSpaceStatement }
  1385. TJSNameSpaceStatement = Class(TJSDeclarationStatement)
  1386. private
  1387. FDecl: TJSNameSpaceDeclaration;
  1388. Public
  1389. Destructor Destroy; override;
  1390. Function GetDeclaration: TJSElement; override;
  1391. Property Decl : TJSNameSpaceDeclaration Read FDecl Write FDecl;
  1392. end;
  1393. implementation
  1394. { TJSTupleTypeDef }
  1395. function TJSTupleTypeDef.GetEqualTypes: Boolean;
  1396. Var
  1397. I : Integer;
  1398. N : TJSString;
  1399. begin
  1400. I:=Values.Count-1;
  1401. Result:=True;
  1402. While (I>=0) and (Result) do
  1403. begin
  1404. Result:=(Values[I].Node is TJSTypeReference);
  1405. if Result then
  1406. if I=Values.Count-1 then
  1407. N:=(Values[I].Node as TJSTypeReference).Name
  1408. else
  1409. Result:=N=(Values[I].Node as TJSTypeReference).Name;
  1410. Dec(i);
  1411. end;
  1412. end;
  1413. { TJSUnionOrIntersectTypeDef }
  1414. function TJSUnionOrIntersectTypeDef.GetOnlyConstants: TOnlyConstants;
  1415. Var
  1416. I : integer;
  1417. FT : TJSType;
  1418. Ref : TJSFixedValueReference;
  1419. begin
  1420. Result:=ocAllSameTypes;
  1421. I:=Values.Count-1;
  1422. While (I>=0) and (Result<>ocFalse) do
  1423. begin
  1424. if Not (Values[I].Node is TJSFixedValueReference) then
  1425. Result:=ocFalse
  1426. else
  1427. begin
  1428. Ref:=Values[I].Node as TJSFixedValueReference;
  1429. If (I=Values.Count-1) then
  1430. ft:=Ref.FixedValue.Value.ValueType
  1431. else if (ft<>Ref.FixedValue.Value.ValueType) then
  1432. Result:=ocTrue
  1433. end;
  1434. Dec(I);
  1435. end;
  1436. end;
  1437. { TJSTransientParamType }
  1438. destructor TJSTransientParamType.Destroy;
  1439. begin
  1440. FDestructured:=Nil;
  1441. FNode:=nil;
  1442. inherited Destroy;
  1443. end;
  1444. { TJSTransientElementNode }
  1445. destructor TJSTransientElementNode.Destroy;
  1446. begin
  1447. Node:=Nil;
  1448. inherited Destroy;
  1449. end;
  1450. { TElementNodeEnumerator }
  1451. function TElementNodeEnumerator.GetCurrent: TJSElementNode;
  1452. begin
  1453. Result:=(Inherited GetCurrent) as TJSElementNode
  1454. end;
  1455. { TJSClassConstDeclaration }
  1456. destructor TJSClassConstDeclaration.Destroy;
  1457. begin
  1458. FreeAndNil(FValue);
  1459. inherited Destroy;
  1460. end;
  1461. { TTJSTypeFuncCall }
  1462. destructor TJSTypeFuncCall.Destroy;
  1463. begin
  1464. FreeAndNil(FArgType);
  1465. inherited Destroy;
  1466. end;
  1467. { TJSTypedParam }
  1468. function TJSTypedParam.GetTypeDef: TJSTypeDef;
  1469. begin
  1470. if Assigned(Node) then
  1471. Result:=Node as TJSTypeDef
  1472. else
  1473. Result:=Nil;
  1474. end;
  1475. procedure TJSTypedParam.Assign(Source: TPersistent);
  1476. Var
  1477. aParam : TJSTypedParam absolute Source;
  1478. begin
  1479. If Source is TJSTypedParam then
  1480. begin
  1481. FDestructured:=aParam.FDestructured;
  1482. FIsInferred:=aParam.IsInferred;
  1483. FIsOptional:=aParam.FIsOptional;
  1484. FIsSpread:=aParam.FIsSpread;
  1485. FName:=aParam.Name;
  1486. end;
  1487. inherited Assign(Source);
  1488. end;
  1489. destructor TJSTypedParam.Destroy;
  1490. begin
  1491. FreeAndNil(FDestructured);
  1492. inherited Destroy;
  1493. end;
  1494. { TJSTypeDef }
  1495. destructor TJSTypeDef.destroy;
  1496. begin
  1497. FreeAndNil(FTypeGuard);
  1498. FreeAndNil(FExtendsCond);
  1499. FreeAndNil(FExtendsTrue);
  1500. FreeAndNil(FExtendsFalse);
  1501. inherited destroy;
  1502. end;
  1503. { TNamedParamTypeDef }
  1504. destructor TJSNamedParamTypeDef.Destroy;
  1505. begin
  1506. FreeAndNil(FName);
  1507. FreeAndNil(FParamType);
  1508. inherited Destroy;
  1509. end;
  1510. { TJSEnumElement }
  1511. destructor TJSEnumElement.Destroy;
  1512. begin
  1513. FreeAndNil(FValue);
  1514. inherited Destroy;
  1515. end;
  1516. { TJSIndexSignatureDeclaration }
  1517. destructor TJSIndexSignatureDeclaration.Destroy;
  1518. begin
  1519. FreeAndNil(FInIndexType);
  1520. inherited Destroy;
  1521. end;
  1522. { TJSVariableStatement }
  1523. destructor TJSVariableStatement.Destroy;
  1524. begin
  1525. FreeAndNil(FA);
  1526. inherited Destroy;
  1527. end;
  1528. function TJSVariableStatement.GetDeclaration: TJSElement;
  1529. begin
  1530. Result:=FA;
  1531. end;
  1532. { TJSNameSpaceStatement }
  1533. destructor TJSNameSpaceStatement.Destroy;
  1534. begin
  1535. FreeAndNil(FDecl);
  1536. inherited Destroy;
  1537. end;
  1538. function TJSNameSpaceStatement.GetDeclaration: TJSElement;
  1539. begin
  1540. Result:=FDecl;
  1541. end;
  1542. { TJSModuleStatement }
  1543. destructor TJSModuleStatement.Destroy;
  1544. begin
  1545. FreeAndNil(FDecl);
  1546. inherited Destroy;
  1547. end;
  1548. function TJSModuleStatement.GetDeclaration: TJSElement;
  1549. begin
  1550. Result:=FDecl;
  1551. end;
  1552. { TJSFixedValueReference }
  1553. destructor TJSFixedValueReference.destroy;
  1554. begin
  1555. FreeAndNil(FFixedValue);
  1556. Inherited;
  1557. end;
  1558. { TJSAmbientClassDeclaration }
  1559. destructor TJSAmbientClassDeclaration.Destroy;
  1560. begin
  1561. if Members<>nil then
  1562. begin
  1563. Members.Vars.ClearNodes;
  1564. Members.Functions.ClearNodes;
  1565. end;
  1566. FreeAndNil(FClassDef);
  1567. inherited Destroy;
  1568. end;
  1569. { TJSClassDeclaration }
  1570. destructor TJSClassDeclaration.Destroy;
  1571. begin
  1572. FreeAndNil(FImplementsTypes);
  1573. FreeAndNil(FTypeParams);
  1574. FreeAndNil(FExtends);
  1575. inherited Destroy;
  1576. end;
  1577. { TJSPropertyDeclaration }
  1578. function TJSPropertyDeclaration.GetFixedStringValue: jsBase.TJSString;
  1579. begin
  1580. if ElementType is TJSFixedValueReference then
  1581. Result:=TJSFixedValueReference(ElementType).FixedValue.Value.AsString
  1582. else
  1583. Result:='';
  1584. end;
  1585. { TJSIndexSignatureStatement }
  1586. destructor TJSIndexSignatureStatement.Destroy;
  1587. begin
  1588. FreeAndNil(FDecl);
  1589. inherited Destroy;
  1590. end;
  1591. function TJSIndexSignatureStatement.GetDeclaration: TJSElement;
  1592. begin
  1593. Result:=FDecl;
  1594. end;
  1595. { TJSClassStatement }
  1596. destructor TJSClassStatement.Destroy;
  1597. begin
  1598. FreeAndNil(FDecl);
  1599. inherited Destroy;
  1600. end;
  1601. function TJSClassStatement.GetDeclaration: TJSElement;
  1602. begin
  1603. Result:=FDecl;
  1604. end;
  1605. { TJSMethodDeclaration }
  1606. destructor TJSMethodDeclaration.Destroy;
  1607. begin
  1608. FreeAndNil(FTypeParams);
  1609. FreeAndNil(FFuncDef);
  1610. inherited Destroy;
  1611. end;
  1612. { TJSNamedTypedElement }
  1613. destructor TJSNamedTypedElement.Destroy;
  1614. begin
  1615. FreeAndNil(FElementType);
  1616. inherited Destroy;
  1617. end;
  1618. { TJSInterfaceDeclarationStatement }
  1619. destructor TJSInterfaceStatement.Destroy;
  1620. begin
  1621. FreeAndNil(FDecl);
  1622. inherited Destroy;
  1623. end;
  1624. function TJSInterfaceStatement.GetDeclaration: TJSElement;
  1625. begin
  1626. Result:=FDecl;
  1627. end;
  1628. { TJSInterfaceDeclaration }
  1629. destructor TJSInterfaceDeclaration.Destroy;
  1630. begin
  1631. FreeAndNil(FExtends);
  1632. inherited Destroy;
  1633. end;
  1634. procedure TJSInterfaceDeclaration.AddExtends(const aName: TJSString);
  1635. Var
  1636. Lit : TJSLiteral;
  1637. begin
  1638. if FExtends=Nil then
  1639. FExtends:=TJSElementNodes.Create(TJSElementNode);
  1640. Lit:=TJSLiteral.Create(0,0,'');
  1641. Lit.Value.AsString:=aName;
  1642. FExtends.AddNode().Node:=Lit;
  1643. end;
  1644. { TJSEnumStatement }
  1645. destructor TJSEnumStatement.Destroy;
  1646. begin
  1647. FreeAndNil(FEnumDecl);
  1648. inherited Destroy;
  1649. end;
  1650. function TJSEnumStatement.GetDeclaration: TJSElement;
  1651. begin
  1652. Result:=FEnumDecl;
  1653. end;
  1654. { TJSEnumTypeDef }
  1655. function TJSEnumTypeDef.GetName(aIndex : Integer): jsBase.TJSString;
  1656. begin
  1657. Result:=GetElement(aIndex).Name;
  1658. end;
  1659. function TJSEnumTypeDef.GetElement(aIndex : Integer): TJSEnumElement;
  1660. begin
  1661. Result:=TJSEnumElement(Values.Nodes[aIndex].Node)
  1662. end;
  1663. function TJSEnumTypeDef.GetNameCount: Integer;
  1664. begin
  1665. Result:=Values.Count;
  1666. end;
  1667. Function TJSEnumTypeDef.AddName(aName: jsBase.TJSString) : TJSEnumElement;
  1668. begin
  1669. Result:=TJSEnumElement.Create(0,0,'');
  1670. Result.Name:=aName;
  1671. Values.AddNode().Node:=Result
  1672. end;
  1673. { TJSEnumDeclaration }
  1674. function TJSEnumDeclaration.GetEnumDef: TJSEnumTypeDef;
  1675. begin
  1676. Result:=Self.TypeDef as TJSEnumTypeDef;
  1677. end;
  1678. procedure TJSEnumDeclaration.SetEnumDef(AValue: TJSEnumTypeDef);
  1679. begin
  1680. TypeDef:=aValue;
  1681. end;
  1682. { TJSFunctionParamDef }
  1683. function TJSFunctionParamDef.GetParamType: TJSTypeDef;
  1684. begin
  1685. Result:=ElementType;
  1686. end;
  1687. procedure TJSFunctionParamDef.SetParamType(AValue: TJSTypeDef);
  1688. begin
  1689. ElementType:=aValue;
  1690. end;
  1691. { TJSArrowFunctionTypeDef }
  1692. constructor TJSArrowFunctionTypeDef.Create(ALine, AColumn: Integer; const ASource: String);
  1693. begin
  1694. inherited Create(ALine, AColumn, ASource);
  1695. FFunction:=TJSFuncDef.Create;
  1696. end;
  1697. destructor TJSArrowFunctionTypeDef.Destroy;
  1698. begin
  1699. FreeAndNil(FFunction);
  1700. inherited Destroy;
  1701. end;
  1702. { TJSArrowFunction }
  1703. class function TJSArrowFunction.OperatorToken: tjsToken;
  1704. begin
  1705. Result:=tjsArrow;
  1706. end;
  1707. { TJSObjectTypeDef }
  1708. function TJSObjectTypeDef.GetElement(aIndex : Integer): TJSObjectTypeElementDef;
  1709. begin
  1710. Result:=Values[aIndex].Node as TJSObjectTypeElementDef;
  1711. end;
  1712. function TJSObjectTypeDef.GetElementCount: Integer;
  1713. begin
  1714. Result:=Values.Count;
  1715. end;
  1716. Procedure TJSObjectTypeDef.AddElement(const aEl: TJSObjectTypeElementDef);
  1717. begin
  1718. Values.AddNode(False).Node:=aEl;
  1719. end;
  1720. Function TJSObjectTypeDef.HasSetter(Const aName : TJSString) : Boolean;
  1721. Var
  1722. I : Integer;
  1723. aEl : TJSObjectTypeElementDef;
  1724. begin
  1725. Result:=False;
  1726. I:=ElementCount-1;
  1727. While (Not Result) and (I>=0) do
  1728. begin
  1729. aEl:=Elements[i];
  1730. Result:=(aName=aEl.Name) and (aEl is TJSMethodDeclaration) and (aEl.IsSet);
  1731. Dec(I);
  1732. end;
  1733. end;
  1734. function TJSObjectTypeDef.HasAccessMembers(aAccess: TAccessibility): Boolean;
  1735. Var
  1736. I : integer;
  1737. begin
  1738. Result:=False;
  1739. I:=ElementCount-1;
  1740. While (Not Result) and (I>=0) do
  1741. begin
  1742. Result:=Elements[i].Accessibility=aAccess;
  1743. Dec(I);
  1744. end;
  1745. end;
  1746. function TJSObjectTypeDef.HasProperties: Boolean;
  1747. Var
  1748. I : Integer;
  1749. begin
  1750. Result:=False;
  1751. I:=ElementCount-1;
  1752. While (not Result) and (I>=0) do
  1753. begin
  1754. Result:=Elements[I] is TJSPropertyDeclaration;
  1755. Dec(i);
  1756. end;
  1757. end;
  1758. function TJSObjectTypeDef.IsFunctionDef: Boolean;
  1759. begin
  1760. Result:=(ElementCount=1) and (Elements[0] is TJSMethodDeclaration) and (TJSMethodDeclaration(Elements[0]).Name='');
  1761. end;
  1762. function TJSObjectTypeDef.FunctionDef: TJSFuncDef;
  1763. begin
  1764. if IsFunctionDef then
  1765. Result:=TJSMethodDeclaration(Elements[0]).FuncDef
  1766. else
  1767. Result:=Nil;
  1768. end;
  1769. { TJSObjectTypeElementDef }
  1770. destructor TJSObjectTypeElementDef.Destroy;
  1771. begin
  1772. FreeAndNil(FElementType);
  1773. inherited Destroy;
  1774. end;
  1775. { TJSArrayTypeDef }
  1776. destructor TJSArrayTypeDef.Destroy;
  1777. begin
  1778. FreeAndNil(FIndexType);
  1779. FreeAndNil(FBaseType);
  1780. inherited Destroy;
  1781. end;
  1782. { TJSUnionTypeDef }
  1783. function TJSUnionOrTupleTypeDef.GetType(aIndex : Integer): TJSTypeDef;
  1784. begin
  1785. Result:=Values.Nodes[aIndex].Node as TJSTypeDef;
  1786. end;
  1787. function TJSUnionOrTupleTypeDef.GetTypeCount: Integer;
  1788. begin
  1789. Result:=Values.Count;
  1790. end;
  1791. { TJSTypeStatement }
  1792. destructor TJSTypeStatement.Destroy;
  1793. begin
  1794. FreeAndNil(FTypeDecl);
  1795. inherited Destroy;
  1796. end;
  1797. function TJSTypeStatement.GetDeclaration: TJSElement;
  1798. begin
  1799. Result:=FTypeDecl;
  1800. end;
  1801. { TJSTypeDeclaration }
  1802. destructor TJSTypeDeclaration.Destroy;
  1803. begin
  1804. // Writeln('Destroying ',ClassName);
  1805. FreeAndNil(FTypeDef);
  1806. FreeAndNil(FTypeParams);
  1807. inherited Destroy;
  1808. end;
  1809. { TJSGenericTypeRef }
  1810. function TJSGenericTypeRef.GetType(aIndex : Integer): TJSTypeDef;
  1811. begin
  1812. Result:=Values[aIndex].Node as TJSTypeDef;
  1813. end;
  1814. function TJSGenericTypeRef.GetTypeCount: Integer;
  1815. begin
  1816. Result:=Values.Count;
  1817. end;
  1818. destructor TJSGenericTypeRef.destroy;
  1819. begin
  1820. FreeAndNil(FBaseType);
  1821. inherited destroy;
  1822. end;
  1823. { TJSStructuredTypeDef }
  1824. constructor TJSStructuredTypeDef.Create(ALine, AColumn: Integer; const ASource: String);
  1825. begin
  1826. inherited Create(ALine, AColumn, ASource);
  1827. FValues:=TJSElementNodes.Create(TJSElementNode);
  1828. end;
  1829. destructor TJSStructuredTypeDef.destroy;
  1830. begin
  1831. FreeAndNil(FTypeParams);
  1832. FreeAndNil(FValues);
  1833. Inherited;
  1834. end;
  1835. procedure TJSStructuredTypeDef.AddValue(aElement: TJSElement);
  1836. begin
  1837. FValues.AddNode.Node:=aElement;
  1838. end;
  1839. { TJSMembersDeclaration }
  1840. procedure TJSMembersDeclaration.SetMembers(AValue: TJSSourceElements);
  1841. begin
  1842. if FMembers=AValue then Exit;
  1843. FMembers:=AValue;
  1844. end;
  1845. destructor TJSMembersDeclaration.Destroy;
  1846. begin
  1847. FreeAndNil(FMembers);
  1848. inherited Destroy;
  1849. end;
  1850. { TJSTypedParams }
  1851. function TJSTypedParams.GetNames(aIndex : Integer): TJSString;
  1852. begin
  1853. Result:=Params[aIndex].Name;
  1854. end;
  1855. function TJSTypedParams.GetParams(aIndex : Integer): TJSTypedParam;
  1856. begin
  1857. Result:=TJSTypedParam(Items[aIndex]);
  1858. end;
  1859. function TJSTypedParams.GetTypes(aIndex : Integer): TJSElement;
  1860. begin
  1861. Result:=Params[aIndex].Node;
  1862. end;
  1863. constructor TJSTypedParams.Create;
  1864. begin
  1865. Inherited Create(TJSTypedParam);
  1866. end;
  1867. constructor TJSTypedParams.CreateTransient;
  1868. begin
  1869. Inherited Create(TJSTransientParamType);
  1870. end;
  1871. function TJSTypedParams.AddParam(aName: jsBase.TJSString): TJSTypedParam;
  1872. begin
  1873. Result:=add as TJSTypedParam;
  1874. Result.Name:=aName;
  1875. end;
  1876. { TJSAliasElements }
  1877. function TJSAliasElements.GetA(AIndex: Integer): TJSAliasElement;
  1878. begin
  1879. Result:=TJSAliasElement(Items[aIndex])
  1880. end;
  1881. function TJSAliasElements.AddAlias: TJSAliasElement;
  1882. begin
  1883. Result:=TJSAliasElement(add);
  1884. end;
  1885. { TJSNamedExportElements }
  1886. function TJSExportNameElements.GetE(AIndex: Integer): TJSExportNameElement;
  1887. begin
  1888. Result:=TJSExportNameElement(Items[aIndex]);
  1889. end;
  1890. function TJSExportNameElements.AddElement: TJSExportNameElement;
  1891. begin
  1892. Result:=TJSExportNameElement(Add);
  1893. end;
  1894. { TJSExportStatement }
  1895. function TJSExportStatement.GetNamedExports: TJSExportNameElements;
  1896. begin
  1897. If FNamedExports=Nil then
  1898. FNamedExports:=TJSExportNameElements.Create(TJSExportNameElement);
  1899. Result:=FNamedExports;
  1900. end;
  1901. function TJSExportStatement.GetHaveNamedExports: Boolean;
  1902. begin
  1903. Result:=Assigned(FNamedExports)
  1904. end;
  1905. destructor TJSExportStatement.Destroy;
  1906. begin
  1907. FreeAndNil(FNamedExports);
  1908. FreeAndNil(FDeclaration);
  1909. inherited Destroy;
  1910. end;
  1911. { TJSImportStatement }
  1912. function TJSImportStatement.GetNamedImports: TJSNamedImportElements;
  1913. begin
  1914. if FNamedImports=Nil then
  1915. FNamedImports:=TJSNamedImportElements.Create(TJSNamedImportElement);
  1916. Result:=FNamedImports;
  1917. end;
  1918. function TJSImportStatement.GetHaveNamedImports: Boolean;
  1919. begin
  1920. Result:=Assigned(FNamedImports);
  1921. end;
  1922. destructor TJSImportStatement.Destroy;
  1923. begin
  1924. FreeAndNil(FNamedImports);
  1925. FreeAndNil(FExpression);
  1926. inherited Destroy;
  1927. end;
  1928. { TJSNamedImportElements }
  1929. function TJSNamedImportElements.GetE(aIndex: Integer): TJSNamedImportElement;
  1930. begin
  1931. Result:=TJSNamedImportElement(Items[aIndex]);
  1932. end;
  1933. function TJSNamedImportElements.AddElement: TJSNamedImportElement;
  1934. begin
  1935. Result:=TJSNamedImportElement(Add);
  1936. end;
  1937. { TJSYieldExpression }
  1938. class function TJSYieldExpression.PrefixOperatorToken: tjsToken;
  1939. begin
  1940. Result:=tjsYield;
  1941. end;
  1942. {$IFDEF NOCLASSES}
  1943. { TCollectionItem }
  1944. Constructor TCollectionItem.Create(ACollection: TCollection);
  1945. begin
  1946. FCollection:=ACollection;
  1947. end;
  1948. Destructor TCollectionItem.Destroy;
  1949. begin
  1950. if Assigned(FCollection) then
  1951. FCollection.Remove(Self);
  1952. inherited Destroy;
  1953. end;
  1954. { TCollection }
  1955. function TCollection.GetI(AIndex : Integer): TCollectionItem;
  1956. begin
  1957. if (AIndex>=0) and (AIndex<FCount) then
  1958. Result:=FItems[AIndex]
  1959. else
  1960. Raise EListError.CreateFmt('Collection index (%d) out of bounds.',[AIndex]);
  1961. end;
  1962. function TCollection.GetCount: Integer;
  1963. begin
  1964. Result:=FCount;
  1965. end;
  1966. Procedure TCollection.Remove(AItem: TCollectionItem);
  1967. Var
  1968. I,J : Integer;
  1969. begin
  1970. if (AItem=Nil) then exit;
  1971. I:=Count-1;
  1972. While (I>=0) and (FItems[I]<>AItem) do
  1973. Dec(i);
  1974. For J:=I to Count-2 do
  1975. FItems[I]:=FItems[i+1];
  1976. Dec(FCount);
  1977. end;
  1978. Constructor TCollection.Create(AItemClass: TCollectionItemClass);
  1979. begin
  1980. FItemClass:=AItemClass;
  1981. end;
  1982. Destructor TCollection.Destroy;
  1983. begin
  1984. Clear;
  1985. inherited Destroy;
  1986. end;
  1987. Procedure TCollection.Clear;
  1988. Var
  1989. I : Integer;
  1990. begin
  1991. For I:=0 to Count-1 do
  1992. begin
  1993. FItems[i].FCollection:=Nil;
  1994. FItems[i].Destroy;
  1995. end;
  1996. FCount:=0;
  1997. SetLength(Fitems,0);
  1998. end;
  1999. Function TCollection.Add: TCollectionItem;
  2000. Var
  2001. NL : Integer;
  2002. begin
  2003. If FCount=Length(FItems) then
  2004. begin
  2005. NL:=Length(FItems)*3 div 2;
  2006. if NL=0 then NL:=10;
  2007. SetLength(FItems,NL);
  2008. end;
  2009. Result:=FItemClass.Create(Self);
  2010. FItems[FCount]:=Result;
  2011. Inc(FCount);
  2012. end;
  2013. { TStrings }
  2014. function TStrings.GetCount: Integer;
  2015. begin
  2016. Result:=FCount;
  2017. end;
  2018. function TStrings.GetS(AIndex : Integer): String;
  2019. begin
  2020. if (AIndex>=0) and (AIndex<FCount) then
  2021. Result:=FStrings[AIndex]
  2022. else
  2023. Raise EListError.CreateFmt('List index (%d) out of bounds.',[AIndex]);
  2024. end;
  2025. procedure TStrings.SetS(AIndex : Integer; AValue: String);
  2026. begin
  2027. if (AIndex>=0) and (AIndex<=FCount) then
  2028. begin
  2029. if (AIndex=FCount) then
  2030. Add(AValue)
  2031. else
  2032. FStrings[AIndex]:=AValue;
  2033. end
  2034. else
  2035. Raise EListError.CreateFmt('List index (%d) out of bounds.',[AIndex]);
  2036. end;
  2037. Function TStrings.Add(Const S: String): Integer;
  2038. Var
  2039. NL : Integer;
  2040. begin
  2041. If FCount=Length(FStrings) then
  2042. begin
  2043. NL:=Length(FStrings)*3 div 2;
  2044. if NL=0 then NL:=10;
  2045. SetLength(FStrings,NL);
  2046. end;
  2047. FStrings[FCount]:=S;
  2048. Inc(FCount);
  2049. end;
  2050. Procedure TStrings.Assign(Source: TStrings);
  2051. Var
  2052. I : Integer;
  2053. begin
  2054. SetLength(FStrings,Length(Source.FStrings));
  2055. FCount:=Source.FCount;
  2056. For I:=0 to FCount-1 do
  2057. FStrings[i]:=Source.FStrings[i];
  2058. end;
  2059. {$ENDIF NOCLASSES}
  2060. { TJSXOREqAssignStatement }
  2061. Class function TJSXOREqAssignStatement.OperatorToken: tjsToken;
  2062. begin
  2063. Result:=tjsXOREq;
  2064. end;
  2065. { TJSOREqAssignStatement }
  2066. Class function TJSOREqAssignStatement.OperatorToken: tjsToken;
  2067. begin
  2068. Result:=tjsOREQ;
  2069. end;
  2070. { TJSANDEqAssignStatement }
  2071. Class function TJSANDEqAssignStatement.OperatorToken: tjsToken;
  2072. begin
  2073. Result:=tjsAndEq;
  2074. end;
  2075. { TJSURShiftEqAssignStatement }
  2076. Class function TJSURShiftEqAssignStatement.OperatorToken: tjsToken;
  2077. begin
  2078. Result:=tjsURSHIFTEQ;
  2079. end;
  2080. { TJSRShiftEqAssignStatement }
  2081. Class function TJSRShiftEqAssignStatement.OperatorToken: tjsToken;
  2082. begin
  2083. Result:=tjsRSHIFTEQ;
  2084. end;
  2085. { TJSLShiftEqAssignStatement }
  2086. Class function TJSLShiftEqAssignStatement.OperatorToken: tjsToken;
  2087. begin
  2088. Result:=tjsLSHIFTEQ;
  2089. end;
  2090. { TJSSubEqAssignStatement }
  2091. Class function TJSSubEqAssignStatement.OperatorToken: tjsToken;
  2092. begin
  2093. Result:=tjsMINUSEQ;
  2094. end;
  2095. { TJSAddEqAssignStatement }
  2096. Class function TJSAddEqAssignStatement.OperatorToken: tjsToken;
  2097. begin
  2098. Result:=tjsPLUSEQ;
  2099. end;
  2100. { TJSModEqAssignStatement }
  2101. Class function TJSModEqAssignStatement.OperatorToken: tjsToken;
  2102. begin
  2103. Result:=tjsMODEQ;
  2104. end;
  2105. { TJSDivEqAssignStatement }
  2106. Class function TJSDivEqAssignStatement.OperatorToken: tjsToken;
  2107. begin
  2108. Result:=tjsDIVEQ;
  2109. end;
  2110. { TJSMulEqAssignStatement }
  2111. Class function TJSMulEqAssignStatement.OperatorToken: tjsToken;
  2112. begin
  2113. Result:=tjsMULEQ;
  2114. end;
  2115. { TJSSimpleAssignStatement }
  2116. Class function TJSSimpleAssignStatement.OperatorToken: tjsToken;
  2117. begin
  2118. Result:=tjsAssign;
  2119. end;
  2120. { TJSLabeledStatement }
  2121. Destructor TJSLabeledStatement.Destroy;
  2122. begin
  2123. FreeAndNil(FLabel);
  2124. inherited Destroy;
  2125. end;
  2126. { TJSCommaExpression }
  2127. Class function TJSCommaExpression.OperatorToken: tjsToken;
  2128. begin
  2129. Result:=tjsComma;
  2130. end;
  2131. { TJSMultiplicativeExpressionMod }
  2132. Class function TJSMultiplicativeExpressionMod.OperatorToken: tjsToken;
  2133. begin
  2134. Result:=tjsMod;
  2135. end;
  2136. { TJSMultiplicativeExpressionDiv }
  2137. Class function TJSMultiplicativeExpressionDiv.OperatorToken: tjsToken;
  2138. begin
  2139. Result:=tjsDiv;
  2140. end;
  2141. { TJSMultiplicativeExpressionMul }
  2142. Class function TJSMultiplicativeExpressionMul.OperatorToken: tjsToken;
  2143. begin
  2144. Result:=tjsMul;
  2145. end;
  2146. { TJSAdditiveExpressionMinus }
  2147. Class function TJSAdditiveExpressionMinus.OperatorToken: tjsToken;
  2148. begin
  2149. Result:=tjsMinus;
  2150. end;
  2151. { TJSAdditiveExpressionPlus }
  2152. Class function TJSAdditiveExpressionPlus.OperatorToken: tjsToken;
  2153. begin
  2154. Result:=tjsPlus;
  2155. end;
  2156. { TJSURShiftExpression }
  2157. Class function TJSURShiftExpression.OperatorToken: tjsToken;
  2158. begin
  2159. Result:=tjsURshift;
  2160. end;
  2161. { TJSRShiftExpression }
  2162. Class function TJSRShiftExpression.OperatorToken: tjsToken;
  2163. begin
  2164. Result:=tjsRSHIFT;
  2165. end;
  2166. { TJSLShiftExpression }
  2167. Class function TJSLShiftExpression.OperatorToken: tjsToken;
  2168. begin
  2169. Result:=tjsLSHIFT;
  2170. end;
  2171. { TJSRelationalExpressionInstanceOf }
  2172. Class function TJSRelationalExpressionInstanceOf.OperatorToken: tjsToken;
  2173. begin
  2174. Result:=tjsInstanceOf;
  2175. end;
  2176. Class Function TJSRelationalExpressionInstanceOf.AllowCompact: Boolean;
  2177. begin
  2178. Result:=False;
  2179. end;
  2180. { TJSRelationalExpressionIn }
  2181. Class function TJSRelationalExpressionIn.OperatorToken: tjsToken;
  2182. begin
  2183. Result:=tjsIn;
  2184. end;
  2185. Class Function TJSRelationalExpressionIn.AllowCompact: Boolean;
  2186. begin
  2187. Result:=False;
  2188. end;
  2189. { TJSRelationalExpressionGE }
  2190. Class function TJSRelationalExpressionGE.OperatorToken: tjsToken;
  2191. begin
  2192. Result:=tjsGE;
  2193. end;
  2194. { TJSRelationalExpressionLE }
  2195. Class function TJSRelationalExpressionLE.OperatorToken: tjsToken;
  2196. begin
  2197. Result:=tjsLE;
  2198. end;
  2199. { TJSRelationalExpressionGT }
  2200. Class function TJSRelationalExpressionGT.OperatorToken: tjsToken;
  2201. begin
  2202. Result:=tjsGT;
  2203. end;
  2204. { TJSRelationalExpressionLT }
  2205. Class function TJSRelationalExpressionLT.OperatorToken: tjsToken;
  2206. begin
  2207. Result:=tjsLT;
  2208. end;
  2209. { TJSEqualityExpressionSNE }
  2210. Class function TJSEqualityExpressionSNE.OperatorToken: tjsToken;
  2211. begin
  2212. Result:=tjsSNE;
  2213. end;
  2214. { TJSEqualityExpressionSEQ }
  2215. Class function TJSEqualityExpressionSEQ.OperatorToken: tjsToken;
  2216. begin
  2217. Result:=tjsSEQ;
  2218. end;
  2219. { TJSEqualityExpressionNE }
  2220. Class function TJSEqualityExpressionNE.OperatorToken: tjsToken;
  2221. begin
  2222. Result:=tjsNE;
  2223. end;
  2224. { TJSEqualityExpressionEQ }
  2225. Class function TJSEqualityExpressionEQ.OperatorToken: tjsToken;
  2226. begin
  2227. Result:=tjsEQ;
  2228. end;
  2229. { TJSBinaryExpression }
  2230. Class function TJSBinaryExpression.OperatorToken: tjsToken;
  2231. begin
  2232. Result:=tjsUnknown
  2233. end;
  2234. Class function TJSBinaryExpression.OperatorString: string;
  2235. Var
  2236. T : TJSToken;
  2237. begin
  2238. T:=OperatorToken;
  2239. if (T<>tjsUnknown) then
  2240. begin
  2241. Result:=TokenInfos[T]
  2242. end
  2243. else
  2244. Result:='';
  2245. end;
  2246. Class Function TJSBinaryExpression.AllowCompact: Boolean;
  2247. begin
  2248. Result:=True
  2249. end;
  2250. { TJSBitwiseXOrExpression }
  2251. Class function TJSBitwiseXOrExpression.OperatorToken : tjsToken;
  2252. begin
  2253. Result:=tjsXor
  2254. end;
  2255. { TJSBitwiseOrExpression }
  2256. Class function TJSBitwiseOrExpression.OperatorToken : tjsToken;
  2257. begin
  2258. Result:=tjsOr
  2259. end;
  2260. { TJSBitwiseAndExpression }
  2261. Class function TJSBitwiseAndExpression.OperatorToken : tjsToken;
  2262. begin
  2263. Result:=tjsAnd
  2264. end;
  2265. { TJSLogicalAndExpression }
  2266. Class function TJSLogicalAndExpression.OperatorToken : tjsToken;
  2267. begin
  2268. Result:=tjsAndAnd
  2269. end;
  2270. { TJSLogicalOrExpression }
  2271. Class function TJSLogicalOrExpression.OperatorToken : tjsToken;
  2272. begin
  2273. Result:=tjsOrOr
  2274. end;
  2275. { TJSUnaryVoidExpression }
  2276. Class function TJSUnaryVoidExpression.PrefixOperatorToken : tjsToken;
  2277. begin
  2278. Result:=tjsvoid;
  2279. end;
  2280. { TJSThrowStatement }
  2281. Class function TJSThrowStatement.PrefixOperatorToken: tjsToken;
  2282. begin
  2283. Result:=tjsThrow;
  2284. end;
  2285. { TJSUnaryBracketsExpression }
  2286. class function TJSUnaryBracketsExpression.PrefixOperatorToken: tjsToken;
  2287. begin
  2288. Result:=tjsBraceOpen;
  2289. end;
  2290. class function TJSUnaryBracketsExpression.PostFixOperatorToken: tjsToken;
  2291. begin
  2292. Result:=tjsBraceClose;
  2293. end;
  2294. { TJSUnaryPostMinusMinusExpression }
  2295. Class function TJSUnaryPostMinusMinusExpression.PostFixOperatorToken : tjsToken;
  2296. begin
  2297. Result:=tjsMinusMinus;
  2298. end;
  2299. { TJSUnaryPostPlusPlusExpression }
  2300. Class function TJSUnaryPostPlusPlusExpression.PostFixOperatorToken : tjsToken;
  2301. begin
  2302. Result:=tjsPlusPlus;
  2303. end;
  2304. { TJSUnaryNotExpression }
  2305. Class function TJSUnaryNotExpression.PrefixOperatorToken : tjsToken;
  2306. begin
  2307. Result:=tjsNot;
  2308. end;
  2309. { TJSUnaryInvExpression }
  2310. Class function TJSUnaryInvExpression.PrefixOperatorToken : tjsToken;
  2311. begin
  2312. Result:=tjsinv;
  2313. end;
  2314. { TJSUnaryMinusExpression }
  2315. Class function TJSUnaryMinusExpression.PrefixOperatorToken : tjsToken;
  2316. begin
  2317. Result:=tjsMinus;
  2318. end;
  2319. { TJSUnaryPlusExpression }
  2320. Class function TJSUnaryPlusExpression.PrefixOperatorToken : tjsToken;
  2321. begin
  2322. Result:=tjsPlus;
  2323. end;
  2324. { TJSUnaryPreMinusMinusExpression }
  2325. Class function TJSUnaryPreMinusMinusExpression.PrefixOperatorToken : tjsToken;
  2326. begin
  2327. Result:=tjsMinusMinus;
  2328. end;
  2329. { TJSUnaryPrePlusPlusExpression }
  2330. Class function TJSUnaryPrePlusPlusExpression.PrefixOperatorToken : tjsToken;
  2331. begin
  2332. Result:=tjsPlusPlus;
  2333. end;
  2334. { TJSUnaryTypeOfExpression }
  2335. Class function TJSUnaryTypeOfExpression.PrefixOperatorToken : tjsToken;
  2336. begin
  2337. Result:=tjsTypeOf;
  2338. end;
  2339. { TJSAwaitExpression }
  2340. class function TJSAwaitExpression.PrefixOperatorToken: tjsToken;
  2341. begin
  2342. Result:=tjsAwait;
  2343. end;
  2344. { TJSUnaryDeleteExpression }
  2345. Class function TJSUnaryDeleteExpression.PrefixOperatorToken : tjsToken;
  2346. begin
  2347. Result:=tjsdelete;
  2348. end;
  2349. { TJSElement }
  2350. constructor TJSElement.Create(ALine, AColumn: Integer; const ASource: String);
  2351. begin
  2352. FLine:=ALine;
  2353. FColumn:=AColumn;
  2354. FSource:=ASource;
  2355. end;
  2356. destructor TJSElement.Destroy;
  2357. begin
  2358. if Assigned(GlobalFreeHook) then
  2359. GlobalFreeHook(Self);
  2360. inherited Destroy;
  2361. end;
  2362. procedure TJSElement.AssignPosition(El: TJSElement);
  2363. begin
  2364. Source:=El.Source;
  2365. Line:=El.Line;
  2366. Column:=El.Column;
  2367. end;
  2368. { TJSRegularExpressionLiteral }
  2369. function TJSRegularExpressionLiteral.GetA(AIndex : integer): TJSValue;
  2370. begin
  2371. Result:=FArgv[AIndex];
  2372. end;
  2373. procedure TJSRegularExpressionLiteral.SetA(AIndex : integer;
  2374. const AValue: TJSValue);
  2375. begin
  2376. FArgv[AIndex]:=Avalue;
  2377. end;
  2378. constructor TJSRegularExpressionLiteral.Create(ALine, AColumn: Integer;
  2379. const ASource: String);
  2380. begin
  2381. inherited Create(ALine, AColumn, ASource);
  2382. FPattern:=TJSValue.Create;
  2383. FPatternFlags:=TJSValue.Create;
  2384. end;
  2385. destructor TJSRegularExpressionLiteral.Destroy;
  2386. begin
  2387. FreeAndNil(FPattern);
  2388. FreeAndNil(FPatternFlags);
  2389. Inherited Destroy;
  2390. end;
  2391. { TJSArrayLiteralElements }
  2392. function TJSArrayLiteralElements.GetE(AIndex : Integer): TJSArrayLiteralElement;
  2393. begin
  2394. Result:=TJSArrayLiteralElement(Items[AIndex]);
  2395. end;
  2396. function TJSArrayLiteralElements.AddElement: TJSArrayLiteralElement;
  2397. begin
  2398. Result:=TJSArrayLiteralElement(Add);
  2399. end;
  2400. { TJSArrayLiteral }
  2401. function TJSArrayLiteral.GetCount: Integer;
  2402. begin
  2403. Result:=Elements.Count;
  2404. end;
  2405. constructor TJSArrayLiteral.Create(ALine, AColumn: Integer; const ASource: String);
  2406. begin
  2407. inherited Create(ALine, AColumn, ASource);
  2408. FElements:=TJSArrayLiteralElements.Create(TJSArrayLiteralElement);
  2409. end;
  2410. procedure TJSArrayLiteral.AddElement(El: TJSElement);
  2411. var
  2412. ArrEl: TJSArrayLiteralElement;
  2413. begin
  2414. ArrEl:=Elements.AddElement;
  2415. ArrEl.ElementIndex:=Elements.Count-1;
  2416. ArrEl.Expr:=El;
  2417. end;
  2418. destructor TJSArrayLiteral.Destroy;
  2419. begin
  2420. FreeAndNil(FElements);
  2421. inherited Destroy;
  2422. end;
  2423. { TJSObjectLiteralElements }
  2424. function TJSObjectLiteralElements.GetE(AIndex : Integer
  2425. ): TJSObjectLiteralElement;
  2426. begin
  2427. Result:=TJSObjectLiteralElement(Items[AIndex]);
  2428. end;
  2429. function TJSObjectLiteralElements.AddElement: TJSObjectLiteralElement;
  2430. begin
  2431. Result:=TJSObjectLiteralElement(Add);
  2432. end;
  2433. { TJSObjectLiteral }
  2434. constructor TJSObjectLiteral.Create(ALine, AColumn: Integer; const ASource: String = '');
  2435. begin
  2436. inherited Create(ALine, AColumn, ASource);
  2437. FElements:=TJSObjectLiteralElements.Create(TJSObjectLiteralElement);
  2438. end;
  2439. destructor TJSObjectLiteral.Destroy;
  2440. begin
  2441. FreeAndNil(FElements);
  2442. inherited Destroy;
  2443. end;
  2444. { TJSObjectLiteralElement }
  2445. destructor TJSObjectLiteralElement.Destroy;
  2446. begin
  2447. FreeAndNil(FExpr);
  2448. inherited Destroy;
  2449. end;
  2450. { TJSArrayLiteralElement }
  2451. destructor TJSArrayLiteralElement.Destroy;
  2452. begin
  2453. FreeAndNil(FExpr);
  2454. inherited Destroy;
  2455. end;
  2456. { TJSNewMemberExpression }
  2457. destructor TJSNewMemberExpression.Destroy;
  2458. begin
  2459. FreeAndNil(FArgs);
  2460. inherited Destroy;
  2461. end;
  2462. procedure TJSNewMemberExpression.AddArg(El: TJSElement);
  2463. begin
  2464. if Args=nil then
  2465. Args:=TJSArguments.Create(Line,Column,Source);
  2466. Args.Elements.AddElement.Expr:=El;
  2467. end;
  2468. { TJSMemberExpression }
  2469. destructor TJSMemberExpression.Destroy;
  2470. begin
  2471. FreeAndNil(FMExpr);
  2472. inherited Destroy;
  2473. end;
  2474. { TJSCallExpression }
  2475. destructor TJSCallExpression.Destroy;
  2476. begin
  2477. FreeAndNil(FExpr);
  2478. FreeAndNil(FArgs);
  2479. inherited Destroy;
  2480. end;
  2481. procedure TJSCallExpression.AddArg(El: TJSElement);
  2482. begin
  2483. Args.Elements.AddElement.Expr:=El;
  2484. end;
  2485. procedure TJSCallExpression.InsertArg(Index: integer; El: TJSElement);
  2486. var
  2487. NewEl: TJSArrayLiteralElement;
  2488. begin
  2489. NewEl:=TJSArrayLiteralElement(Args.Elements.Insert(Index));
  2490. NewEl.Expr:=El;
  2491. end;
  2492. { TJSUnary }
  2493. Class function TJSUnary.PrefixOperatorToken: tjsToken;
  2494. begin
  2495. Result:=tjsUnknown;
  2496. end;
  2497. Class function TJSUnary.PostFixOperatorToken: tjsToken;
  2498. begin
  2499. Result:=tjsUnknown;
  2500. end;
  2501. Class function TJSUnary.PrefixOperator: String;
  2502. Var
  2503. T : TJSToken;
  2504. begin
  2505. T:=PrefixOperatorToken;
  2506. if (T=tjsUnknown) then
  2507. Result:=''
  2508. else
  2509. begin
  2510. Result:=TokenInfos[t];
  2511. if t in [tjsTypeOf,tjsVoid,tjsDelete,tjsThrow,tjsAwait,tjsYield] then
  2512. Result:=Result+' ';
  2513. end;
  2514. end;
  2515. Class function TJSUnary.PostFixOperator: String;
  2516. Var
  2517. T : TJSToken;
  2518. begin
  2519. T:=PostFixOperatorToken;
  2520. if (T=tjsUnknown) then
  2521. Result:=''
  2522. else
  2523. Result:=TokenInfos[t];
  2524. end;
  2525. Destructor TJSUnary.Destroy;
  2526. begin
  2527. FreeAndNil(FA);
  2528. inherited Destroy;
  2529. end;
  2530. { TJSBinary }
  2531. destructor TJSBinary.Destroy;
  2532. procedure FreeListOfBins(El: TJSElement; ListA: boolean);
  2533. var
  2534. BinCnt: Integer;
  2535. SubBin: TJSBinary;
  2536. Bins: TJSElementArray;
  2537. begin
  2538. // free El binary chain without stack
  2539. SetLength(Bins{%H-},8);
  2540. BinCnt:=0;
  2541. while El is TJSBinary do
  2542. begin
  2543. SubBin:=TJSBinary(El);
  2544. if BinCnt=length(Bins) then
  2545. SetLength(Bins,BinCnt*2);
  2546. Bins[BinCnt]:=SubBin;
  2547. inc(BinCnt);
  2548. if ListA then
  2549. El:=SubBin.FA
  2550. else
  2551. El:=SubBin.FB;
  2552. end;
  2553. while BinCnt>0 do
  2554. begin
  2555. dec(BinCnt);
  2556. SubBin:=TJSBinary(Bins[BinCnt]);
  2557. FreeAndNil(SubBin.FA);
  2558. FreeAndNil(SubBin.FB);
  2559. end;
  2560. end;
  2561. begin
  2562. if FA is TJSBinary then
  2563. FreeListOfBins(FA,true);
  2564. if FB is TJSBinary then
  2565. FreeListOfBins(FB,false);
  2566. FreeAndNil(FA);
  2567. FreeAndNil(FB);
  2568. inherited Destroy;
  2569. end;
  2570. { TJSConditionalExpression }
  2571. destructor TJSConditionalExpression.Destroy;
  2572. begin
  2573. FreeAndNil(FB);
  2574. FreeAndNil(FA);
  2575. FreeAndNil(FC);
  2576. inherited Destroy;
  2577. end;
  2578. { TJSAssign }
  2579. Destructor TJSAssignStatement.Destroy;
  2580. begin
  2581. FreeAndNil(FLHS);
  2582. FreeAndNil(FExpr);
  2583. inherited Destroy;
  2584. end;
  2585. Class function TJSAssignStatement.OperatorToken: tjsToken;
  2586. begin
  2587. Result:=tjsUnknown;
  2588. end;
  2589. Class function TJSAssignStatement.OperatorString: String;
  2590. Var
  2591. t : TJSToken;
  2592. begin
  2593. T:=OperatorToken;
  2594. if (tjsUnknown<>t) then
  2595. Result:=TokenInfos[t]
  2596. else
  2597. Result:='';
  2598. end;
  2599. { TJSVarDeclaration }
  2600. procedure TJSVarDeclaration.SetTyped(AValue: TJSTypeDef);
  2601. begin
  2602. if FTyped=AValue then Exit;
  2603. if FOwnsType then
  2604. FreeAndNil(FTyped);
  2605. FTyped:=AValue;
  2606. FOwnsType:=aValue<>Nil;
  2607. end;
  2608. destructor TJSVarDeclaration.Destroy;
  2609. begin
  2610. if FOwnsType then
  2611. FreeAndNil(FTyped);
  2612. FreeAndNil(FInit);
  2613. inherited Destroy;
  2614. end;
  2615. procedure TJSVarDeclaration.SetForeignType(AValue: TJSTypeDef);
  2616. begin
  2617. if FOwnsType then
  2618. FreeAndNil(FTyped);
  2619. FTyped:=aValue;
  2620. FOwnsType:=False;
  2621. end;
  2622. { TJSIfStatement }
  2623. destructor TJSIfStatement.Destroy;
  2624. begin
  2625. FreeAndNil(FCond);
  2626. FreeAndNil(FBTrue);
  2627. FreeAndNil(FBFalse);
  2628. inherited Destroy;
  2629. end;
  2630. { TJSBodyStatement }
  2631. destructor TJSBodyStatement.Destroy;
  2632. begin
  2633. FreeAndNil(FBody);
  2634. inherited Destroy;
  2635. end;
  2636. { TJSCondLoopStatement }
  2637. destructor TJSCondLoopStatement.Destroy;
  2638. begin
  2639. FreeAndNil(FCond);
  2640. inherited Destroy;
  2641. end;
  2642. { TJSForStatement }
  2643. destructor TJSForStatement.Destroy;
  2644. begin
  2645. FreeAndNil(FIncr);
  2646. FreeAndNil(FInit);
  2647. inherited Destroy;
  2648. end;
  2649. { TJSForInStatement }
  2650. destructor TJSForInStatement.Destroy;
  2651. begin
  2652. FreeAndNil(FList);
  2653. FreeAndNil(FLHS);
  2654. inherited Destroy;
  2655. end;
  2656. { TJSReturn }
  2657. destructor TJSReturnStatement.Destroy;
  2658. begin
  2659. FreeAndNil(FExpr);
  2660. inherited Destroy;
  2661. end;
  2662. { TJSCaseElement }
  2663. destructor TJSCaseElement.Destroy;
  2664. begin
  2665. FreeAndNil(FExpr);
  2666. FreeAndNil(FBody);
  2667. inherited Destroy;
  2668. end;
  2669. { TJSSwitch }
  2670. constructor TJSSwitchStatement.Create(ALine, AColumn: Integer; const ASource: String);
  2671. begin
  2672. inherited Create(ALine, AColumn, ASource);
  2673. FCases:=TJSCaseElements.Create(TJSCaseElement);
  2674. end;
  2675. destructor TJSSwitchStatement.Destroy;
  2676. begin
  2677. FreeAndNil(FCases);
  2678. FreeAndNil(FCond);
  2679. inherited Destroy;
  2680. end;
  2681. { TJSCaseElements }
  2682. function TJSCaseElements.GetC(AIndex : Integer): TJSCaseElement;
  2683. begin
  2684. Result:=TJSCaseElement(Items[AIndex]);
  2685. end;
  2686. function TJSCaseElements.AddCase: TJSCaseElement;
  2687. begin
  2688. Result:=TJSCaseElement(Add);
  2689. end;
  2690. { TJSTryStatement }
  2691. destructor TJSTryStatement.Destroy;
  2692. begin
  2693. FreeAndNil(FBlock);
  2694. FreeAndNil(FBCatch);
  2695. FreeAndNil(FBFinally);
  2696. inherited Destroy;
  2697. end;
  2698. { TJSSourceElements }
  2699. constructor TJSSourceElements.Create(ALine, AColumn: Integer; const ASource: String);
  2700. Function CN(aName : String; DoClear : Boolean = True) : TJSElementNodes;
  2701. begin
  2702. Result:=TJSElementNodes.Create(TJSElementNode);
  2703. Result.NodeType:=aName;
  2704. Result.DoClearNodes:=DoClear;
  2705. end;
  2706. begin
  2707. inherited Create(ALine, AColumn, ASource);
  2708. FClasses:=CN('Classes');
  2709. FEnums:=CN('Enums');
  2710. FFunctions:=CN('Functions',False);
  2711. FInterfaces:=CN('Interfaces');
  2712. FModules:=CN('Modules');
  2713. FNamespaces:=CN('Namespaces');
  2714. FStatements:=CN('Statements',False);
  2715. FTypes:=CN('Types');
  2716. FVars:=CN('Vars');
  2717. end;
  2718. destructor TJSSourceElements.Destroy;
  2719. begin
  2720. // Vars, types, enums, classes, interfaces are owned by their statements, and those are freed later
  2721. FreeAndNil(FVars);
  2722. FreeAndNil(FTypes);
  2723. FreeAndNil(FNamespaces);
  2724. FreeAndNil(FModules);
  2725. FreeAndNil(FInterfaces);
  2726. FreeAndNil(FFunctions);
  2727. FreeAndNil(FEnums);
  2728. FreeAndNil(FClasses);
  2729. // Must come last
  2730. FreeAndNil(FStatements);
  2731. inherited Destroy;
  2732. end;
  2733. { TJSElementNodes }
  2734. function TJSElementNodes.GetN(AIndex : Integer): TJSElementNode;
  2735. begin
  2736. Result:=TJSElementNode(Items[Aindex])
  2737. end;
  2738. function TJSElementNodes.GetE(AIndex : Integer): TJSElement;
  2739. begin
  2740. Result:=Nodes[aIndex].Node;
  2741. end;
  2742. destructor TJSElementNodes.Destroy;
  2743. begin
  2744. if FClearNodes then
  2745. ClearNodes;
  2746. inherited Destroy;
  2747. end;
  2748. procedure TJSElementNodes.ClearNodes;
  2749. Var
  2750. I : Integer;
  2751. begin
  2752. For I:=0 to Count-1 do
  2753. begin
  2754. { if Assigned(Nodes[i].Node) then
  2755. begin
  2756. Write(FNodeType,': Clearing node ',I,': ');
  2757. WriteLn(Nodes[i].Node.ClassName)
  2758. end
  2759. else
  2760. Writeln(FNodeType,': Node ',i,'is nil');}
  2761. Nodes[i].Node:=Nil;
  2762. end;
  2763. end;
  2764. function TJSElementNodes.GetEnumerator: TElementNodeEnumerator;
  2765. begin
  2766. Result:=TElementNodeEnumerator.Create(Self);
  2767. end;
  2768. function TJSElementNodes.AddNode(aIsAmbient : Boolean = False; aIsExport : Boolean = False): TJSElementNode;
  2769. begin
  2770. Result:=TJSElementNode(Add);
  2771. Result.IsAmbient:=aIsAmbient;
  2772. Result.IsExport:=aIsExport;
  2773. end;
  2774. function TJSElementNodes.AddNode(aEl: TJSElement; aIsAmbient: Boolean; aIsExport: Boolean): TJSElementNode;
  2775. begin
  2776. Result:=AddNode(aIsAmbient,aIsExport);
  2777. Result.Node:=aEl;
  2778. end;
  2779. function TJSElementNodes.InsertNode(Index: integer): TJSElementNode;
  2780. begin
  2781. Result:=TJSElementNode(Insert(Index));
  2782. end;
  2783. { TJSFunction }
  2784. destructor TJSFunctionStatement.Destroy;
  2785. begin
  2786. FreeAndNil(FFuncDef);
  2787. inherited Destroy;
  2788. end;
  2789. { TJSElementNode }
  2790. destructor TJSElementNode.Destroy;
  2791. begin
  2792. FreeAndNil(FNode);
  2793. inherited Destroy;
  2794. end;
  2795. procedure TJSElementNode.Assign(aSource: TPersistent);
  2796. Var
  2797. aNode : TJSElementNode absolute aSource;
  2798. begin
  2799. if aSource is TJSElementNode then
  2800. begin
  2801. FIsAmbient:=aNode.FIsAmbient;
  2802. FIsExport:=aNode.FIsExport;
  2803. FNode:=aNode.Node;
  2804. end
  2805. else
  2806. inherited Assign(aSource);
  2807. end;
  2808. { TJSFuncDef }
  2809. constructor TJSFuncDef.Create;
  2810. begin
  2811. FParams:=TStringList.Create;
  2812. FTypedParams:=TJSTypedParams.Create;
  2813. end;
  2814. destructor TJSFuncDef.Destroy;
  2815. begin
  2816. FreeAndNil(FGenericParams);
  2817. FreeAndNil(FTypedParams);
  2818. FreeAndNil(FBody);
  2819. FreeAndNil(FParams);
  2820. FreeAndNil(FResultType);
  2821. inherited Destroy;
  2822. end;
  2823. procedure TJSFuncDef.UpdateParams;
  2824. Var
  2825. I : integer;
  2826. begin
  2827. FParams.Clear;
  2828. For I:=0 to TypedParams.Count-1 do
  2829. FParams.Add({$ifdef FPC_HAS_CPSTRING}UTF8Encode(TypedParams.Names[i]){$ELSE}TypedParams.Names[i]{$ENDIF});
  2830. end;
  2831. { TJSBracketMemberExpression }
  2832. destructor TJSBracketMemberExpression.Destroy;
  2833. begin
  2834. FreeAndNil(FName);
  2835. inherited Destroy;
  2836. end;
  2837. { TJSLiteral }
  2838. constructor TJSLiteral.Create(ALine, AColumn: Integer; const ASource: String);
  2839. begin
  2840. FValue:=TJSValue.Create;
  2841. inherited Create(ALine, AColumn, ASource);
  2842. end;
  2843. destructor TJSLiteral.Destroy;
  2844. begin
  2845. FreeAndNil(FValue);
  2846. Inherited;
  2847. end;
  2848. end.