tcfiler.pas 111 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 2018 by Michael Van Canneyt
  4. Unit tests for Pascal-to-Javascript precompile class.
  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. Examples:
  12. ./testpas2js --suite=TTestPrecompile.TestPC_EmptyUnit
  13. }
  14. unit TCFiler;
  15. {$mode objfpc}{$H+}
  16. interface
  17. uses
  18. Classes, SysUtils, fpcunit, testregistry,
  19. jstree,
  20. PasTree, PScanner, PParser, PasResolveEval, PasResolver, PasUseAnalyzer,
  21. Pas2jsUseAnalyzer, FPPas2Js, Pas2JsFiler,
  22. tcmodules;
  23. type
  24. TPCCheckFlag = (
  25. PCCGeneric // inside generic proc body
  26. );
  27. TPCCheckFlags = set of TPCCheckFlag;
  28. { TCustomTestPrecompile }
  29. TCustomTestPrecompile = Class(TCustomTestModule)
  30. private
  31. FAnalyzer: TPas2JSAnalyzer;
  32. FInitialFlags: TPCUInitialFlags;
  33. FPCUReader: TPCUReader;
  34. FPCUWriter: TPCUWriter;
  35. FRestAnalyzer: TPas2JSAnalyzer;
  36. procedure OnFilerGetSrc(Sender: TObject; aFilename: string; out p: PChar;
  37. out Count: integer);
  38. function OnConverterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
  39. function OnConverterIsTypeInfoUsed(Sender: TObject; El: TPasElement): boolean;
  40. function OnRestConverterIsElementUsed(Sender: TObject; El: TPasElement): boolean;
  41. function OnRestConverterIsTypeInfoUsed(Sender: TObject; El: TPasElement): boolean;
  42. function OnRestResolverFindUnit(const aUnitName: String): TPasModule;
  43. protected
  44. procedure SetUp; override;
  45. procedure TearDown; override;
  46. function CreateConverter: TPasToJSConverter; override;
  47. procedure ParseUnit; override;
  48. procedure WriteReadUnit; virtual;
  49. procedure StartParsing; override;
  50. function CheckRestoredObject(const Path: string; Orig, Rest: TObject): boolean; virtual;
  51. procedure CheckRestoredJS(const Path, Orig, Rest: string); virtual;
  52. procedure CheckRestoredStringList(const Path: string; Orig, Rest: TStrings); virtual;
  53. // check restored parser+resolver
  54. procedure CheckRestoredResolver(Original, Restored: TPas2JSResolver; Flags: TPCCheckFlags); virtual;
  55. procedure CheckRestoredDeclarations(const Path: string; Orig, Rest: TPasDeclarations; Flags: TPCCheckFlags); virtual;
  56. procedure CheckRestoredSection(const Path: string; Orig, Rest: TPasSection; Flags: TPCCheckFlags); virtual;
  57. procedure CheckRestoredModule(const Path: string; Orig, Rest: TPasModule; Flags: TPCCheckFlags); virtual;
  58. procedure CheckRestoredScopeReference(const Path: string; Orig, Rest: TPasScope; Flags: TPCCheckFlags); virtual;
  59. procedure CheckRestoredElementBase(const Path: string; Orig, Rest: TPasElementBase; Flags: TPCCheckFlags); virtual;
  60. procedure CheckRestoredResolveData(const Path: string; Orig, Rest: TResolveData; Flags: TPCCheckFlags); virtual;
  61. procedure CheckRestoredPasScope(const Path: string; Orig, Rest: TPasScope; Flags: TPCCheckFlags); virtual;
  62. procedure CheckRestoredModuleScope(const Path: string; Orig, Rest: TPas2JSModuleScope; Flags: TPCCheckFlags); virtual;
  63. procedure CheckRestoredIdentifierScope(const Path: string; Orig, Rest: TPasIdentifierScope; Flags: TPCCheckFlags); virtual;
  64. procedure CheckRestoredSectionScope(const Path: string; Orig, Rest: TPas2JSSectionScope; Flags: TPCCheckFlags); virtual;
  65. procedure CheckRestoredInitialFinalizationScope(const Path: string; Orig, Rest: TPas2JSInitialFinalizationScope; Flags: TPCCheckFlags); virtual;
  66. procedure CheckRestoredEnumTypeScope(const Path: string; Orig, Rest: TPasEnumTypeScope; Flags: TPCCheckFlags); virtual;
  67. procedure CheckRestoredRecordScope(const Path: string; Orig, Rest: TPas2jsRecordScope; Flags: TPCCheckFlags); virtual;
  68. procedure CheckRestoredClassScope(const Path: string; Orig, Rest: TPas2JSClassScope; Flags: TPCCheckFlags); virtual;
  69. procedure CheckRestoredProcScope(const Path: string; Orig, Rest: TPas2JSProcedureScope; Flags: TPCCheckFlags); virtual;
  70. procedure CheckRestoredScopeRefs(const Path: string; Orig, Rest: TPasScopeReferences; Flags: TPCCheckFlags); virtual;
  71. procedure CheckRestoredPropertyScope(const Path: string; Orig, Rest: TPasPropertyScope; Flags: TPCCheckFlags); virtual;
  72. procedure CheckRestoredGenericParamScope(const Path: string; Orig, Rest: TPasGenericParamsScope; Flags: TPCCheckFlags); virtual;
  73. procedure CheckRestoredSpecializeTypeData(const Path: string; Orig, Rest: TPasSpecializeTypeData; Flags: TPCCheckFlags); virtual;
  74. procedure CheckRestoredResolvedReference(const Path: string; Orig, Rest: TResolvedReference; Flags: TPCCheckFlags); virtual;
  75. procedure CheckRestoredEvalValue(const Path: string; Orig, Rest: TResEvalValue); virtual;
  76. procedure CheckRestoredCustomData(const Path: string; RestoredEl: TPasElement; Orig, Rest: TObject; Flags: TPCCheckFlags); virtual;
  77. procedure CheckRestoredReference(const Path: string; Orig, Rest: TPasElement); virtual;
  78. procedure CheckRestoredElOrRef(const Path: string; Orig, OrigProp, Rest, RestProp: TPasElement; Flags: TPCCheckFlags); virtual;
  79. procedure CheckRestoredAnalyzerElement(const Path: string; Orig, Rest: TPasElement); virtual;
  80. procedure CheckRestoredElement(const Path: string; Orig, Rest: TPasElement; Flags: TPCCheckFlags); virtual;
  81. procedure CheckRestoredElementList(const Path: string; Orig, Rest: TFPList; Flags: TPCCheckFlags); virtual;
  82. procedure CheckRestoredElementArray(const Path: string; Orig, Rest: TPasElementArray; Flags: TPCCheckFlags); virtual;
  83. procedure CheckRestoredElRefList(const Path: string; OrigParent: TPasElement;
  84. Orig: TFPList; RestParent: TPasElement; Rest: TFPList; AllowInSitu: boolean; Flags: TPCCheckFlags); virtual;
  85. procedure CheckRestoredPasExpr(const Path: string; Orig, Rest: TPasExpr; Flags: TPCCheckFlags); virtual;
  86. procedure CheckRestoredUnaryExpr(const Path: string; Orig, Rest: TUnaryExpr; Flags: TPCCheckFlags); virtual;
  87. procedure CheckRestoredBinaryExpr(const Path: string; Orig, Rest: TBinaryExpr; Flags: TPCCheckFlags); virtual;
  88. procedure CheckRestoredPrimitiveExpr(const Path: string; Orig, Rest: TPrimitiveExpr; Flags: TPCCheckFlags); virtual;
  89. procedure CheckRestoredBoolConstExpr(const Path: string; Orig, Rest: TBoolConstExpr; Flags: TPCCheckFlags); virtual;
  90. procedure CheckRestoredParamsExpr(const Path: string; Orig, Rest: TParamsExpr; Flags: TPCCheckFlags); virtual;
  91. procedure CheckRestoredProcedureExpr(const Path: string; Orig, Rest: TProcedureExpr; Flags: TPCCheckFlags); virtual;
  92. procedure CheckRestoredRecordValues(const Path: string; Orig, Rest: TRecordValues; Flags: TPCCheckFlags); virtual;
  93. procedure CheckRestoredPasExprArray(const Path: string; Orig, Rest: TPasExprArray; Flags: TPCCheckFlags); virtual;
  94. procedure CheckRestoredArrayValues(const Path: string; Orig, Rest: TArrayValues; Flags: TPCCheckFlags); virtual;
  95. procedure CheckRestoredResString(const Path: string; Orig, Rest: TPasResString; Flags: TPCCheckFlags); virtual;
  96. procedure CheckRestoredAliasType(const Path: string; Orig, Rest: TPasAliasType; Flags: TPCCheckFlags); virtual;
  97. procedure CheckRestoredPointerType(const Path: string; Orig, Rest: TPasPointerType; Flags: TPCCheckFlags); virtual;
  98. procedure CheckRestoredSpecializedType(const Path: string; Orig, Rest: TPasSpecializeType; Flags: TPCCheckFlags); virtual;
  99. procedure CheckRestoredInlineSpecializedExpr(const Path: string; Orig, Rest: TInlineSpecializeExpr; Flags: TPCCheckFlags); virtual;
  100. procedure CheckRestoredGenericTemplateType(const Path: string; Orig, Rest: TPasGenericTemplateType; Flags: TPCCheckFlags); virtual;
  101. procedure CheckRestoredRangeType(const Path: string; Orig, Rest: TPasRangeType; Flags: TPCCheckFlags); virtual;
  102. procedure CheckRestoredArrayType(const Path: string; Orig, Rest: TPasArrayType; Flags: TPCCheckFlags); virtual;
  103. procedure CheckRestoredFileType(const Path: string; Orig, Rest: TPasFileType; Flags: TPCCheckFlags); virtual;
  104. procedure CheckRestoredEnumValue(const Path: string; Orig, Rest: TPasEnumValue; Flags: TPCCheckFlags); virtual;
  105. procedure CheckRestoredEnumType(const Path: string; Orig, Rest: TPasEnumType; Flags: TPCCheckFlags); virtual;
  106. procedure CheckRestoredSetType(const Path: string; Orig, Rest: TPasSetType; Flags: TPCCheckFlags); virtual;
  107. procedure CheckRestoredVariant(const Path: string; Orig, Rest: TPasVariant; Flags: TPCCheckFlags); virtual;
  108. procedure CheckRestoredRecordType(const Path: string; Orig, Rest: TPasRecordType; Flags: TPCCheckFlags); virtual;
  109. procedure CheckRestoredClassType(const Path: string; Orig, Rest: TPasClassType; Flags: TPCCheckFlags); virtual;
  110. procedure CheckRestoredArgument(const Path: string; Orig, Rest: TPasArgument; Flags: TPCCheckFlags); virtual;
  111. procedure CheckRestoredProcedureType(const Path: string; Orig, Rest: TPasProcedureType; Flags: TPCCheckFlags); virtual;
  112. procedure CheckRestoredResultElement(const Path: string; Orig, Rest: TPasResultElement; Flags: TPCCheckFlags); virtual;
  113. procedure CheckRestoredFunctionType(const Path: string; Orig, Rest: TPasFunctionType; Flags: TPCCheckFlags); virtual;
  114. procedure CheckRestoredStringType(const Path: string; Orig, Rest: TPasStringType; Flags: TPCCheckFlags); virtual;
  115. procedure CheckRestoredVariable(const Path: string; Orig, Rest: TPasVariable; Flags: TPCCheckFlags); virtual;
  116. procedure CheckRestoredExportSymbol(const Path: string; Orig, Rest: TPasExportSymbol; Flags: TPCCheckFlags); virtual;
  117. procedure CheckRestoredConst(const Path: string; Orig, Rest: TPasConst; Flags: TPCCheckFlags); virtual;
  118. procedure CheckRestoredProperty(const Path: string; Orig, Rest: TPasProperty; Flags: TPCCheckFlags); virtual;
  119. procedure CheckRestoredMethodResolution(const Path: string; Orig, Rest: TPasMethodResolution; Flags: TPCCheckFlags); virtual;
  120. procedure CheckRestoredProcNameParts(const Path: string; Orig, Rest: TPasProcedure; Flags: TPCCheckFlags); virtual;
  121. procedure CheckRestoredProcedure(const Path: string; Orig, Rest: TPasProcedure; Flags: TPCCheckFlags); virtual;
  122. procedure CheckRestoredOperator(const Path: string; Orig, Rest: TPasOperator; Flags: TPCCheckFlags); virtual;
  123. procedure CheckRestoredProcedureBody(const Path: string; Orig, Rest: TProcedureBody; Flags: TPCCheckFlags); virtual;
  124. procedure CheckRestoredAttributes(const Path: string; Orig, Rest: TPasAttributes; Flags: TPCCheckFlags); virtual;
  125. procedure CheckRestoredImplCommand(const Path: string; Orig, Rest: TPasImplCommand; Flags: TPCCheckFlags); virtual;
  126. procedure CheckRestoredImplBeginBlock(const Path: string; Orig, Rest: TPasImplBeginBlock; Flags: TPCCheckFlags); virtual;
  127. procedure CheckRestoredImplAsmStatement(const Path: string; Orig, Rest: TPasImplAsmStatement; Flags: TPCCheckFlags); virtual;
  128. procedure CheckRestoredImplRepeatUntil(const Path: string; Orig, Rest: TPasImplRepeatUntil; Flags: TPCCheckFlags); virtual;
  129. procedure CheckRestoredImplIfElse(const Path: string; Orig, Rest: TPasImplIfElse; Flags: TPCCheckFlags); virtual;
  130. procedure CheckRestoredImplWhileDo(const Path: string; Orig, Rest: TPasImplWhileDo; Flags: TPCCheckFlags); virtual;
  131. procedure CheckRestoredImplWithDo(const Path: string; Orig, Rest: TPasImplWithDo; Flags: TPCCheckFlags); virtual;
  132. procedure CheckRestoredImplCaseOf(const Path: string; Orig, Rest: TPasImplCaseOf; Flags: TPCCheckFlags); virtual;
  133. procedure CheckRestoredImplCaseStatement(const Path: string; Orig, Rest: TPasImplCaseStatement; Flags: TPCCheckFlags); virtual;
  134. procedure CheckRestoredImplCaseElse(const Path: string; Orig, Rest: TPasImplCaseElse; Flags: TPCCheckFlags); virtual;
  135. procedure CheckRestoredImplForLoop(const Path: string; Orig, Rest: TPasImplForLoop; Flags: TPCCheckFlags); virtual;
  136. procedure CheckRestoredImplAssign(const Path: string; Orig, Rest: TPasImplAssign; Flags: TPCCheckFlags); virtual;
  137. procedure CheckRestoredImplSimple(const Path: string; Orig, Rest: TPasImplSimple; Flags: TPCCheckFlags); virtual;
  138. procedure CheckRestoredImplTry(const Path: string; Orig, Rest: TPasImplTry; Flags: TPCCheckFlags); virtual;
  139. procedure CheckRestoredImplTryHandler(const Path: string; Orig, Rest: TPasImplTryHandler; Flags: TPCCheckFlags); virtual;
  140. procedure CheckRestoredImplExceptOn(const Path: string; Orig, Rest: TPasImplExceptOn; Flags: TPCCheckFlags); virtual;
  141. procedure CheckRestoredImplRaise(const Path: string; Orig, Rest: TPasImplRaise; Flags: TPCCheckFlags); virtual;
  142. public
  143. property Analyzer: TPas2JSAnalyzer read FAnalyzer;
  144. property RestAnalyzer: TPas2JSAnalyzer read FRestAnalyzer;
  145. property PCUWriter: TPCUWriter read FPCUWriter write FPCUWriter;
  146. property PCUReader: TPCUReader read FPCUReader write FPCUReader;
  147. property InitialFlags: TPCUInitialFlags read FInitialFlags;
  148. end;
  149. { TTestPrecompile }
  150. TTestPrecompile = class(TCustomTestPrecompile)
  151. published
  152. procedure Test_Base256VLQ;
  153. procedure TestPC_EmptyUnit;
  154. procedure TestPC_Const;
  155. procedure TestPC_Var;
  156. procedure TestPC_Enum;
  157. procedure TestPC_Set;
  158. procedure TestPC_Set_InFunction;
  159. procedure TestPC_SetOfAnonymousEnumType;
  160. procedure TestPC_Record;
  161. procedure TestPC_Record_InFunction;
  162. procedure TestPC_RecordAdv;
  163. procedure TestPC_JSValue;
  164. procedure TestPC_Array;
  165. procedure TestPC_ArrayOfAnonymous;
  166. procedure TestPC_Array_InFunction;
  167. procedure TestPC_Proc;
  168. procedure TestPC_Proc_Nested;
  169. procedure TestPC_Proc_LocalConst;
  170. procedure TestPC_Proc_UTF8;
  171. procedure TestPC_Proc_Arg;
  172. procedure TestPC_ProcType;
  173. procedure TestPC_Proc_Anonymous;
  174. procedure TestPC_Proc_ArrayOfConst;
  175. procedure TestPC_Class;
  176. procedure TestPC_ClassForward;
  177. procedure TestPC_ClassConstructor;
  178. procedure TestPC_ClassDestructor;
  179. procedure TestPC_ClassDispatchMessage;
  180. procedure TestPC_Initialization;
  181. procedure TestPC_BoolSwitches;
  182. procedure TestPC_ClassInterface;
  183. procedure TestPC_Attributes;
  184. procedure TestPC_GenericFunction_Assign;
  185. procedure TestPC_GenericFunction_Asm;
  186. procedure TestPC_GenericFunction_RepeatUntil;
  187. procedure TestPC_GenericFunction_IfElse;
  188. procedure TestPC_GenericFunction_WhileDo;
  189. procedure TestPC_GenericFunction_WithDo;
  190. procedure TestPC_GenericFunction_CaseOf;
  191. procedure TestPC_GenericFunction_ForLoop;
  192. procedure TestPC_GenericFunction_Simple;
  193. procedure TestPC_GenericFunction_TryFinally;
  194. procedure TestPC_GenericFunction_TryExcept;
  195. procedure TestPC_GenericFunction_LocalProc;
  196. procedure TestPC_GenericFunction_AnonymousProc;
  197. procedure TestPC_GenericClass;
  198. procedure TestPC_GenericMethod;
  199. procedure TestPC_SpecializeClassSameUnit; // ToDo
  200. // ToDo: specialize local generic type in unit interface
  201. // ToDo: specialize local generic type in unit implementation
  202. // ToDo: specialize local generic type in proc decl
  203. // ToDo: specialize local generic type in proc body
  204. // ToDo: inline specialize local generic type in unit interface
  205. // ToDo: inline specialize local generic type in unit implementation
  206. // ToDo: inline specialize local generic type in proc decl
  207. // ToDo: inline specialize local generic type in proc body
  208. // ToDo: specialize extern generic type in unit interface
  209. // ToDo: specialize extern generic type in unit implementation
  210. // ToDo: specialize extern generic type in proc decl
  211. // ToDo: specialize extern generic type in proc body
  212. // ToDo: inline specialize extern generic type in unit interface
  213. // ToDo: inline specialize extern generic type in unit implementation
  214. // ToDo: inline specialize extern generic type in proc decl
  215. // ToDo: inline specialize extern generic type in proc body
  216. // ToDo: half specialize TBird<T> = class a: TAnt<word,T>; end;
  217. // ToDo: no specialize: TBird<T> = class a: TBird<T>; end;
  218. // ToDo: constraints
  219. procedure TestPC_UseUnit;
  220. procedure TestPC_UseUnit_Class;
  221. procedure TestPC_UseIndirectUnit;
  222. end;
  223. function CompareListOfProcScopeRef(Item1, Item2: Pointer): integer;
  224. implementation
  225. function CompareListOfProcScopeRef(Item1, Item2: Pointer): integer;
  226. var
  227. Ref1: TPasScopeReference absolute Item1;
  228. Ref2: TPasScopeReference absolute Item2;
  229. begin
  230. Result:=CompareText(Ref1.Element.Name,Ref2.Element.Name);
  231. if Result<>0 then exit;
  232. Result:=ComparePointer(Ref1.Element,Ref2.Element);
  233. end;
  234. { TCustomTestPrecompile }
  235. procedure TCustomTestPrecompile.OnFilerGetSrc(Sender: TObject;
  236. aFilename: string; out p: PChar; out Count: integer);
  237. var
  238. i: Integer;
  239. aModule: TTestEnginePasResolver;
  240. Src: String;
  241. begin
  242. for i:=0 to ResolverCount-1 do
  243. begin
  244. aModule:=Resolvers[i];
  245. if aModule.Filename<>aFilename then continue;
  246. Src:=aModule.Source;
  247. p:=PChar(Src);
  248. Count:=length(Src);
  249. end;
  250. end;
  251. function TCustomTestPrecompile.OnConverterIsElementUsed(Sender: TObject;
  252. El: TPasElement): boolean;
  253. begin
  254. Result:=Analyzer.IsUsed(El);
  255. end;
  256. function TCustomTestPrecompile.OnConverterIsTypeInfoUsed(Sender: TObject;
  257. El: TPasElement): boolean;
  258. begin
  259. Result:=Analyzer.IsTypeInfoUsed(El);
  260. end;
  261. function TCustomTestPrecompile.OnRestConverterIsElementUsed(Sender: TObject;
  262. El: TPasElement): boolean;
  263. begin
  264. Result:=RestAnalyzer.IsUsed(El);
  265. end;
  266. function TCustomTestPrecompile.OnRestConverterIsTypeInfoUsed(Sender: TObject;
  267. El: TPasElement): boolean;
  268. begin
  269. Result:=RestAnalyzer.IsTypeInfoUsed(El);
  270. end;
  271. function TCustomTestPrecompile.OnRestResolverFindUnit(const aUnitName: String
  272. ): TPasModule;
  273. function FindRestUnit(Name: string): TPasModule;
  274. var
  275. i: Integer;
  276. CurEngine: TTestEnginePasResolver;
  277. CurUnitName: String;
  278. begin
  279. for i:=0 to ResolverCount-1 do
  280. begin
  281. CurEngine:=Resolvers[i];
  282. CurUnitName:=ExtractFileUnitName(CurEngine.Filename);
  283. {$IFDEF VerbosePCUFiler}
  284. //writeln('TCustomTestPrecompile.FindRestUnit Checking ',i,'/',ResolverCount,' ',CurEngine.Filename,' ',CurUnitName);
  285. {$ENDIF}
  286. if CompareText(Name,CurUnitName)=0 then
  287. begin
  288. Result:=CurEngine.Module;
  289. if Result<>nil then
  290. begin
  291. {$IFDEF VerbosePCUFiler}
  292. //writeln('TCustomTestPrecompile.FindRestUnit Found parsed module: ',Result.Filename);
  293. {$ENDIF}
  294. exit;
  295. end;
  296. {$IFDEF VerbosePCUFiler}
  297. writeln('TCustomTestPrecompile.FindRestUnit PARSING unit "',CurEngine.Filename,'"');
  298. {$ENDIF}
  299. Fail('not parsed');
  300. end;
  301. end;
  302. end;
  303. var
  304. DefNamespace: String;
  305. begin
  306. if (Pos('.',aUnitName)<1) then
  307. begin
  308. DefNamespace:=GetDefaultNamespace;
  309. if DefNamespace<>'' then
  310. begin
  311. Result:=FindRestUnit(DefNamespace+'.'+aUnitName);
  312. if Result<>nil then exit;
  313. end;
  314. end;
  315. Result:=FindRestUnit(aUnitName);
  316. end;
  317. procedure TCustomTestPrecompile.SetUp;
  318. begin
  319. inherited SetUp;
  320. FInitialFlags:=TPCUInitialFlags.Create;
  321. FAnalyzer:=TPas2JSAnalyzer.Create;
  322. Analyzer.Resolver:=Engine;
  323. Analyzer.Options:=Analyzer.Options+[paoImplReferences];
  324. Converter.OnIsElementUsed:=@OnConverterIsElementUsed;
  325. Converter.OnIsTypeInfoUsed:=@OnConverterIsTypeInfoUsed;
  326. end;
  327. procedure TCustomTestPrecompile.TearDown;
  328. begin
  329. FreeAndNil(FAnalyzer);
  330. FreeAndNil(FPCUWriter);
  331. FreeAndNil(FPCUReader);
  332. FreeAndNil(FInitialFlags);
  333. inherited TearDown;
  334. end;
  335. function TCustomTestPrecompile.CreateConverter: TPasToJSConverter;
  336. begin
  337. Result:=inherited CreateConverter;
  338. Result.Options:=Result.Options+[coStoreImplJS];
  339. end;
  340. procedure TCustomTestPrecompile.ParseUnit;
  341. begin
  342. inherited ParseUnit;
  343. Analyzer.AnalyzeModule(Module);
  344. end;
  345. procedure TCustomTestPrecompile.WriteReadUnit;
  346. var
  347. ms: TMemoryStream;
  348. PCU, RestJSSrc, OrigJSSrc: string;
  349. // restored classes:
  350. RestResolver: TTestEnginePasResolver;
  351. RestFileResolver: TFileResolver;
  352. RestScanner: TPas2jsPasScanner;
  353. RestParser: TPasParser;
  354. RestConverter: TPasToJSConverter;
  355. RestJSModule: TJSSourceElements;
  356. InitialParserOptions: TPOptions;
  357. begin
  358. InitialParserOptions:=Parser.Options;
  359. Analyzer.Options:=Analyzer.Options+[paoSkipGenericProc];
  360. ConvertUnit;
  361. FPCUWriter:=TPCUWriter.Create;
  362. FPCUReader:=TPCUReader.Create;
  363. ms:=TMemoryStream.Create;
  364. RestParser:=nil;
  365. RestScanner:=nil;
  366. RestResolver:=nil;
  367. RestFileResolver:=nil;
  368. RestConverter:=nil;
  369. RestJSModule:=nil;
  370. try
  371. try
  372. PCUWriter.OnGetSrc:=@OnFilerGetSrc;
  373. PCUWriter.OnIsElementUsed:=@OnConverterIsElementUsed;
  374. PCUWriter.WritePCU(Engine,Converter,InitialFlags,ms,false);
  375. except
  376. on E: Exception do
  377. begin
  378. {$IFDEF VerbosePas2JS}
  379. writeln('TCustomTestPrecompile.WriteReadUnit WRITE failed');
  380. {$ENDIF}
  381. Fail('Write failed('+E.ClassName+'): '+E.Message);
  382. end;
  383. end;
  384. try
  385. PCU:='';
  386. SetLength(PCU,ms.Size);
  387. System.Move(ms.Memory^,PCU[1],length(PCU));
  388. writeln('TCustomTestPrecompile.WriteReadUnit PCU START-----');
  389. writeln(PCU);
  390. writeln('TCustomTestPrecompile.WriteReadUnit PCU END-------');
  391. RestFileResolver:=TFileResolver.Create;
  392. RestScanner:=TPas2jsPasScanner.Create(RestFileResolver);
  393. InitScanner(RestScanner);
  394. RestResolver:=TTestEnginePasResolver.Create;
  395. RestResolver.Filename:=Engine.Filename;
  396. RestResolver.AddObjFPCBuiltInIdentifiers(btAllJSBaseTypes,bfAllJSBaseProcs);
  397. RestResolver.OnFindUnit:=@OnRestResolverFindUnit;
  398. RestParser:=TPasParser.Create(RestScanner,RestFileResolver,RestResolver);
  399. RestParser.Options:=InitialParserOptions;
  400. RestResolver.CurrentParser:=RestParser;
  401. ms.Position:=0;
  402. PCUReader.ReadPCU(RestResolver,ms);
  403. if not PCUReader.ReadContinue then
  404. Fail('ReadContinue=false, pending used interfaces');
  405. except
  406. on E: Exception do
  407. begin
  408. {$IFDEF VerbosePas2JS}
  409. writeln('TCustomTestPrecompile.WriteReadUnit READ failed');
  410. {$ENDIF}
  411. Fail('Read failed('+E.ClassName+'): '+E.Message);
  412. end;
  413. end;
  414. // analyze
  415. FRestAnalyzer:=TPas2JSAnalyzer.Create;
  416. FRestAnalyzer.Resolver:=RestResolver;
  417. FRestAnalyzer.Options:=FRestAnalyzer.Options+[paoSkipGenericProc];
  418. try
  419. RestAnalyzer.AnalyzeModule(RestResolver.RootElement);
  420. except
  421. on E: Exception do
  422. begin
  423. {$IFDEF VerbosePas2JS}
  424. writeln('TCustomTestPrecompile.WriteReadUnit ANALYZEMODULE failed');
  425. {$ENDIF}
  426. Fail('AnalyzeModule precompiled failed('+E.ClassName+'): '+E.Message);
  427. end;
  428. end;
  429. // check parser+resolver+analyzer
  430. CheckRestoredResolver(Engine,RestResolver,[]);
  431. // convert using the precompiled procs
  432. RestConverter:=CreateConverter;
  433. RestConverter.Options:=Converter.Options;
  434. RestConverter.OnIsElementUsed:=@OnRestConverterIsElementUsed;
  435. RestConverter.OnIsTypeInfoUsed:=@OnRestConverterIsTypeInfoUsed;
  436. try
  437. RestJSModule:=RestConverter.ConvertPasElement(RestResolver.RootElement,RestResolver) as TJSSourceElements;
  438. except
  439. on E: Exception do
  440. begin
  441. {$IFDEF VerbosePas2JS}
  442. writeln('TCustomTestPrecompile.WriteReadUnit CONVERTER failed');
  443. {$ENDIF}
  444. Fail('Convert precompiled failed('+E.ClassName+'): '+E.Message);
  445. end;
  446. end;
  447. OrigJSSrc:=JSToStr(JSModule);
  448. RestJSSrc:=JSToStr(RestJSModule);
  449. if OrigJSSrc<>RestJSSrc then
  450. begin
  451. writeln('TCustomTestPrecompile.WriteReadUnit OrigJSSrc:---------START');
  452. writeln(OrigJSSrc);
  453. writeln('TCustomTestPrecompile.WriteReadUnit OrigJSSrc:---------END');
  454. writeln('TCustomTestPrecompile.WriteReadUnit RestJSSrc:---------START');
  455. writeln(RestJSSrc);
  456. writeln('TCustomTestPrecompile.WriteReadUnit RestJSSrc:---------END');
  457. CheckDiff('WriteReadUnit JS diff',OrigJSSrc,RestJSSrc);
  458. end;
  459. finally
  460. RestJSModule.Free;
  461. RestConverter.Free;
  462. FreeAndNil(FRestAnalyzer);
  463. RestParser.Free;
  464. RestScanner.Free;
  465. if (RestResolver<>nil) and (RestResolver.RootElement<>nil) then
  466. begin
  467. RestResolver.RootElement.ReleaseUsedUnits;
  468. RestResolver.RootElement.Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
  469. end;
  470. RestResolver.Free; // free parser before resolver
  471. RestFileResolver.Free;
  472. ms.Free;
  473. end;
  474. end;
  475. procedure TCustomTestPrecompile.StartParsing;
  476. begin
  477. inherited StartParsing;
  478. FInitialFlags.ParserOptions:=Parser.Options;
  479. FInitialFlags.ModeSwitches:=Scanner.CurrentModeSwitches;
  480. FInitialFlags.BoolSwitches:=Scanner.CurrentBoolSwitches;
  481. FInitialFlags.ConverterOptions:=Converter.Options;
  482. FInitialFlags.TargetPlatform:=Converter.Globals.TargetPlatform;
  483. FInitialFlags.TargetProcessor:=Converter.Globals.TargetProcessor;
  484. // ToDo: defines
  485. end;
  486. function TCustomTestPrecompile.CheckRestoredObject(const Path: string; Orig,
  487. Rest: TObject): boolean;
  488. begin
  489. if Orig=nil then
  490. begin
  491. if Rest<>nil then
  492. Fail(Path+': Orig=nil Rest='+GetObjName(Rest));
  493. exit(false);
  494. end
  495. else if Rest=nil then
  496. Fail(Path+': Orig='+GetObjName(Orig)+' Rest=nil');
  497. if Orig.ClassType<>Rest.ClassType then
  498. Fail(Path+': Orig='+GetObjName(Orig)+' Rest='+GetObjName(Rest));
  499. Result:=true;
  500. end;
  501. procedure TCustomTestPrecompile.CheckRestoredJS(const Path, Orig, Rest: string);
  502. var
  503. OrigList, RestList: TStringList;
  504. begin
  505. if Orig=Rest then exit;
  506. writeln('TCustomTestPrecompile.CheckRestoredJS ORIG START--------------');
  507. writeln(Orig);
  508. writeln('TCustomTestPrecompile.CheckRestoredJS ORIG END----------------');
  509. writeln('TCustomTestPrecompile.CheckRestoredJS REST START--------------');
  510. writeln(Rest);
  511. writeln('TCustomTestPrecompile.CheckRestoredJS REST END----------------');
  512. OrigList:=TStringList.Create;
  513. RestList:=TStringList.Create;
  514. try
  515. OrigList.Text:=Orig;
  516. RestList.Text:=Rest;
  517. CheckRestoredStringList(Path,OrigList,RestList);
  518. finally
  519. OrigList.Free;
  520. RestList.Free;
  521. end;
  522. end;
  523. procedure TCustomTestPrecompile.CheckRestoredStringList(const Path: string;
  524. Orig, Rest: TStrings);
  525. var
  526. i: Integer;
  527. begin
  528. CheckRestoredObject(Path,Orig,Rest);
  529. if Orig=nil then exit;
  530. if Orig.Text=Rest.Text then exit;
  531. for i:=0 to Orig.Count-1 do
  532. begin
  533. if i>=Rest.Count then
  534. Fail(Path+' missing: '+Orig[i]);
  535. writeln(' ',i,': '+Orig[i]);
  536. end;
  537. if Orig.Count<Rest.Count then
  538. Fail(Path+' too much: '+Rest[Orig.Count]);
  539. end;
  540. procedure TCustomTestPrecompile.CheckRestoredResolver(Original,
  541. Restored: TPas2JSResolver; Flags: TPCCheckFlags);
  542. var
  543. OrigParser, RestParser: TPasParser;
  544. begin
  545. AssertNotNull('CheckRestoredResolver Original',Original);
  546. AssertNotNull('CheckRestoredResolver Restored',Restored);
  547. if Original.ClassType<>Restored.ClassType then
  548. Fail('CheckRestoredResolver Original='+Original.ClassName+' Restored='+Restored.ClassName);
  549. CheckRestoredElement('RootElement',Original.RootElement,Restored.RootElement,Flags);
  550. OrigParser:=Original.CurrentParser;
  551. RestParser:=Restored.CurrentParser;
  552. if OrigParser.Options<>RestParser.Options then
  553. Fail('CheckRestoredResolver Parser.Options');
  554. if OrigParser.Scanner.CurrentBoolSwitches<>RestParser.Scanner.CurrentBoolSwitches then
  555. Fail('CheckRestoredResolver Scanner.BoolSwitches');
  556. if OrigParser.Scanner.CurrentModeSwitches<>RestParser.Scanner.CurrentModeSwitches then
  557. Fail('CheckRestoredResolver Scanner.ModeSwitches');
  558. end;
  559. procedure TCustomTestPrecompile.CheckRestoredDeclarations(const Path: string;
  560. Orig, Rest: TPasDeclarations; Flags: TPCCheckFlags);
  561. var
  562. i: Integer;
  563. OrigDecl, RestDecl: TPasElement;
  564. SubPath: String;
  565. begin
  566. for i:=0 to Orig.Declarations.Count-1 do
  567. begin
  568. OrigDecl:=TPasElement(Orig.Declarations[i]);
  569. if i>=Rest.Declarations.Count then
  570. AssertEquals(Path+'.Declarations.Count',Orig.Declarations.Count,Rest.Declarations.Count);
  571. RestDecl:=TPasElement(Rest.Declarations[i]);
  572. SubPath:=Path+'['+IntToStr(i)+']';
  573. if OrigDecl.Name<>'' then
  574. SubPath:=SubPath+'"'+OrigDecl.Name+'"'
  575. else
  576. SubPath:=SubPath+'?noname?';
  577. CheckRestoredElement(SubPath,OrigDecl,RestDecl,Flags);
  578. end;
  579. AssertEquals(Path+'.Declarations.Count',Orig.Declarations.Count,Rest.Declarations.Count);
  580. end;
  581. procedure TCustomTestPrecompile.CheckRestoredSection(const Path: string; Orig,
  582. Rest: TPasSection; Flags: TPCCheckFlags);
  583. begin
  584. if length(Orig.UsesClause)>0 then
  585. ; // ToDo
  586. CheckRestoredDeclarations(Path,Orig,Rest,Flags);
  587. end;
  588. procedure TCustomTestPrecompile.CheckRestoredModule(const Path: string; Orig,
  589. Rest: TPasModule; Flags: TPCCheckFlags);
  590. procedure CheckInitFinal(const Path: string; OrigBlock, RestBlock: TPasImplBlock);
  591. begin
  592. CheckRestoredObject(Path,OrigBlock,RestBlock);
  593. if OrigBlock=nil then exit;
  594. CheckRestoredCustomData(Path+'.CustomData',RestBlock,OrigBlock.CustomData,RestBlock.CustomData,Flags);
  595. end;
  596. begin
  597. if not (Orig.CustomData is TPas2JSModuleScope) then
  598. Fail(Path+'.CustomData is not TPasModuleScope'+GetObjName(Orig.CustomData));
  599. CheckRestoredElement(Path+'.InterfaceSection',Orig.InterfaceSection,Rest.InterfaceSection,Flags);
  600. CheckRestoredElement(Path+'.ImplementationSection',Orig.ImplementationSection,Rest.ImplementationSection,Flags);
  601. if Orig is TPasProgram then
  602. CheckRestoredElement(Path+'.ProgramSection',TPasProgram(Orig).ProgramSection,TPasProgram(Rest).ProgramSection,Flags)
  603. else if Orig is TPasLibrary then
  604. CheckRestoredElement(Path+'.LibrarySection',TPasLibrary(Orig).LibrarySection,TPasLibrary(Rest).LibrarySection,Flags);
  605. CheckInitFinal(Path+'.InitializationSection',Orig.InitializationSection,Rest.InitializationSection);
  606. CheckInitFinal(Path+'.FnializationSection',Orig.FinalizationSection,Rest.FinalizationSection);
  607. end;
  608. procedure TCustomTestPrecompile.CheckRestoredScopeReference(const Path: string;
  609. Orig, Rest: TPasScope; Flags: TPCCheckFlags);
  610. begin
  611. if not CheckRestoredObject(Path,Orig,Rest) then exit;
  612. CheckRestoredReference(Path+'.Element',Orig.Element,Rest.Element);
  613. if Flags=[] then ;
  614. end;
  615. procedure TCustomTestPrecompile.CheckRestoredElementBase(const Path: string;
  616. Orig, Rest: TPasElementBase; Flags: TPCCheckFlags);
  617. begin
  618. CheckRestoredObject(Path+'.CustomData',Orig.CustomData,Rest.CustomData);
  619. if Flags=[] then ;
  620. end;
  621. procedure TCustomTestPrecompile.CheckRestoredResolveData(const Path: string;
  622. Orig, Rest: TResolveData; Flags: TPCCheckFlags);
  623. begin
  624. CheckRestoredElementBase(Path,Orig,Rest,Flags);
  625. end;
  626. procedure TCustomTestPrecompile.CheckRestoredPasScope(const Path: string; Orig,
  627. Rest: TPasScope; Flags: TPCCheckFlags);
  628. begin
  629. CheckRestoredReference(Path+'.VisibilityContext',Orig.VisibilityContext,Rest.VisibilityContext);
  630. CheckRestoredResolveData(Path,Orig,Rest,Flags);
  631. end;
  632. procedure TCustomTestPrecompile.CheckRestoredModuleScope(const Path: string;
  633. Orig, Rest: TPas2JSModuleScope; Flags: TPCCheckFlags);
  634. begin
  635. AssertEquals(Path+'.FirstName',Orig.FirstName,Rest.FirstName);
  636. if Orig.Flags<>Rest.Flags then
  637. Fail(Path+'.Flags');
  638. if Orig.BoolSwitches<>Rest.BoolSwitches then
  639. Fail(Path+'.BoolSwitches');
  640. CheckRestoredReference(Path+'.AssertClass',Orig.AssertClass,Rest.AssertClass);
  641. CheckRestoredReference(Path+'.AssertDefConstructor',Orig.AssertDefConstructor,Rest.AssertDefConstructor);
  642. CheckRestoredReference(Path+'.AssertMsgConstructor',Orig.AssertMsgConstructor,Rest.AssertMsgConstructor);
  643. CheckRestoredReference(Path+'.RangeErrorClass',Orig.RangeErrorClass,Rest.RangeErrorClass);
  644. CheckRestoredReference(Path+'.RangeErrorConstructor',Orig.RangeErrorConstructor,Rest.RangeErrorConstructor);
  645. CheckRestoredReference(Path+'.SystemTVarRec',Orig.SystemTVarRec,Rest.SystemTVarRec);
  646. CheckRestoredReference(Path+'.SystemVarRecs',Orig.SystemVarRecs,Rest.SystemVarRecs);
  647. CheckRestoredPasScope(Path,Orig,Rest,Flags);
  648. end;
  649. procedure TCustomTestPrecompile.CheckRestoredIdentifierScope(
  650. const Path: string; Orig, Rest: TPasIdentifierScope; Flags: TPCCheckFlags);
  651. var
  652. OrigList: TFPList;
  653. i: Integer;
  654. OrigIdentifier, RestIdentifier: TPasIdentifier;
  655. begin
  656. OrigList:=nil;
  657. try
  658. OrigList:=Orig.GetLocalIdentifiers;
  659. for i:=0 to OrigList.Count-1 do
  660. begin
  661. OrigIdentifier:=TPasIdentifier(OrigList[i]);
  662. RestIdentifier:=Rest.FindLocalIdentifier(OrigIdentifier.Identifier);
  663. if RestIdentifier=nil then
  664. Fail(Path+'.Local['+OrigIdentifier.Identifier+'] Missing RestIdentifier Orig='+OrigIdentifier.Identifier);
  665. repeat
  666. AssertEquals(Path+'.Local.Identifier',OrigIdentifier.Identifier,RestIdentifier.Identifier);
  667. CheckRestoredReference(Path+'.Local',OrigIdentifier.Element,RestIdentifier.Element);
  668. if OrigIdentifier.Kind<>RestIdentifier.Kind then
  669. Fail(Path+'.Local['+OrigIdentifier.Identifier+'] Orig='+PCUIdentifierKindNames[OrigIdentifier.Kind]+' Rest='+PCUIdentifierKindNames[RestIdentifier.Kind]);
  670. if OrigIdentifier.NextSameIdentifier=nil then
  671. begin
  672. if RestIdentifier.NextSameIdentifier<>nil then
  673. Fail(Path+'.Local['+OrigIdentifier.Identifier+'] Too many RestIdentifier.NextSameIdentifier='+GetObjName(RestIdentifier.Element));
  674. break;
  675. end
  676. else begin
  677. if RestIdentifier.NextSameIdentifier=nil then
  678. Fail(Path+'.Local['+OrigIdentifier.Identifier+'] Missing RestIdentifier.NextSameIdentifier Orig='+GetObjName(OrigIdentifier.NextSameIdentifier.Element));
  679. end;
  680. if CompareText(OrigIdentifier.Identifier,OrigIdentifier.NextSameIdentifier.Identifier)<>0 then
  681. Fail(Path+'.Local['+OrigIdentifier.Identifier+'] Cur.Identifier<>Next.Identifier '+OrigIdentifier.Identifier+'<>'+OrigIdentifier.NextSameIdentifier.Identifier);
  682. OrigIdentifier:=OrigIdentifier.NextSameIdentifier;
  683. RestIdentifier:=RestIdentifier.NextSameIdentifier;
  684. until false;
  685. end;
  686. finally
  687. OrigList.Free;
  688. end;
  689. CheckRestoredPasScope(Path,Orig,Rest,Flags);
  690. end;
  691. procedure TCustomTestPrecompile.CheckRestoredSectionScope(const Path: string;
  692. Orig, Rest: TPas2JSSectionScope; Flags: TPCCheckFlags);
  693. var
  694. i: Integer;
  695. OrigUses, RestUses: TPas2JSSectionScope;
  696. OrigHelperEntry, RestHelperEntry: TPRHelperEntry;
  697. begin
  698. if Orig.BoolSwitches<>Rest.BoolSwitches then
  699. Fail(Path+'.BoolSwitches Orig='+BoolSwitchesToStr(Orig.BoolSwitches)+' Rest='+BoolSwitchesToStr(Rest.BoolSwitches));
  700. if Orig.ModeSwitches<>Rest.ModeSwitches then
  701. Fail(Path+'.ModeSwitches');
  702. AssertEquals(Path+' UsesScopes.Count',Orig.UsesScopes.Count,Rest.UsesScopes.Count);
  703. for i:=0 to Orig.UsesScopes.Count-1 do
  704. begin
  705. OrigUses:=TPas2JSSectionScope(Orig.UsesScopes[i]);
  706. if not (TObject(Rest.UsesScopes[i]) is TPas2JSSectionScope) then
  707. Fail(Path+'.UsesScopes['+IntToStr(i)+'] Rest='+GetObjName(TObject(Rest.UsesScopes[i])));
  708. RestUses:=TPas2JSSectionScope(Rest.UsesScopes[i]);
  709. if OrigUses.ClassType<>RestUses.ClassType then
  710. Fail(Path+'.UsesScopes['+IntToStr(i)+'] Orig='+GetObjName(OrigUses)+' Rest='+GetObjName(RestUses));
  711. CheckRestoredReference(Path+'.UsesScopes['+IntToStr(i)+']',OrigUses.Element,RestUses.Element);
  712. end;
  713. AssertEquals(Path+' length(Helpers)',length(Orig.Helpers),length(Rest.Helpers));
  714. for i:=0 to length(Orig.Helpers)-1 do
  715. begin
  716. OrigHelperEntry:=TPRHelperEntry(Orig.Helpers[i]);
  717. RestHelperEntry:=TPRHelperEntry(Rest.Helpers[i]);
  718. if OrigHelperEntry.ClassType<>RestHelperEntry.ClassType then
  719. Fail(Path+'.Helpers['+IntToStr(i)+'] Orig='+GetObjName(OrigHelperEntry)+' Rest='+GetObjName(RestHelperEntry));
  720. AssertEquals(Path+'.Helpers['+IntToStr(i)+'].Added',OrigHelperEntry.Added,RestHelperEntry.Added);
  721. CheckRestoredReference(Path+'.Helpers['+IntToStr(i)+'].Helper',OrigHelperEntry.Helper,RestHelperEntry.Helper);
  722. CheckRestoredReference(Path+'.Helpers['+IntToStr(i)+'].HelperForType',OrigHelperEntry.HelperForType,RestHelperEntry.HelperForType);
  723. end;
  724. AssertEquals(Path+'.Finished',Orig.Finished,Rest.Finished);
  725. CheckRestoredIdentifierScope(Path,Orig,Rest,Flags);
  726. end;
  727. procedure TCustomTestPrecompile.CheckRestoredInitialFinalizationScope(
  728. const Path: string; Orig, Rest: TPas2JSInitialFinalizationScope;
  729. Flags: TPCCheckFlags);
  730. begin
  731. CheckRestoredScopeRefs(Path+'.References',Orig.References,Rest.References,Flags);
  732. if Orig.JS<>Rest.JS then
  733. CheckRestoredJS(Path+'.JS',Orig.JS,Rest.JS);
  734. end;
  735. procedure TCustomTestPrecompile.CheckRestoredEnumTypeScope(const Path: string;
  736. Orig, Rest: TPasEnumTypeScope; Flags: TPCCheckFlags);
  737. begin
  738. CheckRestoredReference(Path+'.CanonicalSet',Orig.CanonicalSet,Rest.CanonicalSet);
  739. CheckRestoredIdentifierScope(Path,Orig,Rest,Flags);
  740. end;
  741. procedure TCustomTestPrecompile.CheckRestoredRecordScope(const Path: string;
  742. Orig, Rest: TPas2jsRecordScope; Flags: TPCCheckFlags);
  743. begin
  744. CheckRestoredReference(Path+'.DefaultProperty',Orig.DefaultProperty,Rest.DefaultProperty);
  745. CheckRestoredIdentifierScope(Path,Orig,Rest,Flags);
  746. end;
  747. procedure TCustomTestPrecompile.CheckRestoredClassScope(const Path: string;
  748. Orig, Rest: TPas2JSClassScope; Flags: TPCCheckFlags);
  749. var
  750. i, j: Integer;
  751. OrigObj, RestObj: TObject;
  752. OrigMap, RestMap: TPasClassIntfMap;
  753. SubPath: String;
  754. begin
  755. CheckRestoredScopeReference(Path+'.AncestorScope',Orig.AncestorScope,Rest.AncestorScope,Flags);
  756. CheckRestoredElement(Path+'.CanonicalClassOf',Orig.CanonicalClassOf,Rest.CanonicalClassOf,Flags);
  757. CheckRestoredReference(Path+'.DirectAncestor',Orig.DirectAncestor,Rest.DirectAncestor);
  758. CheckRestoredReference(Path+'.DefaultProperty',Orig.DefaultProperty,Rest.DefaultProperty);
  759. if Orig.Flags<>Rest.Flags then
  760. Fail(Path+'.Flags');
  761. AssertEquals(Path+'.AbstractProcs.length',length(Orig.AbstractProcs),length(Rest.AbstractProcs));
  762. for i:=0 to length(Orig.AbstractProcs)-1 do
  763. CheckRestoredReference(Path+'.AbstractProcs['+IntToStr(i)+']',Orig.AbstractProcs[i],Rest.AbstractProcs[i]);
  764. CheckRestoredReference(Path+'.NewInstanceFunction',Orig.NewInstanceFunction,Rest.NewInstanceFunction);
  765. AssertEquals(Path+'.GUID',Orig.GUID,Rest.GUID);
  766. AssertEquals(Path+'.DispatchField',Orig.DispatchField,Rest.DispatchField);
  767. AssertEquals(Path+'.DispatchStrField',Orig.DispatchStrField,Rest.DispatchStrField);
  768. CheckRestoredObject('.Interfaces',Orig.Interfaces,Rest.Interfaces);
  769. if Orig.Interfaces<>nil then
  770. begin
  771. AssertEquals(Path+'.Interfaces.Count',Orig.Interfaces.Count,Rest.Interfaces.Count);
  772. for i:=0 to Orig.Interfaces.Count-1 do
  773. begin
  774. SubPath:=Path+'.Interfaces['+IntToStr(i)+']';
  775. OrigObj:=TObject(Orig.Interfaces[i]);
  776. RestObj:=TObject(Rest.Interfaces[i]);
  777. CheckRestoredObject(SubPath,OrigObj,RestObj);
  778. if OrigObj is TPasProperty then
  779. CheckRestoredReference(SubPath+'(TPasProperty)',
  780. TPasProperty(OrigObj),TPasProperty(RestObj))
  781. else if OrigObj is TPasClassIntfMap then
  782. begin
  783. OrigMap:=TPasClassIntfMap(OrigObj);
  784. RestMap:=TPasClassIntfMap(RestObj);
  785. repeat
  786. AssertNotNull(SubPath+'.Intf Orig',OrigMap.Intf);
  787. CheckRestoredObject(SubPath+'.Intf',OrigMap.Intf,RestMap.Intf);
  788. SubPath:=SubPath+'.Map('+OrigMap.Intf.Name+')';
  789. CheckRestoredObject(SubPath+'.Element',OrigMap.Element,RestMap.Element);
  790. CheckRestoredObject(SubPath+'.Procs',OrigMap.Procs,RestMap.Procs);
  791. if OrigMap.Procs=nil then
  792. begin
  793. if OrigMap.Intf.Members.Count>0 then
  794. Fail(SubPath+' expected '+IntToStr(OrigMap.Intf.Members.Count)+' procs, but Procs=nil');
  795. end
  796. else
  797. for j:=0 to OrigMap.Procs.Count-1 do
  798. begin
  799. OrigObj:=TObject(OrigMap.Procs[j]);
  800. RestObj:=TObject(RestMap.Procs[j]);
  801. CheckRestoredReference(SubPath+'.Procs['+IntToStr(j)+']',TPasElement(OrigObj),TPasElement(RestObj));
  802. end;
  803. AssertEquals(Path+'.Procs.Count',OrigMap.Procs.Count,RestMap.Procs.Count);
  804. CheckRestoredObject(SubPath+'.AncestorMap',OrigMap.AncestorMap,RestMap.AncestorMap);
  805. OrigMap:=OrigMap.AncestorMap;
  806. RestMap:=RestMap.AncestorMap;
  807. until OrigMap=nil;
  808. end
  809. else
  810. Fail(SubPath+' unknown class '+GetObjName(OrigObj));
  811. end;
  812. end;
  813. CheckRestoredIdentifierScope(Path,Orig,Rest,Flags);
  814. end;
  815. procedure TCustomTestPrecompile.CheckRestoredProcScope(const Path: string;
  816. Orig, Rest: TPas2JSProcedureScope; Flags: TPCCheckFlags);
  817. var
  818. DeclProc: TPasProcedure;
  819. begin
  820. CheckRestoredReference(Path+'.DeclarationProc',Orig.DeclarationProc,Rest.DeclarationProc);
  821. CheckRestoredReference(Path+'.ImplProc',Orig.ImplProc,Rest.ImplProc);
  822. if Orig.BodyJS<>Rest.BodyJS then
  823. CheckRestoredJS(Path+'.BodyJS',Orig.BodyJS,Rest.BodyJS);
  824. CheckRestoredStringList(Path+'.GlobalJS',Orig.GlobalJS,Rest.GlobalJS);
  825. if Rest.DeclarationProc=nil then
  826. begin
  827. DeclProc:=TPasProcedure(Rest.Element);
  828. AssertEquals(Path+'.ResultVarName',Orig.ResultVarName,Rest.ResultVarName);
  829. CheckRestoredReference(Path+'.OverriddenProc',Orig.OverriddenProc,Rest.OverriddenProc);
  830. CheckRestoredScopeReference(Path+'.ClassScope',Orig.ClassRecScope,Rest.ClassRecScope,Flags);
  831. CheckRestoredElement(Path+'.SelfArg',Orig.SelfArg,Rest.SelfArg,Flags);
  832. if Orig.Flags<>Rest.Flags then
  833. Fail(Path+'.Flags');
  834. if Orig.BoolSwitches<>Rest.BoolSwitches then
  835. Fail(Path+'.BoolSwitches');
  836. if Orig.ModeSwitches<>Rest.ModeSwitches then
  837. Fail(Path+'.ModeSwitches');
  838. if Engine.ProcCanBePrecompiled(DeclProc) then
  839. begin
  840. CheckRestoredScopeRefs(Path+'.References',Orig.References,Rest.References,Flags);
  841. end;
  842. //CheckRestoredIdentifierScope(Path,Orig,Rest);
  843. end
  844. else
  845. begin
  846. // ImplProc
  847. end;
  848. end;
  849. procedure TCustomTestPrecompile.CheckRestoredScopeRefs(const Path: string;
  850. Orig, Rest: TPasScopeReferences; Flags: TPCCheckFlags);
  851. var
  852. OrigList, RestList: TFPList;
  853. i: Integer;
  854. OrigRef, RestRef: TPasScopeReference;
  855. begin
  856. if Flags=[] then ;
  857. CheckRestoredObject(Path,Orig,Rest);
  858. if Orig=nil then exit;
  859. OrigList:=nil;
  860. RestList:=nil;
  861. try
  862. OrigList:=Orig.GetList;
  863. RestList:=Rest.GetList;
  864. OrigList.Sort(@CompareListOfProcScopeRef);
  865. RestList.Sort(@CompareListOfProcScopeRef);
  866. for i:=0 to OrigList.Count-1 do
  867. begin
  868. OrigRef:=TPasScopeReference(OrigList[i]);
  869. if i>=RestList.Count then
  870. Fail(Path+'['+IntToStr(i)+'] Missing in Rest: "'+OrigRef.Element.Name+'"');
  871. RestRef:=TPasScopeReference(RestList[i]);
  872. CheckRestoredReference(Path+'['+IntToStr(i)+'].Name="'+OrigRef.Element.Name+'"',OrigRef.Element,RestRef.Element);
  873. if OrigRef.Access<>RestRef.Access then
  874. AssertEquals(Path+'['+IntToStr(i)+']"'+OrigRef.Element.Name+'".Access',
  875. PCUPSRefAccessNames[OrigRef.Access],PCUPSRefAccessNames[RestRef.Access]);
  876. end;
  877. if RestList.Count>OrigList.Count then
  878. begin
  879. i:=OrigList.Count;
  880. RestRef:=TPasScopeReference(RestList[i]);
  881. Fail(Path+'['+IntToStr(i)+'] Too many in Rest: "'+RestRef.Element.Name+'"');
  882. end;
  883. finally
  884. OrigList.Free;
  885. RestList.Free;
  886. end;
  887. end;
  888. procedure TCustomTestPrecompile.CheckRestoredPropertyScope(const Path: string;
  889. Orig, Rest: TPasPropertyScope; Flags: TPCCheckFlags);
  890. begin
  891. CheckRestoredReference(Path+'.AncestorProp',Orig.AncestorProp,Rest.AncestorProp);
  892. CheckRestoredIdentifierScope(Path,Orig,Rest,Flags);
  893. end;
  894. procedure TCustomTestPrecompile.CheckRestoredGenericParamScope(
  895. const Path: string; Orig, Rest: TPasGenericParamsScope; Flags: TPCCheckFlags);
  896. begin
  897. // Orig.GenericType only needed during parsing
  898. if Path='' then ;
  899. if Orig<>nil then ;
  900. if Rest<>nil then ;
  901. if Flags=[] then ;
  902. end;
  903. procedure TCustomTestPrecompile.CheckRestoredSpecializeTypeData(
  904. const Path: string; Orig, Rest: TPasSpecializeTypeData; Flags: TPCCheckFlags);
  905. begin
  906. if Flags<>[] then ;
  907. CheckRestoredReference(Path+'.SpecializedType',Orig.SpecializedType,Rest.SpecializedType);
  908. end;
  909. procedure TCustomTestPrecompile.CheckRestoredResolvedReference(
  910. const Path: string; Orig, Rest: TResolvedReference; Flags: TPCCheckFlags);
  911. var
  912. C: TClass;
  913. begin
  914. if Orig.Flags<>Rest.Flags then
  915. Fail(Path+'.Flags');
  916. if Orig.Access<>Rest.Access then
  917. AssertEquals(Path+'.Access',PCUResolvedRefAccessNames[Orig.Access],PCUResolvedRefAccessNames[Rest.Access]);
  918. if not CheckRestoredObject(Path+'.Context',Orig.Context,Rest.Context) then exit;
  919. if Orig.Context<>nil then
  920. begin
  921. C:=Orig.Context.ClassType;
  922. if C=TResolvedRefCtxConstructor then
  923. CheckRestoredReference(Path+'.Context[TResolvedRefCtxConstructor].Typ',
  924. TResolvedRefCtxConstructor(Orig.Context).Typ,
  925. TResolvedRefCtxConstructor(Rest.Context).Typ);
  926. end;
  927. CheckRestoredScopeReference(Path+'.WithExprScope',Orig.WithExprScope,Rest.WithExprScope,Flags);
  928. CheckRestoredReference(Path+'.Declaration',Orig.Declaration,Rest.Declaration);
  929. CheckRestoredResolveData(Path,Orig,Rest,Flags);
  930. end;
  931. procedure TCustomTestPrecompile.CheckRestoredEvalValue(const Path: string;
  932. Orig, Rest: TResEvalValue);
  933. var
  934. i: Integer;
  935. begin
  936. if not CheckRestoredObject(Path,Orig,Rest) then exit;
  937. if Orig.Kind<>Rest.Kind then
  938. Fail(Path+'.Kind');
  939. if not CheckRestoredObject(Path+'.Element',Orig.Element,Rest.Element) then exit;
  940. CheckRestoredReference(Path+'.IdentEl',Orig.IdentEl,Rest.IdentEl);
  941. case Orig.Kind of
  942. revkNone: Fail(Path+'.Kind=revkNone');
  943. revkCustom: Fail(Path+'.Kind=revkNone');
  944. revkNil: ;
  945. revkBool: AssertEquals(Path+'.B',TResEvalBool(Orig).B,TResEvalBool(Rest).B);
  946. revkInt: AssertEquals(Path+'.Int',TResEvalInt(Orig).Int,TResEvalInt(Rest).Int);
  947. revkUInt:
  948. if TResEvalUInt(Orig).UInt<>TResEvalUInt(Rest).UInt then
  949. Fail(Path+'.UInt');
  950. revkFloat: AssertEquals(Path+'.FloatValue',TResEvalFloat(Orig).FloatValue,TResEvalFloat(Rest).FloatValue);
  951. revkString: AssertEquals(Path+'.S,Raw',TResEvalString(Orig).S,TResEvalString(Rest).S);
  952. revkUnicodeString: AssertEquals(Path+'.S,UTF16',String(TResEvalUTF16(Orig).S),String(TResEvalUTF16(Rest).S));
  953. revkEnum:
  954. begin
  955. AssertEquals(Path+'.Index',TResEvalEnum(Orig).Index,TResEvalEnum(Rest).Index);
  956. CheckRestoredReference(Path+'.ElType',TResEvalEnum(Orig).ElType,TResEvalEnum(Rest).ElType);
  957. end;
  958. revkRangeInt:
  959. begin
  960. if TResEvalRangeInt(Orig).ElKind<>TResEvalRangeInt(Rest).ElKind then
  961. Fail(Path+'.Int/ElKind');
  962. CheckRestoredReference(Path+'.Int/ElType',TResEvalRangeInt(Orig).ElType,TResEvalRangeInt(Rest).ElType);
  963. AssertEquals(Path+'.Int/RangeStart',TResEvalRangeInt(Orig).RangeStart,TResEvalRangeInt(Rest).RangeStart);
  964. AssertEquals(Path+'.Int/RangeEnd',TResEvalRangeInt(Orig).RangeEnd,TResEvalRangeInt(Rest).RangeEnd);
  965. end;
  966. revkRangeUInt:
  967. begin
  968. if TResEvalRangeUInt(Orig).RangeStart<>TResEvalRangeUInt(Rest).RangeStart then
  969. Fail(Path+'.UInt/RangeStart');
  970. if TResEvalRangeUInt(Orig).RangeEnd<>TResEvalRangeUInt(Rest).RangeEnd then
  971. Fail(Path+'.UInt/RangeEnd');
  972. end;
  973. revkSetOfInt:
  974. begin
  975. if TResEvalSet(Orig).ElKind<>TResEvalSet(Rest).ElKind then
  976. Fail(Path+'.SetInt/ElKind');
  977. CheckRestoredReference(Path+'.SetInt/ElType',TResEvalSet(Orig).ElType,TResEvalSet(Rest).ElType);
  978. AssertEquals(Path+'.SetInt/RangeStart',TResEvalSet(Orig).RangeStart,TResEvalSet(Rest).RangeStart);
  979. AssertEquals(Path+'.SetInt/RangeEnd',TResEvalSet(Orig).RangeEnd,TResEvalSet(Rest).RangeEnd);
  980. AssertEquals(Path+'.SetInt/length(Items)',length(TResEvalSet(Orig).Ranges),length(TResEvalSet(Rest).Ranges));
  981. for i:=0 to length(TResEvalSet(Orig).Ranges)-1 do
  982. begin
  983. AssertEquals(Path+'.SetInt/Items['+IntToStr(i)+'].RangeStart',
  984. TResEvalSet(Orig).Ranges[i].RangeStart,TResEvalSet(Rest).Ranges[i].RangeStart);
  985. AssertEquals(Path+'.SetInt/Items['+IntToStr(i)+'].RangeEnd',
  986. TResEvalSet(Orig).Ranges[i].RangeEnd,TResEvalSet(Rest).Ranges[i].RangeEnd);
  987. end;
  988. end;
  989. end;
  990. end;
  991. procedure TCustomTestPrecompile.CheckRestoredCustomData(const Path: string;
  992. RestoredEl: TPasElement; Orig, Rest: TObject; Flags: TPCCheckFlags);
  993. var
  994. C: TClass;
  995. begin
  996. if PCCGeneric in Flags then
  997. begin
  998. if (Rest=nil) and (Orig<>nil) then
  999. begin
  1000. C:=Orig.ClassType;
  1001. if (C=TResolvedReference)
  1002. or (C=TPasWithScope)
  1003. or (C=TPas2JSWithExprScope)
  1004. or (C=TPasForLoopScope)
  1005. or (C=TPasExceptOnScope)
  1006. or C.InheritsFrom(TResEvalValue) then
  1007. exit
  1008. else
  1009. Fail(Path+': Generic Orig='+GetObjName(Orig)+' Rest=nil');
  1010. end;
  1011. end;
  1012. if not CheckRestoredObject(Path,Orig,Rest) then exit;
  1013. C:=Orig.ClassType;
  1014. if C=TResolvedReference then
  1015. CheckRestoredResolvedReference(Path+'[TResolvedReference]',TResolvedReference(Orig),TResolvedReference(Rest),Flags)
  1016. else if C=TPas2JSModuleScope then
  1017. CheckRestoredModuleScope(Path+'[TPas2JSModuleScope]',TPas2JSModuleScope(Orig),TPas2JSModuleScope(Rest),Flags)
  1018. else if C=TPas2JSSectionScope then
  1019. CheckRestoredSectionScope(Path+'[TPas2JSSectionScope]',TPas2JSSectionScope(Orig),TPas2JSSectionScope(Rest),Flags)
  1020. else if C=TPas2JSInitialFinalizationScope then
  1021. CheckRestoredInitialFinalizationScope(Path+'[TPas2JSInitialFinalizationScope]',TPas2JSInitialFinalizationScope(Orig),TPas2JSInitialFinalizationScope(Rest),Flags)
  1022. else if C=TPasEnumTypeScope then
  1023. CheckRestoredEnumTypeScope(Path+'[TPasEnumTypeScope]',TPasEnumTypeScope(Orig),TPasEnumTypeScope(Rest),Flags)
  1024. else if C=TPas2jsRecordScope then
  1025. CheckRestoredRecordScope(Path+'[TPas2jsRecordScope]',TPas2jsRecordScope(Orig),TPas2jsRecordScope(Rest),Flags)
  1026. else if C=TPas2JSClassScope then
  1027. CheckRestoredClassScope(Path+'[TPas2JSClassScope]',TPas2JSClassScope(Orig),TPas2JSClassScope(Rest),Flags)
  1028. else if C=TPas2JSProcedureScope then
  1029. CheckRestoredProcScope(Path+'[TPas2JSProcedureScope]',TPas2JSProcedureScope(Orig),TPas2JSProcedureScope(Rest),Flags)
  1030. else if C=TPasPropertyScope then
  1031. CheckRestoredPropertyScope(Path+'[TPasPropertyScope]',TPasPropertyScope(Orig),TPasPropertyScope(Rest),Flags)
  1032. else if C=TPasGenericParamsScope then
  1033. CheckRestoredGenericParamScope(Path+'[TPasGenericParamScope]',TPasGenericParamsScope(Orig),TPasGenericParamsScope(Rest),Flags)
  1034. else if C=TPasSpecializeTypeData then
  1035. CheckRestoredSpecializeTypeData(Path+'[TPasSpecializeTypeData]',TPasSpecializeTypeData(Orig),TPasSpecializeTypeData(Rest),Flags)
  1036. else if C.InheritsFrom(TResEvalValue) then
  1037. CheckRestoredEvalValue(Path+'['+Orig.ClassName+']',TResEvalValue(Orig),TResEvalValue(Rest))
  1038. else
  1039. Fail(Path+': unknown CustomData "'+GetObjName(Orig)+'" El='+GetObjName(RestoredEl));
  1040. end;
  1041. procedure TCustomTestPrecompile.CheckRestoredReference(const Path: string;
  1042. Orig, Rest: TPasElement);
  1043. begin
  1044. if not CheckRestoredObject(Path,Orig,Rest) then exit;
  1045. AssertEquals(Path+'.Name',Orig.Name,Rest.Name);
  1046. if Orig is TPasUnresolvedSymbolRef then
  1047. exit; // compiler types and procs are the same in every unit -> skip checking unit
  1048. CheckRestoredReference(Path+'.Parent',Orig.Parent,Rest.Parent);
  1049. end;
  1050. procedure TCustomTestPrecompile.CheckRestoredElOrRef(const Path: string; Orig,
  1051. OrigProp, Rest, RestProp: TPasElement; Flags: TPCCheckFlags);
  1052. begin
  1053. if not CheckRestoredObject(Path,OrigProp,RestProp) then exit;
  1054. if Orig<>OrigProp.Parent then
  1055. begin
  1056. if Rest=RestProp.Parent then
  1057. Fail(Path+' Orig "'+GetObjName(OrigProp)+'" is reference Orig.Parent='+GetObjName(Orig)+', Rest "'+GetObjName(RestProp)+'" is insitu');
  1058. CheckRestoredReference(Path,OrigProp,RestProp);
  1059. end
  1060. else
  1061. CheckRestoredElement(Path,OrigProp,RestProp,Flags);
  1062. end;
  1063. procedure TCustomTestPrecompile.CheckRestoredAnalyzerElement(
  1064. const Path: string; Orig, Rest: TPasElement);
  1065. var
  1066. OrigUsed, RestUsed: TPAElement;
  1067. begin
  1068. //writeln('TCustomTestPrecompile.CheckRestoredAnalyzerElement ',GetObjName(RestAnalyzer));
  1069. if RestAnalyzer=nil then exit;
  1070. if Orig.ClassType=TPasArgument then exit;
  1071. OrigUsed:=Analyzer.FindUsedElement(Orig);
  1072. //writeln('TCustomTestPrecompile.CheckRestoredAnalyzerElement ',GetObjName(Orig),'=',OrigUsed<>nil,' ',GetObjName(Rest),'=',RestAnalyzer.FindUsedElement(Rest)<>nil);
  1073. if OrigUsed<>nil then
  1074. begin
  1075. RestUsed:=RestAnalyzer.FindUsedElement(Rest);
  1076. if RestUsed=nil then
  1077. Fail(Path+': used in OrigAnalyzer, but not used in RestAnalyzer');
  1078. if OrigUsed.Access<>RestUsed.Access then
  1079. AssertEquals(Path+'->Analyzer.Access',dbgs(OrigUsed.Access),dbgs(RestUsed.Access));
  1080. end
  1081. else if RestAnalyzer.IsUsed(Rest) then
  1082. begin
  1083. Fail(Path+': not used in OrigAnalyzer, but used in RestAnalyzer');
  1084. end;
  1085. end;
  1086. procedure TCustomTestPrecompile.CheckRestoredElement(const Path: string; Orig,
  1087. Rest: TPasElement; Flags: TPCCheckFlags);
  1088. var
  1089. C: TClass;
  1090. AModule: TPasModule;
  1091. begin
  1092. //writeln('TCustomTestPrecompile.CheckRestoredElement START Orig=',GetObjName(Orig),' Rest=',GetObjName(Rest));
  1093. if not CheckRestoredObject(Path,Orig,Rest) then exit;
  1094. //writeln('TCustomTestPrecompile.CheckRestoredElement CheckRestoredObject Orig=',GetObjName(Orig),' Rest=',GetObjName(Rest));
  1095. AModule:=Orig.GetModule;
  1096. if AModule<>Module then
  1097. begin
  1098. if (Orig is TPasUnresolvedSymbolRef) then
  1099. begin
  1100. // built-in identifier
  1101. if not SameText(Orig.Name,Rest.Name) then
  1102. AssertEquals(Path+'.Name',Orig.Name,Rest.Name);
  1103. if not CheckRestoredObject(Path+'.CustomData',Orig.CustomData,Rest.CustomData) then exit;
  1104. exit;
  1105. end;
  1106. Fail(Path+' wrong module: Orig='+GetObjName(AModule)+' '+GetObjName(Module));
  1107. end;
  1108. AssertEquals(Path+'.Name',Orig.Name,Rest.Name);
  1109. AssertEquals(Path+'.SourceFilename',Orig.SourceFilename,Rest.SourceFilename);
  1110. AssertEquals(Path+'.SourceLinenumber',Orig.SourceLinenumber,Rest.SourceLinenumber);
  1111. //AssertEquals(Path+'.SourceEndLinenumber',Orig.SourceEndLinenumber,Rest.SourceEndLinenumber);
  1112. if Orig.Visibility<>Rest.Visibility then
  1113. Fail(Path+'.Visibility '+PCUMemberVisibilityNames[Orig.Visibility]+' '+PCUMemberVisibilityNames[Rest.Visibility]);
  1114. if Orig.Hints<>Rest.Hints then
  1115. Fail(Path+'.Hints');
  1116. AssertEquals(Path+'.HintMessage',Orig.HintMessage,Rest.HintMessage);
  1117. //writeln('TCustomTestPrecompile.CheckRestoredElement Checking Parent... Orig=',GetObjName(Orig),' Rest=',GetObjName(Rest));
  1118. CheckRestoredReference(Path+'.Parent',Orig.Parent,Rest.Parent);
  1119. C:=Orig.ClassType;
  1120. //writeln('TCustomTestPrecompile.CheckRestoredElement Checking CustomData... Orig=',GetObjName(Orig),' Rest=',GetObjName(Rest));
  1121. if C=TPasGenericTemplateType then
  1122. begin
  1123. // TPasGenericParamsScope is only needed during parsing
  1124. if Orig.CustomData=nil then
  1125. else if not (Orig.CustomData is TPasGenericParamsScope) then
  1126. Fail(Path+'Orig.CustomData='+GetObjName(Orig.CustomData))
  1127. else if Rest.CustomData<>nil then
  1128. CheckRestoredCustomData(Path+'.CustomData',Rest,Orig.CustomData,Rest.CustomData,Flags);
  1129. end
  1130. else
  1131. CheckRestoredCustomData(Path+'.CustomData',Rest,Orig.CustomData,Rest.CustomData,Flags);
  1132. if C=TUnaryExpr then
  1133. CheckRestoredUnaryExpr(Path,TUnaryExpr(Orig),TUnaryExpr(Rest),Flags)
  1134. else if C=TBinaryExpr then
  1135. CheckRestoredBinaryExpr(Path,TBinaryExpr(Orig),TBinaryExpr(Rest),Flags)
  1136. else if C=TPrimitiveExpr then
  1137. CheckRestoredPrimitiveExpr(Path,TPrimitiveExpr(Orig),TPrimitiveExpr(Rest),Flags)
  1138. else if C=TBoolConstExpr then
  1139. CheckRestoredBoolConstExpr(Path,TBoolConstExpr(Orig),TBoolConstExpr(Rest),Flags)
  1140. else if (C=TNilExpr)
  1141. or (C=TInheritedExpr)
  1142. or (C=TSelfExpr) then
  1143. CheckRestoredPasExpr(Path,TPasExpr(Orig),TPasExpr(Rest),Flags)
  1144. else if C=TParamsExpr then
  1145. CheckRestoredParamsExpr(Path,TParamsExpr(Orig),TParamsExpr(Rest),Flags)
  1146. else if C=TProcedureExpr then
  1147. CheckRestoredProcedureExpr(Path,TProcedureExpr(Orig),TProcedureExpr(Rest),Flags)
  1148. else if C=TRecordValues then
  1149. CheckRestoredRecordValues(Path,TRecordValues(Orig),TRecordValues(Rest),Flags)
  1150. else if C=TArrayValues then
  1151. CheckRestoredArrayValues(Path,TArrayValues(Orig),TArrayValues(Rest),Flags)
  1152. // TPasDeclarations is a base class
  1153. // TPasUsesUnit is checked in usesclause
  1154. // TPasSection is a base class
  1155. else if C=TPasResString then
  1156. CheckRestoredResString(Path,TPasResString(Orig),TPasResString(Rest),Flags)
  1157. // TPasType is a base clas
  1158. else if (C=TPasAliasType)
  1159. or (C=TPasTypeAliasType)
  1160. or (C=TPasClassOfType) then
  1161. CheckRestoredAliasType(Path,TPasAliasType(Orig),TPasAliasType(Rest),Flags)
  1162. else if C=TPasPointerType then
  1163. CheckRestoredPointerType(Path,TPasPointerType(Orig),TPasPointerType(Rest),Flags)
  1164. else if C=TPasSpecializeType then
  1165. CheckRestoredSpecializedType(Path,TPasSpecializeType(Orig),TPasSpecializeType(Rest),Flags)
  1166. else if C=TInlineSpecializeExpr then
  1167. CheckRestoredInlineSpecializedExpr(Path,TInlineSpecializeExpr(Orig),TInlineSpecializeExpr(Rest),Flags)
  1168. else if C=TPasGenericTemplateType then
  1169. CheckRestoredGenericTemplateType(Path,TPasGenericTemplateType(Orig),TPasGenericTemplateType(Rest),Flags)
  1170. else if C=TPasRangeType then
  1171. CheckRestoredRangeType(Path,TPasRangeType(Orig),TPasRangeType(Rest),Flags)
  1172. else if C=TPasArrayType then
  1173. CheckRestoredArrayType(Path,TPasArrayType(Orig),TPasArrayType(Rest),Flags)
  1174. else if C=TPasFileType then
  1175. CheckRestoredFileType(Path,TPasFileType(Orig),TPasFileType(Rest),Flags)
  1176. else if C=TPasEnumValue then
  1177. CheckRestoredEnumValue(Path,TPasEnumValue(Orig),TPasEnumValue(Rest),Flags)
  1178. else if C=TPasEnumType then
  1179. CheckRestoredEnumType(Path,TPasEnumType(Orig),TPasEnumType(Rest),Flags)
  1180. else if C=TPasSetType then
  1181. CheckRestoredSetType(Path,TPasSetType(Orig),TPasSetType(Rest),Flags)
  1182. else if C=TPasVariant then
  1183. CheckRestoredVariant(Path,TPasVariant(Orig),TPasVariant(Rest),Flags)
  1184. else if C=TPasRecordType then
  1185. CheckRestoredRecordType(Path,TPasRecordType(Orig),TPasRecordType(Rest),Flags)
  1186. else if C=TPasClassType then
  1187. CheckRestoredClassType(Path,TPasClassType(Orig),TPasClassType(Rest),Flags)
  1188. else if C=TPasArgument then
  1189. CheckRestoredArgument(Path,TPasArgument(Orig),TPasArgument(Rest),Flags)
  1190. else if C=TPasProcedureType then
  1191. CheckRestoredProcedureType(Path,TPasProcedureType(Orig),TPasProcedureType(Rest),Flags)
  1192. else if C=TPasResultElement then
  1193. CheckRestoredResultElement(Path,TPasResultElement(Orig),TPasResultElement(Rest),Flags)
  1194. else if C=TPasFunctionType then
  1195. CheckRestoredFunctionType(Path,TPasFunctionType(Orig),TPasFunctionType(Rest),Flags)
  1196. else if C=TPasStringType then
  1197. CheckRestoredStringType(Path,TPasStringType(Orig),TPasStringType(Rest),Flags)
  1198. else if C=TPasVariable then
  1199. CheckRestoredVariable(Path,TPasVariable(Orig),TPasVariable(Rest),Flags)
  1200. else if C=TPasExportSymbol then
  1201. CheckRestoredExportSymbol(Path,TPasExportSymbol(Orig),TPasExportSymbol(Rest),Flags)
  1202. else if C=TPasConst then
  1203. CheckRestoredConst(Path,TPasConst(Orig),TPasConst(Rest),Flags)
  1204. else if C=TPasProperty then
  1205. CheckRestoredProperty(Path,TPasProperty(Orig),TPasProperty(Rest),Flags)
  1206. else if C=TPasMethodResolution then
  1207. CheckRestoredMethodResolution(Path,TPasMethodResolution(Orig),TPasMethodResolution(Rest),Flags)
  1208. else if (C=TPasProcedure)
  1209. or (C=TPasFunction)
  1210. or (C=TPasConstructor)
  1211. or (C=TPasClassConstructor)
  1212. or (C=TPasDestructor)
  1213. or (C=TPasClassDestructor)
  1214. or (C=TPasClassProcedure)
  1215. or (C=TPasClassFunction)
  1216. then
  1217. CheckRestoredProcedure(Path,TPasProcedure(Orig),TPasProcedure(Rest),Flags)
  1218. else if (C=TPasOperator)
  1219. or (C=TPasClassOperator) then
  1220. CheckRestoredOperator(Path,TPasOperator(Orig),TPasOperator(Rest),Flags)
  1221. else if (C=TPasImplCommand) then
  1222. CheckRestoredImplCommand(Path,TPasImplCommand(Orig),TPasImplCommand(Rest),Flags)
  1223. else if (C=TPasImplBeginBlock) then
  1224. CheckRestoredImplBeginBlock(Path,TPasImplBeginBlock(Orig),TPasImplBeginBlock(Rest),Flags)
  1225. else if (C=TPasImplAsmStatement) then
  1226. CheckRestoredImplAsmStatement(Path,TPasImplAsmStatement(Orig),TPasImplAsmStatement(Rest),Flags)
  1227. else if (C=TPasImplRepeatUntil) then
  1228. CheckRestoredImplRepeatUntil(Path,TPasImplRepeatUntil(Orig),TPasImplRepeatUntil(Rest),Flags)
  1229. else if (C=TPasImplIfElse) then
  1230. CheckRestoredImplIfElse(Path,TPasImplIfElse(Orig),TPasImplIfElse(Rest),Flags)
  1231. else if (C=TPasImplWhileDo) then
  1232. CheckRestoredImplWhileDo(Path,TPasImplWhileDo(Orig),TPasImplWhileDo(Rest),Flags)
  1233. else if (C=TPasImplWithDo) then
  1234. CheckRestoredImplWithDo(Path,TPasImplWithDo(Orig),TPasImplWithDo(Rest),Flags)
  1235. else if (C=TPasImplCaseOf) then
  1236. CheckRestoredImplCaseOf(Path,TPasImplCaseOf(Orig),TPasImplCaseOf(Rest),Flags)
  1237. else if (C=TPasImplCaseStatement) then
  1238. CheckRestoredImplCaseStatement(Path,TPasImplCaseStatement(Orig),TPasImplCaseStatement(Rest),Flags)
  1239. else if (C=TPasImplCaseElse) then
  1240. CheckRestoredImplCaseElse(Path,TPasImplCaseElse(Orig),TPasImplCaseElse(Rest),Flags)
  1241. else if (C=TPasImplForLoop) then
  1242. CheckRestoredImplForLoop(Path,TPasImplForLoop(Orig),TPasImplForLoop(Rest),Flags)
  1243. else if (C=TPasImplAssign) then
  1244. CheckRestoredImplAssign(Path,TPasImplAssign(Orig),TPasImplAssign(Rest),Flags)
  1245. else if (C=TPasImplSimple) then
  1246. CheckRestoredImplSimple(Path,TPasImplSimple(Orig),TPasImplSimple(Rest),Flags)
  1247. else if (C=TPasImplTry) then
  1248. CheckRestoredImplTry(Path,TPasImplTry(Orig),TPasImplTry(Rest),Flags)
  1249. else if (C=TPasImplTryFinally)
  1250. or (C=TPasImplTryExcept)
  1251. or (C=TPasImplTryExceptElse) then
  1252. CheckRestoredImplTryHandler(Path,TPasImplTryHandler(Orig),TPasImplTryHandler(Rest),Flags)
  1253. else if (C=TPasImplExceptOn) then
  1254. CheckRestoredImplExceptOn(Path,TPasImplExceptOn(Orig),TPasImplExceptOn(Rest),Flags)
  1255. else if (C=TPasImplRaise) then
  1256. CheckRestoredImplRaise(Path,TPasImplRaise(Orig),TPasImplRaise(Rest),Flags)
  1257. else if (C=TPasModule)
  1258. or (C=TPasProgram)
  1259. or (C=TPasLibrary) then
  1260. CheckRestoredModule(Path,TPasModule(Orig),TPasModule(Rest),Flags)
  1261. else if C.InheritsFrom(TPasSection) then
  1262. CheckRestoredSection(Path,TPasSection(Orig),TPasSection(Rest),Flags)
  1263. else if C=TPasAttributes then
  1264. CheckRestoredAttributes(Path,TPasAttributes(Orig),TPasAttributes(Rest),Flags)
  1265. else
  1266. Fail(Path+': unknown class '+C.ClassName);
  1267. CheckRestoredAnalyzerElement(Path,Orig,Rest);
  1268. end;
  1269. procedure TCustomTestPrecompile.CheckRestoredElementList(const Path: string;
  1270. Orig, Rest: TFPList; Flags: TPCCheckFlags);
  1271. var
  1272. OrigItem, RestItem: TObject;
  1273. i: Integer;
  1274. SubPath: String;
  1275. begin
  1276. if not CheckRestoredObject(Path,Orig,Rest) then exit;
  1277. AssertEquals(Path+'.Count',Orig.Count,Rest.Count);
  1278. for i:=0 to Orig.Count-1 do
  1279. begin
  1280. SubPath:=Path+'['+IntToStr(i)+']';
  1281. OrigItem:=TObject(Orig[i]);
  1282. if not (OrigItem is TPasElement) then
  1283. Fail(SubPath+' Orig='+GetObjName(OrigItem));
  1284. RestItem:=TObject(Rest[i]);
  1285. if not (RestItem is TPasElement) then
  1286. Fail(SubPath+' Rest='+GetObjName(RestItem));
  1287. //writeln('TCustomTestPrecompile.CheckRestoredElementList ',GetObjName(OrigItem),' ',GetObjName(RestItem));
  1288. SubPath:=Path+'['+IntToStr(i)+']"'+TPasElement(OrigItem).Name+'"';
  1289. CheckRestoredElement(SubPath,TPasElement(OrigItem),TPasElement(RestItem),Flags);
  1290. end;
  1291. end;
  1292. procedure TCustomTestPrecompile.CheckRestoredElementArray(const Path: string;
  1293. Orig, Rest: TPasElementArray; Flags: TPCCheckFlags);
  1294. var
  1295. OrigItem, RestItem: TPasElement;
  1296. i: Integer;
  1297. SubPath: String;
  1298. begin
  1299. AssertEquals(Path+'.length',length(Orig),length(Rest));
  1300. for i:=0 to length(Orig)-1 do
  1301. begin
  1302. SubPath:=Path+'['+IntToStr(i)+']';
  1303. OrigItem:=Orig[i];
  1304. if not (OrigItem is TPasElement) then
  1305. Fail(SubPath+' Orig='+GetObjName(OrigItem));
  1306. RestItem:=Rest[i];
  1307. if not (RestItem is TPasElement) then
  1308. Fail(SubPath+' Rest='+GetObjName(RestItem));
  1309. //writeln('TCustomTestPrecompile.CheckRestoredElementList ',GetObjName(OrigItem),' ',GetObjName(RestItem));
  1310. SubPath:=Path+'['+IntToStr(i)+']"'+TPasElement(OrigItem).Name+'"';
  1311. CheckRestoredElement(SubPath,TPasElement(OrigItem),TPasElement(RestItem),Flags);
  1312. end;
  1313. end;
  1314. procedure TCustomTestPrecompile.CheckRestoredElRefList(const Path: string;
  1315. OrigParent: TPasElement; Orig: TFPList; RestParent: TPasElement;
  1316. Rest: TFPList; AllowInSitu: boolean; Flags: TPCCheckFlags);
  1317. var
  1318. OrigItem, RestItem: TObject;
  1319. i: Integer;
  1320. SubPath: String;
  1321. begin
  1322. if not CheckRestoredObject(Path,Orig,Rest) then exit;
  1323. AssertEquals(Path+'.Count',Orig.Count,Rest.Count);
  1324. for i:=0 to Orig.Count-1 do
  1325. begin
  1326. SubPath:=Path+'['+IntToStr(i)+']';
  1327. OrigItem:=TObject(Orig[i]);
  1328. if not (OrigItem is TPasElement) then
  1329. Fail(SubPath+' Orig='+GetObjName(OrigItem));
  1330. RestItem:=TObject(Rest[i]);
  1331. if not (RestItem is TPasElement) then
  1332. Fail(SubPath+' Rest='+GetObjName(RestItem));
  1333. if AllowInSitu then
  1334. CheckRestoredElOrRef(SubPath,OrigParent,TPasElement(OrigItem),RestParent,TPasElement(RestItem),Flags)
  1335. else
  1336. CheckRestoredReference(SubPath,TPasElement(OrigItem),TPasElement(RestItem));
  1337. end;
  1338. end;
  1339. procedure TCustomTestPrecompile.CheckRestoredPasExpr(const Path: string; Orig,
  1340. Rest: TPasExpr; Flags: TPCCheckFlags);
  1341. begin
  1342. if Orig.Kind<>Rest.Kind then
  1343. Fail(Path+'.Kind');
  1344. if Orig.OpCode<>Rest.OpCode then
  1345. Fail(Path+'.OpCode');
  1346. CheckRestoredElement(Path+'.Format1',Orig.format1,Rest.format1,Flags);
  1347. CheckRestoredElement(Path+'.Format2',Orig.format2,Rest.format2,Flags);
  1348. end;
  1349. procedure TCustomTestPrecompile.CheckRestoredUnaryExpr(const Path: string;
  1350. Orig, Rest: TUnaryExpr; Flags: TPCCheckFlags);
  1351. begin
  1352. CheckRestoredElement(Path+'.Operand',Orig.Operand,Rest.Operand,Flags);
  1353. CheckRestoredPasExpr(Path,Orig,Rest,Flags);
  1354. end;
  1355. procedure TCustomTestPrecompile.CheckRestoredBinaryExpr(const Path: string;
  1356. Orig, Rest: TBinaryExpr; Flags: TPCCheckFlags);
  1357. begin
  1358. CheckRestoredElement(Path+'.left',Orig.left,Rest.left,Flags);
  1359. CheckRestoredElement(Path+'.right',Orig.right,Rest.right,Flags);
  1360. CheckRestoredPasExpr(Path,Orig,Rest,Flags);
  1361. end;
  1362. procedure TCustomTestPrecompile.CheckRestoredPrimitiveExpr(const Path: string;
  1363. Orig, Rest: TPrimitiveExpr; Flags: TPCCheckFlags);
  1364. begin
  1365. AssertEquals(Path+'.Value',Orig.Value,Rest.Value);
  1366. CheckRestoredPasExpr(Path,Orig,Rest,Flags);
  1367. end;
  1368. procedure TCustomTestPrecompile.CheckRestoredBoolConstExpr(const Path: string;
  1369. Orig, Rest: TBoolConstExpr; Flags: TPCCheckFlags);
  1370. begin
  1371. AssertEquals(Path+'.Value',Orig.Value,Rest.Value);
  1372. CheckRestoredPasExpr(Path,Orig,Rest,Flags);
  1373. end;
  1374. procedure TCustomTestPrecompile.CheckRestoredParamsExpr(const Path: string;
  1375. Orig, Rest: TParamsExpr; Flags: TPCCheckFlags);
  1376. begin
  1377. CheckRestoredElement(Path+'.Value',Orig.Value,Rest.Value,Flags);
  1378. CheckRestoredPasExprArray(Path+'.Params',Orig.Params,Rest.Params,Flags);
  1379. CheckRestoredPasExpr(Path,Orig,Rest,Flags);
  1380. end;
  1381. procedure TCustomTestPrecompile.CheckRestoredProcedureExpr(const Path: string;
  1382. Orig, Rest: TProcedureExpr; Flags: TPCCheckFlags);
  1383. begin
  1384. CheckRestoredProcedure(Path+'$Ano',Orig.Proc,Rest.Proc,Flags);
  1385. CheckRestoredPasExpr(Path,Orig,Rest,Flags);
  1386. end;
  1387. procedure TCustomTestPrecompile.CheckRestoredRecordValues(const Path: string;
  1388. Orig, Rest: TRecordValues; Flags: TPCCheckFlags);
  1389. var
  1390. i: Integer;
  1391. begin
  1392. AssertEquals(Path+'.Fields.length',length(Orig.Fields),length(Rest.Fields));
  1393. for i:=0 to length(Orig.Fields)-1 do
  1394. begin
  1395. AssertEquals(Path+'.Field['+IntToStr(i)+'].Name',Orig.Fields[i].Name,Rest.Fields[i].Name);
  1396. CheckRestoredElement(Path+'.Field['+IntToStr(i)+'].ValueExp',Orig.Fields[i].ValueExp,Rest.Fields[i].ValueExp,Flags);
  1397. end;
  1398. CheckRestoredPasExpr(Path,Orig,Rest,Flags);
  1399. end;
  1400. procedure TCustomTestPrecompile.CheckRestoredPasExprArray(const Path: string;
  1401. Orig, Rest: TPasExprArray; Flags: TPCCheckFlags);
  1402. var
  1403. i: Integer;
  1404. begin
  1405. AssertEquals(Path+'.length',length(Orig),length(Rest));
  1406. for i:=0 to length(Orig)-1 do
  1407. CheckRestoredElement(Path+'['+IntToStr(i)+']',Orig[i],Rest[i],Flags);
  1408. end;
  1409. procedure TCustomTestPrecompile.CheckRestoredArrayValues(const Path: string;
  1410. Orig, Rest: TArrayValues; Flags: TPCCheckFlags);
  1411. begin
  1412. CheckRestoredPasExprArray(Path+'.Values',Orig.Values,Rest.Values,Flags);
  1413. CheckRestoredPasExpr(Path,Orig,Rest,Flags);
  1414. end;
  1415. procedure TCustomTestPrecompile.CheckRestoredResString(const Path: string;
  1416. Orig, Rest: TPasResString; Flags: TPCCheckFlags);
  1417. begin
  1418. CheckRestoredElement(Path+'.Expr',Orig.Expr,Rest.Expr,Flags);
  1419. end;
  1420. procedure TCustomTestPrecompile.CheckRestoredAliasType(const Path: string;
  1421. Orig, Rest: TPasAliasType; Flags: TPCCheckFlags);
  1422. begin
  1423. CheckRestoredElOrRef(Path+'.DestType',Orig,Orig.DestType,Rest,Rest.DestType,Flags);
  1424. CheckRestoredElement(Path+'.Expr',Orig.Expr,Rest.Expr,Flags);
  1425. end;
  1426. procedure TCustomTestPrecompile.CheckRestoredPointerType(const Path: string;
  1427. Orig, Rest: TPasPointerType; Flags: TPCCheckFlags);
  1428. begin
  1429. CheckRestoredElOrRef(Path+'.DestType',Orig,Orig.DestType,Rest,Rest.DestType,Flags);
  1430. end;
  1431. procedure TCustomTestPrecompile.CheckRestoredSpecializedType(
  1432. const Path: string; Orig, Rest: TPasSpecializeType; Flags: TPCCheckFlags);
  1433. begin
  1434. CheckRestoredElementList(Path+'.Params',Orig.Params,Rest.Params,Flags);
  1435. CheckRestoredElOrRef(Path+'.DestType',Orig,Orig.DestType,Rest,Rest.DestType,Flags);
  1436. end;
  1437. procedure TCustomTestPrecompile.CheckRestoredInlineSpecializedExpr(
  1438. const Path: string; Orig, Rest: TInlineSpecializeExpr; Flags: TPCCheckFlags);
  1439. begin
  1440. CheckRestoredElement(Path+'.Name',Orig.NameExpr,Rest.NameExpr,Flags);
  1441. CheckRestoredElementList(Path+'.Params',Orig.Params,Rest.Params,Flags);
  1442. end;
  1443. procedure TCustomTestPrecompile.CheckRestoredGenericTemplateType(
  1444. const Path: string; Orig, Rest: TPasGenericTemplateType; Flags: TPCCheckFlags
  1445. );
  1446. begin
  1447. CheckRestoredElementArray(Path+'.Constraints',Orig.Constraints,Rest.Constraints,Flags);
  1448. end;
  1449. procedure TCustomTestPrecompile.CheckRestoredRangeType(const Path: string;
  1450. Orig, Rest: TPasRangeType; Flags: TPCCheckFlags);
  1451. begin
  1452. CheckRestoredElement(Path+'.RangeExpr',Orig.RangeExpr,Rest.RangeExpr,Flags);
  1453. end;
  1454. procedure TCustomTestPrecompile.CheckRestoredArrayType(const Path: string;
  1455. Orig, Rest: TPasArrayType; Flags: TPCCheckFlags);
  1456. begin
  1457. CheckRestoredPasExprArray(Path+'.Ranges',Orig.Ranges,Rest.Ranges,Flags);
  1458. CheckRestoredElementList(Path+'.GenericTemplateTypes',Orig.GenericTemplateTypes,Rest.GenericTemplateTypes,Flags);
  1459. if Orig.PackMode<>Rest.PackMode then
  1460. Fail(Path+'.PackMode Orig='+PCUPackModeNames[Orig.PackMode]+' Rest='+PCUPackModeNames[Rest.PackMode]);
  1461. CheckRestoredElOrRef(Path+'.ElType',Orig,Orig.ElType,Rest,Rest.ElType,Flags);
  1462. end;
  1463. procedure TCustomTestPrecompile.CheckRestoredFileType(const Path: string; Orig,
  1464. Rest: TPasFileType; Flags: TPCCheckFlags);
  1465. begin
  1466. CheckRestoredElOrRef(Path+'.ElType',Orig,Orig.ElType,Rest,Rest.ElType,Flags);
  1467. end;
  1468. procedure TCustomTestPrecompile.CheckRestoredEnumValue(const Path: string;
  1469. Orig, Rest: TPasEnumValue; Flags: TPCCheckFlags);
  1470. begin
  1471. CheckRestoredElement(Path+'.Value',Orig.Value,Rest.Value,Flags);
  1472. end;
  1473. procedure TCustomTestPrecompile.CheckRestoredEnumType(const Path: string; Orig,
  1474. Rest: TPasEnumType; Flags: TPCCheckFlags);
  1475. begin
  1476. CheckRestoredElementList(Path+'.Values',Orig.Values,Rest.Values,Flags);
  1477. end;
  1478. procedure TCustomTestPrecompile.CheckRestoredSetType(const Path: string; Orig,
  1479. Rest: TPasSetType; Flags: TPCCheckFlags);
  1480. begin
  1481. CheckRestoredElOrRef(Path+'.EnumType',Orig,Orig.EnumType,Rest,Rest.EnumType,Flags);
  1482. AssertEquals(Path+'.IsPacked',Orig.IsPacked,Rest.IsPacked);
  1483. end;
  1484. procedure TCustomTestPrecompile.CheckRestoredVariant(const Path: string; Orig,
  1485. Rest: TPasVariant; Flags: TPCCheckFlags);
  1486. begin
  1487. CheckRestoredElementList(Path+'.Values',Orig.Values,Rest.Values,Flags);
  1488. CheckRestoredElement(Path+'.Members',Orig.Members,Rest.Members,Flags);
  1489. end;
  1490. procedure TCustomTestPrecompile.CheckRestoredRecordType(const Path: string;
  1491. Orig, Rest: TPasRecordType; Flags: TPCCheckFlags);
  1492. begin
  1493. CheckRestoredElementList(Path+'.GenericTemplateTypes',Orig.GenericTemplateTypes,Rest.GenericTemplateTypes,Flags);
  1494. if Orig.PackMode<>Rest.PackMode then
  1495. Fail(Path+'.PackMode Orig='+PCUPackModeNames[Orig.PackMode]+' Rest='+PCUPackModeNames[Rest.PackMode]);
  1496. CheckRestoredElementList(Path+'.Members',Orig.Members,Rest.Members,Flags);
  1497. CheckRestoredElOrRef(Path+'.VariantEl',Orig,Orig.VariantEl,Rest,Rest.VariantEl,Flags);
  1498. CheckRestoredElementList(Path+'.Variants',Orig.Variants,Rest.Variants,Flags);
  1499. CheckRestoredElementList(Path+'.GenericTemplateTypes',Orig.GenericTemplateTypes,Rest.GenericTemplateTypes,Flags);
  1500. end;
  1501. procedure TCustomTestPrecompile.CheckRestoredClassType(const Path: string;
  1502. Orig, Rest: TPasClassType; Flags: TPCCheckFlags);
  1503. begin
  1504. CheckRestoredElementList(Path+'.GenericTemplateTypes',Orig.GenericTemplateTypes,Rest.GenericTemplateTypes,Flags);
  1505. if Orig.PackMode<>Rest.PackMode then
  1506. Fail(Path+'.PackMode Orig='+PCUPackModeNames[Orig.PackMode]+' Rest='+PCUPackModeNames[Rest.PackMode]);
  1507. if Orig.ObjKind<>Rest.ObjKind then
  1508. Fail(Path+'.ObjKind Orig='+PCUObjKindNames[Orig.ObjKind]+' Rest='+PCUObjKindNames[Rest.ObjKind]);
  1509. if Orig.InterfaceType<>Rest.InterfaceType then
  1510. Fail(Path+'.ObjKind Orig='+PCUClassInterfaceTypeNames[Orig.InterfaceType]+' Rest='+PCUClassInterfaceTypeNames[Rest.InterfaceType]);
  1511. CheckRestoredReference(Path+'.AncestorType',Orig.AncestorType,Rest.AncestorType);
  1512. CheckRestoredReference(Path+'.HelperForType',Orig.HelperForType,Rest.HelperForType);
  1513. AssertEquals(Path+'.IsForward',Orig.IsForward,Rest.IsForward);
  1514. AssertEquals(Path+'.IsExternal',Orig.IsExternal,Rest.IsExternal);
  1515. // irrelevant: IsShortDefinition
  1516. CheckRestoredElement(Path+'.GUIDExpr',Orig.GUIDExpr,Rest.GUIDExpr,Flags);
  1517. CheckRestoredElementList(Path+'.Members',Orig.Members,Rest.Members,Flags);
  1518. AssertEquals(Path+'.Modifiers',Orig.Modifiers.Text,Rest.Modifiers.Text);
  1519. CheckRestoredElRefList(Path+'.Interfaces',Orig,Orig.Interfaces,Rest,Rest.Interfaces,false,Flags);
  1520. CheckRestoredElementList(Path+'.GenericTemplateTypes',Orig.GenericTemplateTypes,Rest.GenericTemplateTypes,Flags);
  1521. AssertEquals(Path+'.ExternalNameSpace',Orig.ExternalNameSpace,Rest.ExternalNameSpace);
  1522. AssertEquals(Path+'.ExternalName',Orig.ExternalName,Rest.ExternalName);
  1523. end;
  1524. procedure TCustomTestPrecompile.CheckRestoredArgument(const Path: string; Orig,
  1525. Rest: TPasArgument; Flags: TPCCheckFlags);
  1526. begin
  1527. if Orig.Access<>Rest.Access then
  1528. Fail(Path+'.Access Orig='+PCUArgumentAccessNames[Orig.Access]+' Rest='+PCUArgumentAccessNames[Rest.Access]);
  1529. CheckRestoredElOrRef(Path+'.ArgType',Orig,Orig.ArgType,Rest,Rest.ArgType,Flags);
  1530. CheckRestoredElement(Path+'.ValueExpr',Orig.ValueExpr,Rest.ValueExpr,Flags);
  1531. end;
  1532. procedure TCustomTestPrecompile.CheckRestoredProcedureType(const Path: string;
  1533. Orig, Rest: TPasProcedureType; Flags: TPCCheckFlags);
  1534. begin
  1535. CheckRestoredElementList(Path+'.GenericTemplateTypes',Orig.GenericTemplateTypes,Rest.GenericTemplateTypes,Flags);
  1536. CheckRestoredElementList(Path+'.Args',Orig.Args,Rest.Args,Flags);
  1537. if Orig.CallingConvention<>Rest.CallingConvention then
  1538. Fail(Path+'.CallingConvention Orig='+PCUCallingConventionNames[Orig.CallingConvention]+' Rest='+PCUCallingConventionNames[Rest.CallingConvention]);
  1539. if Orig.Modifiers<>Rest.Modifiers then
  1540. Fail(Path+'.Modifiers');
  1541. end;
  1542. procedure TCustomTestPrecompile.CheckRestoredResultElement(const Path: string;
  1543. Orig, Rest: TPasResultElement; Flags: TPCCheckFlags);
  1544. begin
  1545. CheckRestoredElOrRef(Path+'.ResultType',Orig,Orig.ResultType,Rest,Rest.ResultType,Flags);
  1546. end;
  1547. procedure TCustomTestPrecompile.CheckRestoredFunctionType(const Path: string;
  1548. Orig, Rest: TPasFunctionType; Flags: TPCCheckFlags);
  1549. begin
  1550. CheckRestoredElement(Path+'.ResultEl',Orig.ResultEl,Rest.ResultEl,Flags);
  1551. CheckRestoredProcedureType(Path,Orig,Rest,Flags);
  1552. end;
  1553. procedure TCustomTestPrecompile.CheckRestoredStringType(const Path: string;
  1554. Orig, Rest: TPasStringType; Flags: TPCCheckFlags);
  1555. begin
  1556. AssertEquals(Path+'.LengthExpr',Orig.LengthExpr,Rest.LengthExpr);
  1557. if Flags=[] then ;
  1558. end;
  1559. procedure TCustomTestPrecompile.CheckRestoredVariable(const Path: string; Orig,
  1560. Rest: TPasVariable; Flags: TPCCheckFlags);
  1561. begin
  1562. CheckRestoredElOrRef(Path+'.VarType',Orig,Orig.VarType,Rest,Rest.VarType,Flags);
  1563. if Orig.VarModifiers<>Rest.VarModifiers then
  1564. Fail(Path+'.VarModifiers');
  1565. CheckRestoredElement(Path+'.LibraryName',Orig.LibraryName,Rest.LibraryName,Flags);
  1566. CheckRestoredElement(Path+'.ExportName',Orig.ExportName,Rest.ExportName,Flags);
  1567. CheckRestoredElement(Path+'.AbsoluteExpr',Orig.AbsoluteExpr,Rest.AbsoluteExpr,Flags);
  1568. CheckRestoredElement(Path+'.Expr',Orig.Expr,Rest.Expr,Flags);
  1569. end;
  1570. procedure TCustomTestPrecompile.CheckRestoredExportSymbol(const Path: string;
  1571. Orig, Rest: TPasExportSymbol; Flags: TPCCheckFlags);
  1572. begin
  1573. CheckRestoredElement(Path+'.ExportName',Orig.ExportName,Rest.ExportName,Flags);
  1574. CheckRestoredElement(Path+'.ExportIndex',Orig.ExportIndex,Rest.ExportIndex,Flags);
  1575. end;
  1576. procedure TCustomTestPrecompile.CheckRestoredConst(const Path: string; Orig,
  1577. Rest: TPasConst; Flags: TPCCheckFlags);
  1578. begin
  1579. AssertEquals(Path+'.IsConst',Orig.IsConst,Rest.IsConst);
  1580. CheckRestoredVariable(Path,Orig,Rest,Flags);
  1581. end;
  1582. procedure TCustomTestPrecompile.CheckRestoredProperty(const Path: string; Orig,
  1583. Rest: TPasProperty; Flags: TPCCheckFlags);
  1584. begin
  1585. CheckRestoredElement(Path+'.IndexExpr',Orig.IndexExpr,Rest.IndexExpr,Flags);
  1586. CheckRestoredElement(Path+'.ReadAccessor',Orig.ReadAccessor,Rest.ReadAccessor,Flags);
  1587. CheckRestoredElement(Path+'.WriteAccessor',Orig.WriteAccessor,Rest.WriteAccessor,Flags);
  1588. CheckRestoredElement(Path+'.DispIDExpr',Orig.DispIDExpr,Rest.DispIDExpr,Flags);
  1589. CheckRestoredPasExprArray(Path+'.Implements',Orig.Implements,Rest.Implements,Flags);
  1590. CheckRestoredElement(Path+'.StoredAccessor',Orig.StoredAccessor,Rest.StoredAccessor,Flags);
  1591. CheckRestoredElement(Path+'.DefaultExpr',Orig.DefaultExpr,Rest.DefaultExpr,Flags);
  1592. CheckRestoredElementList(Path+'.Args',Orig.Args,Rest.Args,Flags);
  1593. // not needed: ReadAccessorName, WriteAccessorName, ImplementsName, StoredAccessorName
  1594. AssertEquals(Path+'.DispIDReadOnly',Orig.DispIDReadOnly,Rest.DispIDReadOnly);
  1595. AssertEquals(Path+'.IsDefault',Orig.IsDefault,Rest.IsDefault);
  1596. AssertEquals(Path+'.IsNodefault',Orig.IsNodefault,Rest.IsNodefault);
  1597. CheckRestoredVariable(Path,Orig,Rest,Flags);
  1598. end;
  1599. procedure TCustomTestPrecompile.CheckRestoredMethodResolution(
  1600. const Path: string; Orig, Rest: TPasMethodResolution; Flags: TPCCheckFlags);
  1601. begin
  1602. AssertEquals(Path+'.ProcClass',Orig.ProcClass,Rest.ProcClass);
  1603. CheckRestoredElement(Path+'.InterfaceName',Orig.InterfaceName,Rest.InterfaceName,Flags);
  1604. CheckRestoredElement(Path+'.InterfaceProc',Orig.InterfaceProc,Rest.InterfaceProc,Flags);
  1605. CheckRestoredElement(Path+'.ImplementationProc',Orig.ImplementationProc,Rest.ImplementationProc,Flags);
  1606. end;
  1607. procedure TCustomTestPrecompile.CheckRestoredProcNameParts(const Path: string;
  1608. Orig, Rest: TPasProcedure; Flags: TPCCheckFlags);
  1609. var
  1610. OrigNameParts, RestNameParts: TProcedureNameParts;
  1611. i: Integer;
  1612. SubPath: String;
  1613. OrigTemplates, RestTemplates: TFPList;
  1614. begin
  1615. OrigNameParts:=Orig.NameParts;
  1616. RestNameParts:=Rest.NameParts;
  1617. AssertEquals(Path+'.NameParts<>nil',OrigNameParts<>nil,RestNameParts<>nil);
  1618. if OrigNameParts<>nil then
  1619. begin
  1620. AssertEquals(Path+'.NameParts.Count',OrigNameParts.Count,RestNameParts.Count);
  1621. for i:=0 to OrigNameParts.Count-1 do
  1622. begin
  1623. SubPath:=Path+'.NameParts['+IntToStr(i)+']';
  1624. AssertEquals(SubPath+'.Name',TProcedureNamePart(OrigNameParts[i]).Name,TProcedureNamePart(RestNameParts[i]).Name);
  1625. OrigTemplates:=TProcedureNamePart(OrigNameParts[i]).Templates;
  1626. RestTemplates:=TProcedureNamePart(RestNameParts[i]).Templates;
  1627. CheckRestoredObject(SubPath+'.Templates',OrigTemplates,RestTemplates);
  1628. if OrigTemplates=nil then continue;
  1629. CheckRestoredElementList(SubPath+'.Templates',OrigTemplates,RestTemplates,Flags);
  1630. end;
  1631. end;
  1632. end;
  1633. procedure TCustomTestPrecompile.CheckRestoredProcedure(const Path: string;
  1634. Orig, Rest: TPasProcedure; Flags: TPCCheckFlags);
  1635. var
  1636. RestScope, OrigScope: TPas2JSProcedureScope;
  1637. DeclProc: TPasProcedure;
  1638. begin
  1639. CheckRestoredObject(Path+'.CustomData',Orig.CustomData,Rest.CustomData);
  1640. OrigScope:=Orig.CustomData as TPas2JSProcedureScope;
  1641. RestScope:=Rest.CustomData as TPas2JSProcedureScope;
  1642. if OrigScope=nil then
  1643. exit; // msIgnoreInterfaces
  1644. CheckRestoredReference(Path+'.CustomData[TPas2JSProcedureScope].DeclarationProc',
  1645. OrigScope.DeclarationProc,RestScope.DeclarationProc);
  1646. AssertEquals(Path+'.CustomData[TPas2JSProcedureScope].ResultVarName',OrigScope.ResultVarName,RestScope.ResultVarName);
  1647. DeclProc:=RestScope.DeclarationProc;
  1648. if DeclProc=nil then
  1649. begin
  1650. DeclProc:=Rest;
  1651. CheckRestoredProcNameParts(Path,Orig,Rest,Flags);
  1652. CheckRestoredElement(Path+'.ProcType',Orig.ProcType,Rest.ProcType,Flags);
  1653. CheckRestoredElement(Path+'.PublicName',Orig.PublicName,Rest.PublicName,Flags);
  1654. CheckRestoredElement(Path+'.LibrarySymbolName',Orig.LibrarySymbolName,Rest.LibrarySymbolName,Flags);
  1655. CheckRestoredElement(Path+'.LibraryExpr',Orig.LibraryExpr,Rest.LibraryExpr,Flags);
  1656. CheckRestoredElement(Path+'.DispIDExpr',Orig.DispIDExpr,Rest.DispIDExpr,Flags);
  1657. AssertEquals(Path+'.AliasName',Orig.AliasName,Rest.AliasName);
  1658. if Orig.Modifiers<>Rest.Modifiers then
  1659. Fail(Path+'.Modifiers');
  1660. AssertEquals(Path+'.MessageName',Orig.MessageName,Rest.MessageName);
  1661. if Orig.MessageType<>Rest.MessageType then
  1662. Fail(Path+'.MessageType Orig='+PCUProcedureMessageTypeNames[Orig.MessageType]+' Rest='+PCUProcedureMessageTypeNames[Rest.MessageType]);
  1663. end
  1664. else
  1665. begin
  1666. // ImplProc
  1667. if Orig.Modifiers*PCUProcedureModifiersImplProc<>Rest.Modifiers*PCUProcedureModifiersImplProc then
  1668. Fail(Path+'.Impl-Modifiers');
  1669. end;
  1670. // Body
  1671. if Orig.Body<>nil then
  1672. begin
  1673. if Engine.ProcCanBePrecompiled(DeclProc) then
  1674. begin
  1675. AssertEquals(Path+'.EmptyJS',OrigScope.EmptyJS,RestScope.EmptyJS);
  1676. CheckRestoredJS(Path+'.BodyJS',OrigScope.BodyJS,RestScope.BodyJS);
  1677. CheckRestoredStringList(Path+'.GlobalJS',OrigScope.GlobalJS,RestScope.GlobalJS);
  1678. end
  1679. else
  1680. begin
  1681. // generic body
  1682. CheckRestoredProcedureBody(Path+'.Body',Orig.Body,Rest.Body,Flags+[PCCGeneric]);
  1683. end;
  1684. end
  1685. else if Rest.Body<>nil then
  1686. Fail(Path+'.Body<>nil, expected =nil');
  1687. end;
  1688. procedure TCustomTestPrecompile.CheckRestoredOperator(const Path: string; Orig,
  1689. Rest: TPasOperator; Flags: TPCCheckFlags);
  1690. begin
  1691. if Orig.OperatorType<>Rest.OperatorType then
  1692. Fail(Path+'.OperatorType Orig='+PCUOperatorTypeNames[Orig.OperatorType]+' Rest='+PCUOperatorTypeNames[Rest.OperatorType]);
  1693. AssertEquals(Path+'.TokenBased',Orig.TokenBased,Rest.TokenBased);
  1694. CheckRestoredProcedure(Path,Orig,Rest,Flags);
  1695. end;
  1696. procedure TCustomTestPrecompile.CheckRestoredProcedureBody(const Path: string;
  1697. Orig, Rest: TProcedureBody; Flags: TPCCheckFlags);
  1698. begin
  1699. CheckRestoredObject(Path+'.CustomData',Orig.CustomData,Rest.CustomData);
  1700. CheckRestoredDeclarations(Path,Orig,Rest,Flags);
  1701. CheckRestoredElement(Path+'.Body',Orig.Body,Rest.Body,Flags);
  1702. end;
  1703. procedure TCustomTestPrecompile.CheckRestoredAttributes(const Path: string;
  1704. Orig, Rest: TPasAttributes; Flags: TPCCheckFlags);
  1705. begin
  1706. CheckRestoredPasExprArray(Path+'.Calls',Orig.Calls,Rest.Calls,Flags);
  1707. end;
  1708. procedure TCustomTestPrecompile.CheckRestoredImplCommand(const Path: string;
  1709. Orig, Rest: TPasImplCommand; Flags: TPCCheckFlags);
  1710. begin
  1711. if Path='' then ;
  1712. if Flags=[] then ;
  1713. if Orig=nil then ;
  1714. if Rest=nil then ;
  1715. end;
  1716. procedure TCustomTestPrecompile.CheckRestoredImplBeginBlock(const Path: string;
  1717. Orig, Rest: TPasImplBeginBlock; Flags: TPCCheckFlags);
  1718. begin
  1719. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1720. end;
  1721. procedure TCustomTestPrecompile.CheckRestoredImplAsmStatement(
  1722. const Path: string; Orig, Rest: TPasImplAsmStatement; Flags: TPCCheckFlags);
  1723. begin
  1724. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1725. CheckRestoredStringList(Path+'.Tokens',Orig.Tokens,Rest.Tokens);
  1726. end;
  1727. procedure TCustomTestPrecompile.CheckRestoredImplRepeatUntil(
  1728. const Path: string; Orig, Rest: TPasImplRepeatUntil; Flags: TPCCheckFlags);
  1729. begin
  1730. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1731. CheckRestoredElement(Path+'.ConditionExpr',Orig.ConditionExpr,Rest.ConditionExpr,Flags);
  1732. end;
  1733. procedure TCustomTestPrecompile.CheckRestoredImplIfElse(const Path: string;
  1734. Orig, Rest: TPasImplIfElse; Flags: TPCCheckFlags);
  1735. begin
  1736. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1737. CheckRestoredElement(Path+'.ConditionExpr',Orig.ConditionExpr,Rest.ConditionExpr,Flags);
  1738. CheckRestoredElement(Path+'.IfBranch',Orig.IfBranch,Rest.IfBranch,Flags);
  1739. CheckRestoredElement(Path+'.ElseBranch',Orig.ElseBranch,Rest.ElseBranch,Flags);
  1740. end;
  1741. procedure TCustomTestPrecompile.CheckRestoredImplWhileDo(const Path: string;
  1742. Orig, Rest: TPasImplWhileDo; Flags: TPCCheckFlags);
  1743. begin
  1744. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1745. CheckRestoredElement(Path+'.ConditionExpr',Orig.ConditionExpr,Rest.ConditionExpr,Flags);
  1746. CheckRestoredElement(Path+'.Body',Orig.Body,Rest.Body,Flags);
  1747. end;
  1748. procedure TCustomTestPrecompile.CheckRestoredImplWithDo(const Path: string;
  1749. Orig, Rest: TPasImplWithDo; Flags: TPCCheckFlags);
  1750. begin
  1751. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1752. CheckRestoredElementList(Path+'.ConditionExpr',Orig.Expressions,Rest.Expressions,Flags);
  1753. CheckRestoredElement(Path+'.Body',Orig.Body,Rest.Body,Flags);
  1754. end;
  1755. procedure TCustomTestPrecompile.CheckRestoredImplCaseOf(const Path: string;
  1756. Orig, Rest: TPasImplCaseOf; Flags: TPCCheckFlags);
  1757. begin
  1758. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1759. CheckRestoredElement(Path+'.CaseExpr',Orig.CaseExpr,Rest.CaseExpr,Flags);
  1760. CheckRestoredElement(Path+'.ElseBranch',Orig.ElseBranch,Rest.ElseBranch,Flags);
  1761. end;
  1762. procedure TCustomTestPrecompile.CheckRestoredImplCaseStatement(
  1763. const Path: string; Orig, Rest: TPasImplCaseStatement; Flags: TPCCheckFlags);
  1764. begin
  1765. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1766. CheckRestoredElementList(Path+'.Expressions',Orig.Expressions,Rest.Expressions,Flags);
  1767. CheckRestoredElement(Path+'.Body',Orig.Body,Rest.Body,Flags);
  1768. end;
  1769. procedure TCustomTestPrecompile.CheckRestoredImplCaseElse(const Path: string;
  1770. Orig, Rest: TPasImplCaseElse; Flags: TPCCheckFlags);
  1771. begin
  1772. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1773. end;
  1774. procedure TCustomTestPrecompile.CheckRestoredImplForLoop(const Path: string;
  1775. Orig, Rest: TPasImplForLoop; Flags: TPCCheckFlags);
  1776. begin
  1777. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1778. if Orig.LoopType<>Rest.LoopType then
  1779. AssertEquals(Path+'.LoopType',PCUForLoopType[Orig.LoopType],PCUForLoopType[Rest.LoopType]);
  1780. CheckRestoredElement(Path+'.VariableName',Orig.VariableName,Rest.VariableName,Flags);
  1781. CheckRestoredElement(Path+'.StartExpr',Orig.StartExpr,Rest.StartExpr,Flags);
  1782. CheckRestoredElement(Path+'.EndExpr',Orig.EndExpr,Rest.EndExpr,Flags);
  1783. CheckRestoredElement(Path+'.Body',Orig.Body,Rest.Body,Flags);
  1784. CheckRestoredElement(Path+'.Variable',Orig.Variable,Rest.Variable,Flags);
  1785. end;
  1786. procedure TCustomTestPrecompile.CheckRestoredImplAssign(const Path: string;
  1787. Orig, Rest: TPasImplAssign; Flags: TPCCheckFlags);
  1788. begin
  1789. CheckRestoredElement(Path+'.left',Orig.left,Rest.left,Flags);
  1790. CheckRestoredElement(Path+'.right',Orig.right,Rest.right,Flags);
  1791. end;
  1792. procedure TCustomTestPrecompile.CheckRestoredImplSimple(const Path: string;
  1793. Orig, Rest: TPasImplSimple; Flags: TPCCheckFlags);
  1794. begin
  1795. CheckRestoredElement(Path+'.Expr',Orig.Expr,Rest.Expr,Flags);
  1796. end;
  1797. procedure TCustomTestPrecompile.CheckRestoredImplTry(const Path: string; Orig,
  1798. Rest: TPasImplTry; Flags: TPCCheckFlags);
  1799. begin
  1800. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1801. CheckRestoredElement(Path+'.FinallyExcept',Orig.FinallyExcept,Rest.FinallyExcept,Flags);
  1802. CheckRestoredElement(Path+'.ElseBranch',Orig.ElseBranch,Rest.ElseBranch,Flags);
  1803. end;
  1804. procedure TCustomTestPrecompile.CheckRestoredImplTryHandler(const Path: string;
  1805. Orig, Rest: TPasImplTryHandler; Flags: TPCCheckFlags);
  1806. begin
  1807. CheckRestoredElementList(Path+'.Elements',Orig.Elements,Rest.Elements,Flags);
  1808. end;
  1809. procedure TCustomTestPrecompile.CheckRestoredImplExceptOn(const Path: string;
  1810. Orig, Rest: TPasImplExceptOn; Flags: TPCCheckFlags);
  1811. begin
  1812. CheckRestoredElement(Path+'.VarEl',Orig.VarEl,Rest.VarEl,Flags);
  1813. CheckRestoredElOrRef(Path+'.TypeEl',Orig,Orig.TypeEl,Rest,Rest.TypeEl,Flags);
  1814. CheckRestoredElement(Path+'.Body',Orig.Body,Rest.Body,Flags);
  1815. end;
  1816. procedure TCustomTestPrecompile.CheckRestoredImplRaise(const Path: string;
  1817. Orig, Rest: TPasImplRaise; Flags: TPCCheckFlags);
  1818. begin
  1819. CheckRestoredElement(Path+'.ExceptObject',Orig.ExceptObject,Rest.ExceptObject,Flags);
  1820. CheckRestoredElement(Path+'.ExceptAddr',Orig.ExceptAddr,Rest.ExceptAddr,Flags);
  1821. end;
  1822. { TTestPrecompile }
  1823. procedure TTestPrecompile.Test_Base256VLQ;
  1824. procedure Test(i: TMaxPrecInt);
  1825. var
  1826. s: String;
  1827. p: PByte;
  1828. j: TMaxPrecInt;
  1829. begin
  1830. s:=EncodeVLQ(i);
  1831. p:=PByte(s);
  1832. j:=DecodeVLQ(p);
  1833. if i<>j then
  1834. Fail('Encode/DecodeVLQ OrigIndex='+IntToStr(i)+' Code="'+s+'" NewIndex='+IntToStr(j));
  1835. end;
  1836. procedure TestStr(i: TMaxPrecInt; Expected: string);
  1837. var
  1838. Actual: String;
  1839. begin
  1840. Actual:=EncodeVLQ(i);
  1841. AssertEquals('EncodeVLQ('+IntToStr(i)+')',Expected,Actual);
  1842. end;
  1843. var
  1844. i: Integer;
  1845. begin
  1846. TestStr(0,#0);
  1847. TestStr(1,#2);
  1848. TestStr(-1,#3);
  1849. for i:=-8200 to 8200 do
  1850. Test(i);
  1851. Test(High(TMaxPrecInt));
  1852. Test(High(TMaxPrecInt)-1);
  1853. Test(Low(TMaxPrecInt)+2);
  1854. Test(Low(TMaxPrecInt)+1);
  1855. //Test(Low(TMaxPrecInt)); such a high number is not needed by pastojs
  1856. end;
  1857. procedure TTestPrecompile.TestPC_EmptyUnit;
  1858. begin
  1859. StartUnit(false);
  1860. Add([
  1861. 'interface',
  1862. 'implementation']);
  1863. WriteReadUnit;
  1864. end;
  1865. procedure TTestPrecompile.TestPC_Const;
  1866. begin
  1867. StartUnit(false);
  1868. Add([
  1869. 'interface',
  1870. 'const',
  1871. ' Three = 3;',
  1872. ' FourPlusFive: longint = 4+5 deprecated ''deprtext'';',
  1873. ' Four: byte = +6-2*2 platform;',
  1874. ' Affirmative = true;',
  1875. ' BFalse = false;', // bool lit
  1876. ' NotBFalse = not BFalse;', // boolconst
  1877. ' UnaryMinus = -3;', // unary minus
  1878. ' FloatA = -31.678E-012;', // float lit
  1879. ' HighInt = High(longint);', // func params, built-in function
  1880. ' s = ''abc'';', // string lit
  1881. ' c: char = s[1];', // array params
  1882. ' a: array[1..2] of longint = (3,4);', // anonymous array, range, array values
  1883. ' PI: Double; external name ''Math.PI'';',
  1884. 'resourcestring',
  1885. ' rs = ''rs'';',
  1886. 'implementation']);
  1887. WriteReadUnit;
  1888. end;
  1889. procedure TTestPrecompile.TestPC_Var;
  1890. begin
  1891. StartUnit(false);
  1892. Add([
  1893. 'interface',
  1894. 'var',
  1895. ' FourPlusFive: longint = 4+5 deprecated ''deprtext'';',
  1896. ' e: double external name ''Math.e'';',
  1897. ' AnoArr: array of longint = (1,2,3);',
  1898. ' s: string = ''aaaäö'';',
  1899. ' s2: string = ''😊'';', // 1F60A
  1900. ' a,b: array of longint;',
  1901. 'implementation']);
  1902. WriteReadUnit;
  1903. end;
  1904. procedure TTestPrecompile.TestPC_Enum;
  1905. begin
  1906. StartUnit(false);
  1907. Add([
  1908. 'interface',
  1909. 'type',
  1910. ' TEnum = (red,green,blue);',
  1911. ' TEnumRg = green..blue;',
  1912. ' TArrOfEnum = array of TEnum;',
  1913. ' TArrOfEnumRg = array of TEnumRg;',
  1914. ' TArrEnumOfInt = array[TEnum] of longint;',
  1915. 'var',
  1916. ' HighEnum: TEnum = high(TEnum);',
  1917. 'implementation']);
  1918. WriteReadUnit;
  1919. end;
  1920. procedure TTestPrecompile.TestPC_Set;
  1921. begin
  1922. StartUnit(false);
  1923. Add([
  1924. 'interface',
  1925. 'type',
  1926. ' TEnum = (red,green,blue);',
  1927. ' TEnumRg = green..blue;',
  1928. ' TEnumAlias = TEnum;', // alias
  1929. ' TSetOfEnum = set of TEnum;',
  1930. ' TSetOfEnumRg = set of TEnumRg;',
  1931. ' TSetOfDir = set of (west,east);',
  1932. 'var',
  1933. ' Empty: TSetOfEnum = [];', // empty set lit
  1934. ' All: TSetOfEnum = [low(TEnum)..pred(high(TEnum)),high(TEnum)];', // full set lit, range in set
  1935. 'implementation']);
  1936. WriteReadUnit;
  1937. end;
  1938. procedure TTestPrecompile.TestPC_Set_InFunction;
  1939. begin
  1940. StartUnit(false);
  1941. Add([
  1942. 'interface',
  1943. 'procedure DoIt;',
  1944. 'implementation',
  1945. 'procedure DoIt;',
  1946. 'type',
  1947. ' TEnum = (red,green,blue);',
  1948. ' TEnumRg = green..blue;',
  1949. ' TEnumAlias = TEnum;', // alias
  1950. ' TSetOfEnum = set of TEnum;',
  1951. ' TSetOfEnumRg = set of TEnumRg;',
  1952. ' TSetOfDir = set of (west,east);',
  1953. 'var',
  1954. ' Empty: TSetOfEnum = [];', // empty set lit
  1955. ' All: TSetOfEnum = [low(TEnum)..pred(high(TEnum)),high(TEnum)];', // full set lit, range in set
  1956. ' Dirs: TSetOfDir;',
  1957. 'begin',
  1958. ' Dirs:=[east];',
  1959. 'end;',
  1960. '']);
  1961. WriteReadUnit;
  1962. end;
  1963. procedure TTestPrecompile.TestPC_SetOfAnonymousEnumType;
  1964. begin
  1965. StartUnit(false);
  1966. Add([
  1967. 'interface',
  1968. 'type',
  1969. ' TSetOfDir = set of (west,east);',
  1970. 'implementation']);
  1971. WriteReadUnit;
  1972. end;
  1973. procedure TTestPrecompile.TestPC_Record;
  1974. begin
  1975. StartUnit(false);
  1976. Add([
  1977. '{$ModeSwitch externalclass}',
  1978. 'interface',
  1979. 'type',
  1980. ' TRec = record',
  1981. ' i: longint;',
  1982. ' s: string;',
  1983. ' b: boolean external name ''ext'';',
  1984. ' end;',
  1985. ' P = pointer;', // alias type to built-in type
  1986. ' TArrOfRec = array of TRec;',
  1987. 'var',
  1988. ' r: TRec;', // full set lit, range in set
  1989. 'implementation']);
  1990. WriteReadUnit;
  1991. end;
  1992. procedure TTestPrecompile.TestPC_Record_InFunction;
  1993. begin
  1994. StartUnit(false);
  1995. Add([
  1996. 'interface',
  1997. 'procedure DoIt;',
  1998. 'implementation',
  1999. 'procedure DoIt;',
  2000. 'type',
  2001. ' TRec = record',
  2002. ' i: longint;',
  2003. ' s: string;',
  2004. ' end;',
  2005. ' P = ^TRec;',
  2006. ' TArrOfRec = array of TRec;',
  2007. 'var',
  2008. ' r: TRec;',
  2009. 'begin',
  2010. 'end;']);
  2011. WriteReadUnit;
  2012. end;
  2013. procedure TTestPrecompile.TestPC_RecordAdv;
  2014. begin
  2015. StartUnit(false);
  2016. Add([
  2017. '{$ModeSwitch advancedrecords}',
  2018. 'interface',
  2019. 'type',
  2020. ' TRec = record',
  2021. ' private',
  2022. ' FInt: longint;',
  2023. ' procedure SetInt(Value: longint);',
  2024. ' function GetItems(Value: word): word;',
  2025. ' procedure SetItems(Index, Value: word);',
  2026. ' public',
  2027. ' property Int: longint read FInt write SetInt default 3;',
  2028. ' property Items[Index: word]: word read GetItems write SetItems; default;',
  2029. ' end;',
  2030. 'var',
  2031. ' r: trec;',
  2032. 'implementation',
  2033. 'procedure TRec.SetInt(Value: longint);',
  2034. 'begin',
  2035. 'end;',
  2036. 'function TRec.GetItems(Value: word): word;',
  2037. 'begin',
  2038. 'end;',
  2039. 'procedure TRec.SetItems(Index, Value: word);',
  2040. 'begin',
  2041. 'end;',
  2042. '']);
  2043. WriteReadUnit;
  2044. end;
  2045. procedure TTestPrecompile.TestPC_JSValue;
  2046. begin
  2047. StartUnit(false);
  2048. Add([
  2049. 'interface',
  2050. 'var',
  2051. ' p: pointer = nil;', // pointer, nil lit
  2052. ' js: jsvalue = 13 div 4;', // jsvalue
  2053. 'implementation']);
  2054. WriteReadUnit;
  2055. end;
  2056. procedure TTestPrecompile.TestPC_Array;
  2057. begin
  2058. StartUnit(false);
  2059. Add([
  2060. 'interface',
  2061. 'type',
  2062. ' TEnum = (red,green);',
  2063. ' TArrInt = array of longint;',
  2064. ' TArrInt2 = array[1..2] of longint;',
  2065. ' TArrEnum1 = array[red..green] of longint;',
  2066. ' TArrEnum2 = array[TEnum] of longint;',
  2067. 'implementation']);
  2068. WriteReadUnit;
  2069. end;
  2070. procedure TTestPrecompile.TestPC_ArrayOfAnonymous;
  2071. begin
  2072. StartUnit(false);
  2073. Add([
  2074. 'interface',
  2075. 'var',
  2076. ' a: array of pointer;',
  2077. 'implementation']);
  2078. WriteReadUnit;
  2079. end;
  2080. procedure TTestPrecompile.TestPC_Array_InFunction;
  2081. begin
  2082. StartUnit(false);
  2083. Add([
  2084. 'interface',
  2085. 'procedure DoIt;',
  2086. 'implementation',
  2087. 'procedure DoIt;',
  2088. 'type',
  2089. ' TArr = array[1..2] of word;',
  2090. 'var',
  2091. ' arr: TArr;',
  2092. 'begin',
  2093. ' arr[2]:=arr[1];',
  2094. 'end;',
  2095. '']);
  2096. WriteReadUnit;
  2097. end;
  2098. procedure TTestPrecompile.TestPC_Proc;
  2099. begin
  2100. StartUnit(false);
  2101. Add([
  2102. 'interface',
  2103. ' function Abs(d: double): double; external name ''Math.Abs'';',
  2104. ' function GetIt(d: double): double;',
  2105. ' procedure DoArgs(const a; var b: array of char; out c: jsvalue); inline;',
  2106. ' procedure DoMulti(a,b: byte);',
  2107. 'implementation',
  2108. 'var k: double;',
  2109. 'function GetIt(d: double): double;',
  2110. 'var j: double;',
  2111. 'begin',
  2112. ' j:=Abs(d+k);',
  2113. ' Result:=j;',
  2114. 'end;',
  2115. 'procedure DoArgs(const a; var b: array of char; out c: jsvalue); inline;',
  2116. 'begin',
  2117. 'end;',
  2118. 'procedure DoMulti(a,b: byte);',
  2119. 'begin',
  2120. 'end;',
  2121. 'procedure NotUsed;',
  2122. 'begin',
  2123. 'end;',
  2124. '']);
  2125. WriteReadUnit;
  2126. end;
  2127. procedure TTestPrecompile.TestPC_Proc_Nested;
  2128. begin
  2129. StartUnit(false);
  2130. Add([
  2131. 'interface',
  2132. ' function GetIt(d: longint): longint;',
  2133. 'implementation',
  2134. 'var k: double;',
  2135. 'function GetIt(d: longint): longint;',
  2136. 'var j: double;',
  2137. ' function GetSum(a,b: longint): longint; forward;',
  2138. ' function GetMul(a,b: longint): longint; ',
  2139. ' begin',
  2140. ' Result:=a*b;',
  2141. ' end;',
  2142. ' function GetSum(a,b: longint): longint;',
  2143. ' begin',
  2144. ' Result:=a+b;',
  2145. ' end;',
  2146. ' procedure NotUsed;',
  2147. ' begin',
  2148. ' end;',
  2149. 'begin',
  2150. ' Result:=GetMul(GetSum(d,2),3);',
  2151. 'end;',
  2152. 'procedure NotUsed;',
  2153. 'begin',
  2154. 'end;',
  2155. '']);
  2156. WriteReadUnit;
  2157. end;
  2158. procedure TTestPrecompile.TestPC_Proc_LocalConst;
  2159. begin
  2160. StartUnit(false);
  2161. Add([
  2162. 'interface',
  2163. 'function GetIt(d: double): double;',
  2164. 'implementation',
  2165. 'function GetIt(d: double): double;',
  2166. 'const',
  2167. ' c: double = 3.3;',
  2168. ' e: double = 2.7;', // e is not used
  2169. 'begin',
  2170. ' Result:=d+c;',
  2171. 'end;',
  2172. '']);
  2173. WriteReadUnit;
  2174. end;
  2175. procedure TTestPrecompile.TestPC_Proc_UTF8;
  2176. begin
  2177. StartUnit(false);
  2178. Add([
  2179. 'interface',
  2180. 'function DoIt: string;',
  2181. 'implementation',
  2182. 'function DoIt: string;',
  2183. 'const',
  2184. ' c = ''äöü😊'';',
  2185. 'begin',
  2186. ' Result:=''ÄÖÜ😊''+c;',
  2187. 'end;',
  2188. '']);
  2189. WriteReadUnit;
  2190. end;
  2191. procedure TTestPrecompile.TestPC_Proc_Arg;
  2192. begin
  2193. StartUnit(false);
  2194. Add([
  2195. 'interface',
  2196. 'procedure DoIt(var a; out b,c: longint; const e,f: array of byte; g: boolean = true);',
  2197. 'implementation',
  2198. 'procedure DoIt(var a; out b,c: longint; const e,f: array of byte; g: boolean = true);',
  2199. 'begin',
  2200. 'end;',
  2201. '']);
  2202. WriteReadUnit;
  2203. end;
  2204. procedure TTestPrecompile.TestPC_ProcType;
  2205. begin
  2206. StartUnit(false);
  2207. Add([
  2208. '{$modeswitch arrayoperators}',
  2209. 'interface',
  2210. 'type',
  2211. ' TProc = procedure;',
  2212. ' TArrProc = array of tproc;',
  2213. 'procedure Mark;',
  2214. 'procedure DoIt(const a: TArrProc);',
  2215. 'implementation',
  2216. 'procedure Mark;',
  2217. 'var',
  2218. ' p: TProc;',
  2219. ' a: TArrProc;',
  2220. 'begin',
  2221. ' DoIt([@Mark,p]+a);',
  2222. 'end;',
  2223. 'procedure DoIt(const a: TArrProc);',
  2224. 'begin',
  2225. 'end;',
  2226. '']);
  2227. WriteReadUnit;
  2228. end;
  2229. procedure TTestPrecompile.TestPC_Proc_Anonymous;
  2230. begin
  2231. StartUnit(false);
  2232. Add([
  2233. 'interface',
  2234. 'type',
  2235. ' TFunc = reference to function(w: word): word;',
  2236. ' function GetIt(f: TFunc): longint;',
  2237. 'implementation',
  2238. 'var k: byte;',
  2239. 'function GetIt(f: TFunc): longint;',
  2240. 'begin',
  2241. ' f:=function(w: word): word',
  2242. ' var j: byte;',
  2243. ' function GetMul(a,b: longint): longint; ',
  2244. ' begin',
  2245. ' Result:=a*b;',
  2246. ' end;',
  2247. ' begin',
  2248. ' Result:=j*GetMul(1,2)*k;',
  2249. ' end;',
  2250. 'end;',
  2251. '']);
  2252. WriteReadUnit;
  2253. end;
  2254. procedure TTestPrecompile.TestPC_Proc_ArrayOfConst;
  2255. begin
  2256. StartUnit(true,[supTVarRec]);
  2257. Add([
  2258. 'interface',
  2259. 'procedure Fly(arr: array of const);',
  2260. 'implementation',
  2261. 'procedure Fly(arr: array of const);',
  2262. 'begin',
  2263. ' if arr[1].VType=1 then ;',
  2264. ' if arr[2].VInteger=1 then ;',
  2265. ' Fly([true,0.3]);',
  2266. 'end;',
  2267. '']);
  2268. WriteReadUnit;
  2269. end;
  2270. procedure TTestPrecompile.TestPC_Class;
  2271. begin
  2272. StartUnit(false);
  2273. Add([
  2274. 'interface',
  2275. 'type',
  2276. ' TObject = class',
  2277. ' protected',
  2278. ' FInt: longint;',
  2279. ' procedure SetInt(Value: longint); virtual; abstract;',
  2280. ' public',
  2281. ' property Int: longint read FInt write SetInt default 3;',
  2282. ' end;',
  2283. ' TBird = class',
  2284. ' protected',
  2285. ' procedure SetInt(Value: longint); override;',
  2286. ' published',
  2287. ' property Int;',
  2288. ' end;',
  2289. 'var',
  2290. ' o: tobject;',
  2291. 'implementation',
  2292. 'procedure TBird.SetInt(Value: longint);',
  2293. 'begin',
  2294. 'end;'
  2295. ]);
  2296. WriteReadUnit;
  2297. end;
  2298. procedure TTestPrecompile.TestPC_ClassForward;
  2299. begin
  2300. Converter.Options:=Converter.Options-[coNoTypeInfo];
  2301. StartUnit(false);
  2302. Add([
  2303. 'interface',
  2304. 'type',
  2305. ' TObject = class end;',
  2306. ' TFish = class;',
  2307. ' TBird = class;',
  2308. ' TBirdClass = class of TBird;',
  2309. ' TFish = class',
  2310. ' B: TBird;',
  2311. ' end;',
  2312. ' TBird = class',
  2313. ' F: TFish;',
  2314. ' end;',
  2315. ' TFishClass = class of TFish;',
  2316. 'var',
  2317. ' b: tbird;',
  2318. ' f: tfish;',
  2319. ' bc: TBirdClass;',
  2320. ' fc: TFishClass;',
  2321. 'implementation',
  2322. 'end.'
  2323. ]);
  2324. WriteReadUnit;
  2325. end;
  2326. procedure TTestPrecompile.TestPC_ClassConstructor;
  2327. begin
  2328. StartUnit(false);
  2329. Add([
  2330. 'interface',
  2331. 'type',
  2332. ' TObject = class',
  2333. ' constructor Create; virtual;',
  2334. ' end;',
  2335. ' TBird = class',
  2336. ' constructor Create; override;',
  2337. ' end;',
  2338. 'procedure DoIt;',
  2339. 'implementation',
  2340. 'constructor TObject.Create;',
  2341. 'begin',
  2342. 'end;',
  2343. 'constructor TBird.Create;',
  2344. 'begin',
  2345. ' inherited;',
  2346. 'end;',
  2347. 'procedure DoIt;',
  2348. 'var b: TBird;',
  2349. 'begin',
  2350. ' b:=TBird.Create;',
  2351. 'end;',
  2352. 'end.'
  2353. ]);
  2354. WriteReadUnit;
  2355. end;
  2356. procedure TTestPrecompile.TestPC_ClassDestructor;
  2357. begin
  2358. StartUnit(false);
  2359. Add([
  2360. 'interface',
  2361. 'type',
  2362. ' TObject = class',
  2363. ' destructor Destroy; virtual;',
  2364. ' end;',
  2365. ' TBird = class',
  2366. ' destructor Destroy; override;',
  2367. ' end;',
  2368. 'procedure DoIt;',
  2369. 'implementation',
  2370. 'destructor TObject.Destroy;',
  2371. 'begin',
  2372. 'end;',
  2373. 'destructor TBird.Destroy;',
  2374. 'begin',
  2375. ' inherited;',
  2376. 'end;',
  2377. 'procedure DoIt;',
  2378. 'var b: TBird;',
  2379. 'begin',
  2380. ' b.Destroy;',
  2381. 'end;',
  2382. 'end.'
  2383. ]);
  2384. WriteReadUnit;
  2385. end;
  2386. procedure TTestPrecompile.TestPC_ClassDispatchMessage;
  2387. begin
  2388. StartUnit(false);
  2389. Add([
  2390. 'interface',
  2391. 'type',
  2392. ' {$DispatchField DispInt}',
  2393. ' {$DispatchStrField DispStr}',
  2394. ' TObject = class',
  2395. ' end;',
  2396. ' THopMsg = record',
  2397. ' DispInt: longint;',
  2398. ' end;',
  2399. ' TPutMsg = record',
  2400. ' DispStr: string;',
  2401. ' end;',
  2402. ' TBird = class',
  2403. ' procedure Fly(var Msg); virtual; abstract; message 2;',
  2404. ' procedure Run; overload; virtual; abstract;',
  2405. ' procedure Run(var Msg); overload; message ''Fast'';',
  2406. ' procedure Hop(var Msg: THopMsg); virtual; abstract; message 3;',
  2407. ' procedure Put(var Msg: TPutMsg); virtual; abstract; message ''foo'';',
  2408. ' end;',
  2409. 'implementation',
  2410. 'procedure TBird.Run(var Msg);',
  2411. 'begin',
  2412. 'end;',
  2413. 'end.',
  2414. '']);
  2415. WriteReadUnit;
  2416. end;
  2417. procedure TTestPrecompile.TestPC_Initialization;
  2418. begin
  2419. StartUnit(false);
  2420. Add([
  2421. 'interface',
  2422. 'implementation',
  2423. 'type',
  2424. ' TCaption = string;',
  2425. ' TRec = record h: string; end;',
  2426. 'var',
  2427. ' s: TCaption;',
  2428. ' r: TRec;',
  2429. 'initialization',
  2430. ' s:=''ö😊'';',
  2431. ' r.h:=''Ä😊'';',
  2432. 'end.',
  2433. '']);
  2434. WriteReadUnit;
  2435. end;
  2436. procedure TTestPrecompile.TestPC_BoolSwitches;
  2437. begin
  2438. StartUnit(false);
  2439. Add([
  2440. 'interface',
  2441. '{$R+}',
  2442. '{$C+}',
  2443. 'type',
  2444. ' TObject = class',
  2445. '{$C-}',
  2446. ' procedure DoIt;',
  2447. ' end;',
  2448. '{$C+}',
  2449. 'implementation',
  2450. '{$R-}',
  2451. 'procedure TObject.DoIt;',
  2452. 'begin',
  2453. 'end;',
  2454. '{$C-}',
  2455. 'initialization',
  2456. '{$R+}',
  2457. 'end.',
  2458. '']);
  2459. WriteReadUnit;
  2460. end;
  2461. procedure TTestPrecompile.TestPC_ClassInterface;
  2462. begin
  2463. StartUnit(false);
  2464. Add([
  2465. 'interface',
  2466. '{$interfaces corba}',
  2467. 'type',
  2468. ' IUnknown = interface',
  2469. ' end;',
  2470. ' IFlying = interface',
  2471. ' procedure SetItems(Index: longint; Value: longint);',
  2472. ' end;',
  2473. ' IBird = interface(IFlying)',
  2474. ' [''{D44C1F80-44F9-4E88-8443-C518CCDC1FE8}'']',
  2475. ' function GetItems(Index: longint): longint;',
  2476. ' property Items[Index: longint]: longint read GetItems write SetItems;',
  2477. ' end;',
  2478. ' TObject = class',
  2479. ' end;',
  2480. ' TBird = class(TObject,IBird)',
  2481. ' strict private',
  2482. ' function IBird.GetItems = RetItems;',
  2483. ' function RetItems(Index: longint): longint; virtual; abstract;',
  2484. ' procedure SetItems(Index: longint; Value: longint); virtual; abstract;',
  2485. ' end;',
  2486. ' TEagle = class(TObject,IBird)',
  2487. ' strict private',
  2488. ' FBird: IBird;',
  2489. ' property Bird: IBird read FBird implements IBird;',
  2490. ' end;',
  2491. 'implementation',
  2492. 'end.',
  2493. '']);
  2494. WriteReadUnit;
  2495. end;
  2496. procedure TTestPrecompile.TestPC_Attributes;
  2497. begin
  2498. StartUnit(false);
  2499. Add([
  2500. 'interface',
  2501. '{$modeswitch PrefixedAttributes}',
  2502. 'type',
  2503. ' TObject = class',
  2504. ' constructor Create;',
  2505. ' end;',
  2506. ' TCustomAttribute = class',
  2507. ' constructor Create(Id: word);',
  2508. ' end;',
  2509. ' [Missing]',
  2510. ' TBird = class',
  2511. ' [TCustom]',
  2512. ' FField: word;',
  2513. ' end;',
  2514. ' TRec = record',
  2515. ' [TCustom]',
  2516. ' Size: word;',
  2517. ' end;',
  2518. 'var',
  2519. ' [TCustom, TCustom(3)]',
  2520. ' o: TObject;',
  2521. 'implementation',
  2522. '[TCustom]',
  2523. 'constructor TObject.Create; begin end;',
  2524. 'constructor TCustomAttribute.Create(Id: word); begin end;',
  2525. '']);
  2526. WriteReadUnit;
  2527. end;
  2528. procedure TTestPrecompile.TestPC_GenericFunction_Assign;
  2529. begin
  2530. StartUnit(false);
  2531. Parser.Options:=Parser.Options+[po_cassignments];
  2532. Add([
  2533. 'interface',
  2534. 'generic function Run<T>(a: T): T;',
  2535. 'implementation',
  2536. 'generic function Run<T>(a: T): T;',
  2537. 'var b: T;',
  2538. ' var i: word;',
  2539. 'begin',
  2540. ' b:=a;',
  2541. ' Result:=b;',
  2542. ' i+=1;',
  2543. 'end;',
  2544. '']);
  2545. WriteReadUnit;
  2546. end;
  2547. procedure TTestPrecompile.TestPC_GenericFunction_Asm;
  2548. begin
  2549. StartUnit(false);
  2550. Add([
  2551. 'interface',
  2552. 'generic function Run<T>(a: T): T;',
  2553. 'generic function Fly<T>(b: T): T;',
  2554. 'implementation',
  2555. 'generic function Run<T>(a: T): T; assembler;',
  2556. 'asm',
  2557. ' console.log(a);',
  2558. 'end;',
  2559. 'generic function Fly<T>(b: T): T;',
  2560. 'begin',
  2561. ' asm end;',
  2562. ' asm',
  2563. ' console.log(b);',
  2564. ' end;',
  2565. 'end;',
  2566. '']);
  2567. WriteReadUnit;
  2568. end;
  2569. procedure TTestPrecompile.TestPC_GenericFunction_RepeatUntil;
  2570. begin
  2571. StartUnit(false);
  2572. Add([
  2573. 'interface',
  2574. 'generic function Run<T>(a: T): T;',
  2575. 'implementation',
  2576. 'generic function Run<T>(a: T): T;',
  2577. 'begin',
  2578. ' repeat until a>1;',
  2579. ' repeat',
  2580. ' Result:=a;',
  2581. ' until false',
  2582. 'end;',
  2583. '']);
  2584. WriteReadUnit;
  2585. end;
  2586. procedure TTestPrecompile.TestPC_GenericFunction_IfElse;
  2587. begin
  2588. StartUnit(false);
  2589. Add([
  2590. 'interface',
  2591. 'generic function Run<T>(a: T): T;',
  2592. 'implementation',
  2593. 'generic function Run<T>(a: T): T;',
  2594. 'begin',
  2595. ' if true then ;',
  2596. ' if false then else ;',
  2597. ' if false then Result:=a else ;',
  2598. ' if false then else Result:=a;',
  2599. ' if true then a:=a else Result:=a;',
  2600. 'end;',
  2601. '']);
  2602. WriteReadUnit;
  2603. end;
  2604. procedure TTestPrecompile.TestPC_GenericFunction_WhileDo;
  2605. begin
  2606. StartUnit(false);
  2607. Add([
  2608. 'interface',
  2609. 'generic function Run<T>(a: T): T;',
  2610. 'implementation',
  2611. 'generic function Run<T>(a: T): T;',
  2612. 'begin',
  2613. ' while true do ;',
  2614. ' while true do a:=a;',
  2615. ' while true do while false do Result:=a;',
  2616. 'end;',
  2617. '']);
  2618. WriteReadUnit;
  2619. end;
  2620. procedure TTestPrecompile.TestPC_GenericFunction_WithDo;
  2621. begin
  2622. StartUnit(false);
  2623. Add([
  2624. 'interface',
  2625. 'type',
  2626. ' TRec = record w: word; end;',
  2627. 'generic function Run<T>(a: T): T;',
  2628. 'implementation',
  2629. 'generic function Run<T>(a: T): T;',
  2630. 'var r,s: TRec;',
  2631. 'begin',
  2632. ' with r do ;',
  2633. ' with r do a:=a;',
  2634. ' with r do begin w:=w; end;',
  2635. ' with r,s do w:=w;',
  2636. ' with r do with s do w:=w;',
  2637. 'end;',
  2638. '']);
  2639. WriteReadUnit;
  2640. end;
  2641. procedure TTestPrecompile.TestPC_GenericFunction_CaseOf;
  2642. begin
  2643. StartUnit(false);
  2644. Add([
  2645. 'interface',
  2646. 'generic function Run<T>(a: T): T;',
  2647. 'implementation',
  2648. 'generic function Run<T>(a: T): T;',
  2649. 'var i,j,k,l,m,n,o: word;',
  2650. 'begin',
  2651. ' case i of',
  2652. ' 1: ;',
  2653. ' end;',
  2654. ' case j of',
  2655. ' 1: ;',
  2656. ' 2..3: ;',
  2657. ' 4,5: ;',
  2658. ' end;',
  2659. ' case k of',
  2660. ' 1: ;',
  2661. ' else',
  2662. ' end;',
  2663. ' case l of',
  2664. ' 1: ;',
  2665. ' else m:=m;',
  2666. ' end;',
  2667. ' case n of',
  2668. ' 1: o:=o;',
  2669. ' end;',
  2670. 'end;',
  2671. '']);
  2672. WriteReadUnit;
  2673. end;
  2674. procedure TTestPrecompile.TestPC_GenericFunction_ForLoop;
  2675. begin
  2676. StartUnit(false);
  2677. Add([
  2678. 'interface',
  2679. 'generic function Run<T>(a: T): T;',
  2680. 'implementation',
  2681. 'generic function Run<T>(a: T): T;',
  2682. 'var i,j,k,l: word;',
  2683. ' c: char;',
  2684. 'begin',
  2685. ' for i:=1 to 3 do ;',
  2686. ' for j:=1+4 to 3*7 do ;',
  2687. ' for k:=-1 to 2 do l:=l;',
  2688. ' for c in char do ;',
  2689. 'end;',
  2690. '']);
  2691. WriteReadUnit;
  2692. end;
  2693. procedure TTestPrecompile.TestPC_GenericFunction_Simple;
  2694. begin
  2695. StartUnit(false);
  2696. Add([
  2697. 'interface',
  2698. 'generic function Run<T>(a: T): T;',
  2699. 'implementation',
  2700. 'procedure Fly(w: word = 0); begin end;',
  2701. 'generic function Run<T>(a: T): T;',
  2702. 'begin',
  2703. ' Fly;',
  2704. ' Fly();',
  2705. ' Fly(3);',
  2706. 'end;',
  2707. '']);
  2708. WriteReadUnit;
  2709. end;
  2710. procedure TTestPrecompile.TestPC_GenericFunction_TryFinally;
  2711. begin
  2712. StartUnit(false);
  2713. Add([
  2714. 'interface',
  2715. 'generic function Run<T>(a: T): T;',
  2716. 'implementation',
  2717. 'generic function Run<T>(a: T): T;',
  2718. 'var i: word;',
  2719. 'begin',
  2720. ' try',
  2721. ' finally;',
  2722. ' end;',
  2723. ' try',
  2724. ' i:=i;',
  2725. ' finally;',
  2726. ' end;',
  2727. ' try',
  2728. ' finally;',
  2729. ' i:=i;',
  2730. ' end;',
  2731. 'end;',
  2732. '']);
  2733. WriteReadUnit;
  2734. end;
  2735. procedure TTestPrecompile.TestPC_GenericFunction_TryExcept;
  2736. begin
  2737. StartUnit(false);
  2738. Add([
  2739. 'interface',
  2740. 'type',
  2741. ' TObject = class end;',
  2742. ' Exception = class Msg: string; end;',
  2743. ' EInvalidCast = class(Exception) end;',
  2744. 'generic function Run<T>(a: T): T;',
  2745. 'implementation',
  2746. 'generic function Run<T>(a: T): T;',
  2747. 'var vI: longint;',
  2748. 'begin',
  2749. ' try',
  2750. ' vi:=1;',
  2751. ' except',
  2752. ' vi:=2',
  2753. ' end;',
  2754. ' try',
  2755. ' except',
  2756. ' raise;',
  2757. ' end;',
  2758. ' try',
  2759. ' VI:=4;',
  2760. ' except',
  2761. ' on einvalidcast do',
  2762. ' raise;',
  2763. ' on E: exception do',
  2764. ' if e.msg='''' then',
  2765. ' raise e;',
  2766. ' else',
  2767. ' vi:=5',
  2768. ' end;',
  2769. ' try',
  2770. ' VI:=6;',
  2771. ' except',
  2772. ' on einvalidcast do ;',
  2773. ' end;',
  2774. 'end;',
  2775. '']);
  2776. WriteReadUnit;
  2777. end;
  2778. procedure TTestPrecompile.TestPC_GenericFunction_LocalProc;
  2779. begin
  2780. StartUnit(false);
  2781. Add([
  2782. 'interface',
  2783. 'generic function Run<T>(a: T): T;',
  2784. 'implementation',
  2785. 'generic function Run<T>(a: T): T;',
  2786. 'var vI: longint;',
  2787. ' procedure SubA; forward;',
  2788. ' procedure SubB;',
  2789. ' begin',
  2790. ' SubA;',
  2791. ' vI:=vI;',
  2792. ' end;',
  2793. ' procedure SubA;',
  2794. ' begin',
  2795. ' SubB;',
  2796. ' vI:=vI;',
  2797. ' end;',
  2798. 'begin',
  2799. ' SubB;',
  2800. 'end;',
  2801. '']);
  2802. WriteReadUnit;
  2803. end;
  2804. procedure TTestPrecompile.TestPC_GenericFunction_AnonymousProc;
  2805. begin
  2806. StartUnit(false);
  2807. Add([
  2808. 'interface',
  2809. 'type',
  2810. ' TFunc = reference to function(x: word): word;',
  2811. 'var Func: TFunc;',
  2812. 'generic function Run<T>(a: T): T;',
  2813. 'implementation',
  2814. 'generic function Run<T>(a: T): T;',
  2815. 'begin',
  2816. ' Func:=function(b:word): word',
  2817. ' begin',
  2818. ' exit(b);',
  2819. ' exit(Result);',
  2820. ' end;',
  2821. 'end;',
  2822. '']);
  2823. WriteReadUnit;
  2824. end;
  2825. procedure TTestPrecompile.TestPC_GenericClass;
  2826. begin
  2827. StartUnit(false);
  2828. Add([
  2829. 'interface',
  2830. 'type',
  2831. ' TObject = class',
  2832. ' end;',
  2833. ' generic TBird<T> = class',
  2834. ' a: T;',
  2835. ' function Run: T;',
  2836. ' end;',
  2837. 'implementation',
  2838. 'function TBird.Run: T;',
  2839. 'var b: T;',
  2840. 'begin',
  2841. ' b:=a; Result:=b;',
  2842. 'end;',
  2843. '']);
  2844. WriteReadUnit;
  2845. end;
  2846. procedure TTestPrecompile.TestPC_GenericMethod;
  2847. begin
  2848. StartUnit(false);
  2849. Add([
  2850. '{$mode delphi}',
  2851. 'interface',
  2852. 'type',
  2853. ' TObject = class',
  2854. ' end;',
  2855. ' TBird = class',
  2856. ' function Run<T>(a: T): T;',
  2857. ' end;',
  2858. 'implementation',
  2859. 'function TBird.Run<T>(a: T): T;',
  2860. 'var b: T;',
  2861. 'begin',
  2862. ' b:=a;',
  2863. ' Result:=b;',
  2864. 'end;',
  2865. '']);
  2866. WriteReadUnit;
  2867. end;
  2868. procedure TTestPrecompile.TestPC_SpecializeClassSameUnit;
  2869. begin
  2870. StartUnit(false);
  2871. Add([
  2872. '{$mode delphi}',
  2873. 'interface',
  2874. 'type',
  2875. ' TObject = class',
  2876. ' end;',
  2877. ' TBird<T> = class',
  2878. ' a: T;',
  2879. ' end;',
  2880. ' TBigBird = TBIrd<double>;',
  2881. 'var',
  2882. ' b: TBigBird;',
  2883. 'implementation',
  2884. 'begin',
  2885. ' b.a:=1.3;',
  2886. 'end.',
  2887. '']);
  2888. WriteReadUnit;
  2889. end;
  2890. procedure TTestPrecompile.TestPC_UseUnit;
  2891. begin
  2892. AddModuleWithIntfImplSrc('unit2.pp',
  2893. LinesToStr([
  2894. 'type',
  2895. ' TColor = longint;',
  2896. ' TRec = record h: TColor; end;',
  2897. ' TEnum = (red,green);',
  2898. 'var',
  2899. ' c: TColor;',
  2900. ' r: TRec;',
  2901. ' e: TEnum;']),
  2902. LinesToStr([
  2903. '']));
  2904. StartUnit(true);
  2905. Add([
  2906. 'interface',
  2907. 'uses unit2;',
  2908. 'var',
  2909. ' i: system.longint;',
  2910. ' e2: TEnum;',
  2911. 'implementation',
  2912. 'initialization',
  2913. ' c:=1;',
  2914. ' r.h:=2;',
  2915. ' e:=red;',
  2916. 'end.',
  2917. '']);
  2918. WriteReadUnit;
  2919. end;
  2920. procedure TTestPrecompile.TestPC_UseUnit_Class;
  2921. begin
  2922. AddModuleWithIntfImplSrc('unit2.pp',
  2923. LinesToStr([
  2924. 'type',
  2925. ' TObject = class',
  2926. ' private',
  2927. ' FA: longint;',
  2928. ' public',
  2929. ' type',
  2930. ' TEnum = (red,green);',
  2931. ' public',
  2932. ' i: longint;',
  2933. ' e: TEnum;',
  2934. ' procedure DoIt; virtual; abstract;',
  2935. ' property A: longint read FA write FA;',
  2936. ' end;',
  2937. 'var',
  2938. ' o: TObject;']),
  2939. LinesToStr([
  2940. '']));
  2941. StartUnit(true);
  2942. Add([
  2943. 'interface',
  2944. 'uses unit2;',
  2945. 'var',
  2946. ' b: TObject;',
  2947. 'implementation',
  2948. 'initialization',
  2949. ' o.DoIt;',
  2950. ' o.i:=b.A;',
  2951. ' o.e:=red;',
  2952. 'end.',
  2953. '']);
  2954. WriteReadUnit;
  2955. end;
  2956. procedure TTestPrecompile.TestPC_UseIndirectUnit;
  2957. begin
  2958. AddModuleWithIntfImplSrc('unit2.pp',
  2959. LinesToStr([
  2960. 'type',
  2961. ' TObject = class',
  2962. ' public',
  2963. ' i: longint;',
  2964. ' end;']),
  2965. LinesToStr([
  2966. '']));
  2967. AddModuleWithIntfImplSrc('unit1.pp',
  2968. LinesToStr([
  2969. 'uses unit2;',
  2970. 'var o: TObject;']),
  2971. LinesToStr([
  2972. '']));
  2973. StartUnit(true);
  2974. Add([
  2975. 'interface',
  2976. 'uses unit1;',
  2977. 'implementation',
  2978. 'initialization',
  2979. ' o.i:=3;',
  2980. 'end.',
  2981. '']);
  2982. WriteReadUnit;
  2983. end;
  2984. Initialization
  2985. RegisterTests([TTestPrecompile]);
  2986. RegisterPCUFormat;
  2987. end.