12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993 |
- {
- This file is part of the Free Component Library
- Pascal parse tree classes
- Copyright (c) 2000-2005 by
- Areca Systems GmbH / Sebastian Guenther, [email protected]
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$IFNDEF FPC_DOTTEDUNITS}
- unit PasTree;
- {$ENDIF FPC_DOTTEDUNITS}
- {$i fcl-passrc.inc}
- interface
- {$IFDEF FPC_DOTTEDUNITS}
- uses System.SysUtils, System.Classes;
- {$ELSE FPC_DOTTEDUNITS}
- uses SysUtils, Classes;
- {$ENDIF FPC_DOTTEDUNITS}
- resourcestring
- // Parse tree node type names
- SPasTreeElement = 'generic element';
- SPasTreeSection = 'unit section';
- SPasTreeProgramSection = 'program section';
- SPasTreeLibrarySection = 'library section';
- SPasTreeInterfaceSection = 'interface section';
- SPasTreeImplementationSection = 'implementation section';
- SPasTreeUsesUnit = 'uses unit';
- SPasTreeModule = 'module';
- SPasTreeUnit = 'unit';
- SPasTreeProgram = 'program';
- SPasTreePackage = 'package';
- SPasTreeResString = 'resource string';
- SPasTreeType = 'generic type';
- SPasTreePointerType = 'pointer type';
- SPasTreeAliasType = 'alias type';
- SPasTreeTypeAliasType = '"type" alias type';
- SPasTreeClassOfType = '"class of" type';
- SPasTreeRangeType = 'range type';
- SPasTreeArrayType = 'array type';
- SPasTreeFileType = 'file type';
- SPasTreeEnumValue = 'enumeration value';
- SPasTreeEnumType = 'enumeration type';
- SPasTreeSetType = 'set type';
- SPasTreeRecordType = 'record type';
- SPasStringType = 'string type';
- SPasTreeObjectType = 'object';
- SPasTreeClassType = 'class';
- SPasTreeInterfaceType = 'interface';
- SPasTreeSpecializedType = 'specialized class type';
- SPasTreeSpecializedExpr = 'specialize expr';
- SPasClassHelperType = 'class helper type';
- SPasRecordHelperType = 'record helper type';
- SPasTypeHelperType = 'type helper type';
- SPasTreeArgument = 'argument';
- SPasTreeProcedureType = 'procedure type';
- SPasTreeResultElement = 'function result';
- SPasTreeConstructorType = 'constructor type';
- SPasTreeDestructorType = 'destructor type';
- SPasTreeFunctionType = 'function type';
- SPasTreeUnresolvedTypeRef = 'unresolved type reference';
- SPasTreeVariable = 'variable';
- SPasTreeConst = 'constant';
- SPasTreeProperty = 'property';
- SPasTreeOverloadedProcedure = 'overloaded procedure';
- SPasTreeProcedure = 'procedure';
- SPasTreeFunction = 'function';
- SPasTreeOperator = 'operator';
- SPasTreeClassOperator = 'class operator';
- SPasTreeClassProcedure = 'class procedure';
- SPasTreeClassFunction = 'class function';
- SPasTreeClassConstructor = 'class constructor';
- SPasTreeClassDestructor = 'class destructor';
- SPasTreeConstructor = 'constructor';
- SPasTreeDestructor = 'destructor';
- SPasTreeAnonymousProcedure = 'anonymous procedure';
- SPasTreeAnonymousFunction = 'anonymous function';
- SPasTreeProcedureImpl = 'procedure/function implementation';
- SPasTreeConstructorImpl = 'constructor implementation';
- SPasTreeDestructorImpl = 'destructor implementation';
- type
- EPasTree = Class(Exception);
- TPastreeString = string;
- // Visitor pattern.
- TPassTreeVisitor = class;
- { TPasElementBase }
- TPasElementBase = class
- private
- FData: TObject;
- protected
- procedure Accept(Visitor: TPassTreeVisitor); virtual;
- public
- Property CustomData: TObject Read FData Write FData;
- end;
- TPasElementBaseClass = class of TPasElementBase;
- TPasModule = class;
- TPasMemberVisibility = (visDefault, visPrivate, visProtected, visPublic,
- visPublished, visAutomated,
- visStrictPrivate, visStrictProtected,
- visRequired, visOptional);
- TCallingConvention = (ccDefault,ccRegister,ccPascal,ccCDecl,ccStdCall,
- ccOldFPCCall,ccSafeCall,ccSysCall,ccMWPascal,
- ccHardFloat,ccSysV_ABI_Default,ccSysV_ABI_CDecl,
- ccMS_ABI_Default,ccMS_ABI_CDecl,
- ccVectorCall);
- TProcTypeModifier = (ptmOfObject,ptmIsNested,ptmStatic,ptmVarargs,
- ptmReferenceTo,ptmAsync,ptmFar,ptmCblock);
- TProcTypeModifiers = set of TProcTypeModifier;
- TPackMode = (pmNone,pmPacked,pmBitPacked);
- TPasMemberVisibilities = set of TPasMemberVisibility;
- TPasMemberHint = (hDeprecated,hLibrary,hPlatform,hExperimental,hUnimplemented);
- TPasMemberHints = set of TPasMemberHint;
- TPasElement = class;
- TPTreeElement = class of TPasElement;
- TPasElementArray = array of TPasElement;
- TOnForEachPasElement = procedure(El: TPasElement; arg: pointer) of object;
- { TPasElement }
- TPasElement = class(TPasElementBase)
- private
- FDocComment: TPasTreeString;
- FName: TPasTreeString;
- FParent: TPasElement;
- FHints: TPasMemberHints;
- FHintMessage: TPasTreeString;
- {$ifdef pas2js}
- FPasElementId: NativeInt;
- class var FLastPasElementId: NativeInt;
- {$endif}
- protected
- procedure ProcessHints(const ASemiColonPrefix: boolean; var AResult: TPasTreeString); virtual;
- procedure SetParent(const AValue: TPasElement); virtual;
- public
- SourceFilename: TPasTreeString;
- SourceLinenumber: Integer;
- SourceEndLinenumber: Integer;
- Visibility: TPasMemberVisibility;
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); virtual;
- destructor Destroy; override;
- Class Function IsKeyWord(Const S : TPasTreeString) : Boolean;
- Class Function EscapeKeyWord(Const S : TPasTreeString) : TPasTreeString;
- function FreeChild(Child: TPasElement; Prepare: boolean): TPasElement;
- procedure FreeChildList(List: TFPList; Prepare: boolean);
- procedure FreeChildArray(A: TPasElementArray; Prepare: boolean);
- procedure FreeChildren(Prepare: boolean); virtual;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); virtual;
- procedure ForEachChildCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer; Child: TPasElement; CheckParent: boolean); virtual;
- Function SafeName : TPasTreeString; virtual; // Name but with & prepended if name is a keyword.
- function FullPath: TPasTreeString; // parent's names, until parent is not TPasDeclarations
- function ParentPath: TPasTreeString; // parent's names
- function FullName: TPasTreeString; virtual; // FullPath + Name
- function PathName: TPasTreeString; virtual; // = Module.Name + ParentPath
- function GetModule: TPasModule;
- function ElementTypeName: TPasTreeString; virtual;
- Function HintsString : TPasTreeString;
- function GetDeclaration(full : Boolean) : TPasTreeString; virtual;
- procedure Accept(Visitor: TPassTreeVisitor); override;
- procedure ClearTypeReferences(aType: TPasElement); virtual;
- function HasParent(aParent: TPasElement): boolean;
- property Name: TPasTreeString read FName write FName;
- property Parent: TPasElement read FParent Write SetParent;
- property Hints : TPasMemberHints Read FHints Write FHints;
- property HintMessage : TPasTreeString Read FHintMessage Write FHintMessage;
- property DocComment : TPasTreeString Read FDocComment Write FDocComment;
- {$ifdef pas2js}
- property PasElementId: NativeInt read FPasElementId; // global unique id
- {$endif}
- end;
- TPasExprKind = (pekIdent, pekNumber, pekString, pekStringMultiLine, pekSet,
- pekNil, pekBoolConst,
- pekRange, pekUnary, pekBinary, pekFuncParams, pekArrayParams, pekListOfExp,
- pekInherited, pekSelf, pekSpecialize, pekProcedure);
- TExprOpCode = (eopNone,
- eopAdd,eopSubtract,eopMultiply,eopDivide{/}, eopDiv{div},eopMod, eopPower,// arithmetic
- eopShr,eopShl, // bit operations
- eopNot,eopAnd,eopOr,eopXor, // logical/bit
- eopEqual, eopNotEqual, // Logical
- eopLessThan,eopGreaterThan, eopLessthanEqual,eopGreaterThanEqual, // ordering
- eopIn,eopIs,eopAs, eopSymmetricaldifference, // Specials
- eopAddress, eopDeref, eopMemAddress, // Pointers eopMemAddress=**
- eopSubIdent); // SomeRec.A, A is subIdent of SomeRec
- { TPasExpr }
- TPasExpr = class(TPasElement)
- Kind : TPasExprKind;
- OpCode : TExprOpCode;
- Format1,Format2 : TPasExpr; // write, writeln, str
- constructor Create(AParent : TPasElement; AKind: TPasExprKind; AOpCode: TExprOpCode); virtual; overload;
- procedure FreeChildren(Prepare: boolean); override;
- end;
- { TUnaryExpr }
- TUnaryExpr = class(TPasExpr)
- Operand : TPasExpr;
- constructor Create(AParent : TPasElement; AOperand: TPasExpr; AOpCode: TExprOpCode); overload;
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- { TBinaryExpr }
- TBinaryExpr = class(TPasExpr)
- Left : TPasExpr;
- Right : TPasExpr;
- constructor Create(AParent : TPasElement; xleft, xright: TPasExpr; AOpCode: TExprOpCode); overload;
- constructor CreateRange(AParent : TPasElement; xleft, xright: TPasExpr); overload;
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- class function IsRightSubIdent(El: TPasElement): boolean;
- end;
- { TPrimitiveExpr }
- TPrimitiveExpr = class(TPasExpr)
- Value : TPasTreeString;
- constructor Create(AParent : TPasElement; AKind: TPasExprKind; const AValue : TPasTreeString); overload;
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- end;
-
- { TBoolConstExpr }
- TBoolConstExpr = class(TPasExpr)
- Value : Boolean;
- constructor Create(AParent : TPasElement; AKind: TPasExprKind; const ABoolValue : Boolean); overload;
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- end;
- { TNilExpr }
- TNilExpr = class(TPasExpr)
- constructor Create(AParent : TPasElement); overload;
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- end;
- { TInheritedExpr }
- TInheritedExpr = class(TPasExpr)
- Public
- constructor Create(AParent : TPasElement); overload;
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- end;
- { TSelfExpr }
- TSelfExpr = class(TPasExpr)
- constructor Create(AParent : TPasElement); overload;
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- end;
- TPasExprArray = array of TPasExpr;
- { TParamsExpr - source position is the opening bracket }
- TParamsExpr = class(TPasExpr)
- Value : TPasExpr;
- Params : TPasExprArray;
- // Kind: pekArrayParams, pekFuncParams, pekSet
- constructor Create(AParent : TPasElement; AKind: TPasExprKind); overload;
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddParam(xp: TPasExpr);
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- { TRecordValues }
- TRecordValuesItem = record
- Name : TPasTreeString;
- NameExp : TPrimitiveExpr;
- ValueExp : TPasExpr;
- end;
- PRecordValuesItem = ^TRecordValuesItem;
- TRecordValuesItemArray = array of TRecordValuesItem;
- TRecordValues = class(TPasExpr)
- Fields : TRecordValuesItemArray;
- constructor Create(AParent : TPasElement); overload;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddField(AName: TPrimitiveExpr; Value: TPasExpr);
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- { TArrayValues }
- TArrayValues = class(TPasExpr)
- Values : TPasExprArray;
- constructor Create(AParent : TPasElement); overload;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddValues(AValue: TPasExpr);
- function GetDeclaration(full : Boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- { TPasDeclarations - base class of TPasSection, TProcedureBody }
- TPasDeclarations = class(TPasElement)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Declarations: TFPList; // list of TPasElement
- // Declarations contains all the following:
- Attributes, // TPasAttributes
- Classes, // TPasClassType, TPasRecordType
- Consts, // TPasConst
- ExportSymbols,// TPasExportSymbol
- Functions, // TPasProcedure
- Properties, // TPasProperty
- ResStrings, // TPasResString
- Labels, // TPasLabel
- Types, // TPasType, except TPasClassType, TPasRecordType
- Variables // TPasVariable, not descendants
- : TFPList;
- end;
- { TPasUsesUnit - Parent is TPasSection }
- TPasUsesUnit = class(TPasElement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Expr: TPasExpr; // name expression
- InFilename: TPrimitiveExpr; // Kind=pekString, can be nil
- Module: TPasElement; // TPasUnresolvedUnitRef or TPasModule
- end;
- TPasUsesClause = array of TPasUsesUnit;
- { TPasSection }
- TPasSection = class(TPasDeclarations)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function AddUnitToUsesList(const AUnitName: TPasTreeString; aName: TPasExpr = nil;
- InFilename: TPrimitiveExpr = nil; aModule: TPasElement = nil;
- UsesUnit: TPasUsesUnit = nil): TPasUsesUnit;
- function ElementTypeName: TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- UsesList: TFPList; // kept for compatibility, see TPasUsesUnit.Module
- UsesClause: TPasUsesClause;
- PendingUsedIntf: TPasUsesUnit; // <>nil while resolving a uses cycle
- end;
- TPasSectionClass = class of TPasSection;
- { TInterfaceSection }
- TInterfaceSection = class(TPasSection)
- public
- function ElementTypeName: TPasTreeString; override;
- end;
- { TImplementationSection }
- TImplementationSection = class(TPasSection)
- public
- function ElementTypeName: TPasTreeString; override;
- end;
- { TProgramSection }
- TProgramSection = class(TImplementationSection)
- public
- function ElementTypeName: TPasTreeString; override;
- end;
- { TLibrarySection }
- TLibrarySection = class(TImplementationSection)
- public
- function ElementTypeName: TPasTreeString; override;
- end;
- TPasImplCommandBase = class;
- TInitializationSection = class;
- TFinalizationSection = class;
- { TPasModule }
- TPasModule = class(TPasElement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- GlobalDirectivesSection: TPasImplCommandBase; // not used by pparser
- InterfaceSection: TInterfaceSection;
- ImplementationSection: TImplementationSection;
- InitializationSection: TInitializationSection; // in TPasProgram the begin..end.
- FinalizationSection: TFinalizationSection;
- PackageName: TPasTreeString;
- Filename : TPasTreeString; // the IN filename, only written when not empty.
- end;
- TPasModuleClass = class of TPasModule;
- { TPasUnitModule }
- TPasUnitModule = Class(TPasModule)
- function ElementTypeName: TPasTreeString; override;
- end;
- { TPasProgram }
- TPasProgram = class(TPasModule)
- Public
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- Public
- ProgramSection: TProgramSection;
- InputFile,OutPutFile : TPasTreeString;
- // Note: the begin..end. block is in the InitializationSection
- end;
- { TPasLibrary }
- TPasLibrary = class(TPasModule)
- Public
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- Public
- LibrarySection: TLibrarySection;
- InputFile,OutPutFile : TPasTreeString;
- end;
- { TPasPackage }
- TPasPackage = class(TPasElement)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Modules: TFPList; // List of TPasModule objects
- end;
- { TPasResString }
- TPasResString = class(TPasElement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : Boolean) : TPasTreeString; Override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Expr: TPasExpr;
- end;
- { TPasType }
- TPasType = class(TPasElement)
- Protected
- Function FixTypeDecl(aDecl: TPasTreeString) : TPasTreeString;
- public
- Function SafeName : TPasTreeString; override;
- function ElementTypeName: TPasTreeString; override;
- end;
- TPasTypeArray = array of TPasType;
- { TPasAliasType }
- TPasAliasType = class(TPasType)
- public
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : Boolean): TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- public
- DestType: TPasType;
- SubType: TPasType;
- Expr: TPasExpr;
- CodepageExpr: TPasExpr;
- end;
- { TPasPointerType - todo: change it TPasAliasType }
- TPasPointerType = class(TPasType)
- public
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : Boolean): TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- public
- DestType: TPasType;
- end;
- { TPasTypeAliasType }
- TPasTypeAliasType = class(TPasAliasType)
- public
- function ElementTypeName: TPasTreeString; override;
- end;
- { TPasGenericTemplateType - type param of a generic }
- TPasGenericTemplateType = Class(TPasType)
- public
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- procedure AddConstraint(El: TPasElement);
- procedure ClearTypeReferences(aType: TPasElement); override;
- Public
- TypeConstraint: TPasTreeString deprecated; // deprecated in fpc 3.3.1
- Constraints: TPasElementArray; // list of TPasExpr or TPasType, can be nil!
- end;
- { TPasGenericType - abstract base class for all types which can be generics }
- TPasGenericType = class(TPasType)
- public
- GenericTemplateTypes: TFPList; // list of TPasGenericTemplateType, can be nil
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- procedure SetGenericTemplates(AList: TFPList); virtual;
- end;
- { TPasSpecializeType DestType<Params> }
- TPasSpecializeType = class(TPasAliasType)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full: boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Params: TFPList; // list of TPasType or TPasExpr
- end;
- { TInlineSpecializeExpr - A<B,C> }
- TInlineSpecializeExpr = class(TPasExpr)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : Boolean): TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- NameExpr: TPasExpr;
- Params: TFPList; // list of TPasType
- end;
- { TPasClassOfType }
- TPasClassOfType = class(TPasAliasType)
- public
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full: boolean) : TPasTreeString; override;
- end;
- { TPasRangeType }
- TPasRangeType = class(TPasType)
- public
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- RangeExpr : TBinaryExpr; // Kind=pekRange
- procedure FreeChildren(Prepare: boolean); override;
- Function RangeStart : TPasTreeString;
- Function RangeEnd : TPasTreeString;
- end;
- { TPasArrayType }
- TPasArrayType = class(TPasGenericType)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- public
- IndexRange : TPasTreeString; // only valid if Parser po_arrayrangeexpr disabled
- Ranges: TPasExprArray; // only valid if Parser po_arrayrangeexpr enabled
- PackMode : TPackMode;
- ElType: TPasType; // nil means array-of-const
- function IsGenericArray : Boolean; inline;
- function IsPacked : Boolean; inline;
- procedure AddRange(Range: TPasExpr);
- end;
- { TPasFileType }
- TPasFileType = class(TPasType)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- ElType: TPasType;
- end;
- { TPasEnumValue - Parent is TPasEnumType }
- TPasEnumValue = class(TPasElement)
- public
- function ElementTypeName: TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Value: TPasExpr;
- procedure FreeChildren(Prepare: boolean); override;
- Function AssignedValue : TPasTreeString;
- end;
- { TPasEnumType }
- TPasEnumType = class(TPasType)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- Procedure GetEnumNames(Names : TStrings);
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Values: TFPList; // List of TPasEnumValue
- end;
- { TPasSetType }
- TPasSetType = class(TPasType)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- EnumType: TPasType; // alias or enumtype
- IsPacked : Boolean;
- end;
- TPasRecordType = class;
- { TPasVariant }
- TPasVariant = class(TPasElement)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Values: TFPList; // list of TPasExpr
- Members: TPasRecordType;
- end;
- { TPasMembersType - base type for TPasRecordType and TPasClassType }
- TPasMembersType = class(TPasGenericType)
- public
- PackMode: TPackMode;
- Members: TFPList;
- Constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- Destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- Function IsPacked: Boolean; inline;
- Function IsBitPacked : Boolean; inline;
- Procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- { TPasRecordType }
- TPasRecordType = class(TPasMembersType)
- private
- procedure GetMembers(S: TStrings);
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- VariantEl: TPasElement; // nil or TPasVariable or TPasType
- Variants: TFPList; // list of TPasVariant elements, may be nil!
- Function IsAdvancedRecord : Boolean;
- end;
- TPasObjKind = (
- okObject, okClass, okInterface,
- // okGeneric removed in FPC 3.3.1 check instead GenericTemplateTypes<>nil
- // okSpecialize removed in FPC 3.1.1
- okClassHelper, okRecordHelper, okTypeHelper,
- okDispInterface, okObjcClass, okObjcCategory,
- okObjcProtocol);
- const
- okWithFields = [okObject, okClass, okObjcClass, okObjcCategory];
- okAllHelpers = [okClassHelper,okRecordHelper,okTypeHelper];
- okWithClassFields = okWithFields+okAllHelpers;
- okObjCClasses = [okObjcClass, okObjcCategory, okObjcProtocol];
- type
- TPasClassInterfaceType = (
- citCom, // default
- citCorba
- );
- { TPasClassType }
- TPasClassType = class(TPasMembersType)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- function ElementTypeName: TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- ObjKind: TPasObjKind;
- AncestorType: TPasType; // TPasClassType or TPasUnresolvedTypeRef or TPasAliasType or TPasTypeAliasType
- // Note: AncestorType can be nil even though it has a default ancestor
- HelperForType: TPasType; // any type, except helper
- IsForward: Boolean;
- IsExternal : Boolean;
- IsShortDefinition: Boolean;//class(anchestor); without end
- GUIDExpr : TPasExpr;
- Modifiers: TStringList;
- Interfaces : TFPList; // list of TPasType
- ExternalNameSpace : TPasTreeString;
- ExternalName : TPasTreeString;
- InterfaceType: TPasClassInterfaceType;
- Function IsObjCClass : Boolean;
- Function FindMember(MemberClass : TPTreeElement; Const MemberName : TPasTreeString) : TPasElement;
- Function FindMemberInAncestors(MemberClass : TPTreeElement; Const MemberName : TPasTreeString) : TPasElement;
- Function InterfaceGUID : TPasTreeString;
- Function IsSealed : Boolean;
- Function IsAbstract : Boolean;
- Function HasModifier(const aModifier: TPasTreeString): Boolean;
- end;
- TArgumentAccess = (argDefault, argConst, argVar, argOut, argConstRef);
- { TPasArgument }
- TPasArgument = class(TPasElement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Access: TArgumentAccess;
- ArgType: TPasType; // can be nil, when Access<>argDefault
- ValueExpr: TPasExpr; // the default value
- Function Value : TPasTreeString;
- end;
- { TPasProcedureType }
- TPasProcedureType = class(TPasGenericType)
- private
- function GetIsAsync: Boolean; inline;
- function GetIsNested: Boolean; inline;
- function GetIsOfObject: Boolean; inline;
- function GetIsReference: Boolean; inline;
- procedure SetIsAsync(const AValue: Boolean);
- procedure SetIsNested(const AValue: Boolean);
- procedure SetIsOfObject(const AValue: Boolean);
- procedure SetIsReference(AValue: Boolean);
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- class function TypeName: TPasTreeString; virtual;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure GetArguments(List : TStrings);
- function CreateArgument(const AName, AUnresolvedTypeName: TPasTreeString): TPasArgument; // not used by TPasParser
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Args: TFPList; // List of TPasArgument objects
- CallingConvention: TCallingConvention;
- Modifiers: TProcTypeModifiers;
- VarArgsType: TPasType;
- property IsOfObject: Boolean read GetIsOfObject write SetIsOfObject;
- property IsNested : Boolean read GetIsNested write SetIsNested;
- property IsReferenceTo : Boolean Read GetIsReference write SetIsReference;
- property IsAsync: Boolean read GetIsAsync write SetIsAsync;
- end;
- TPasProcedureTypeClass = class of TPasProcedureType;
- { TPasResultElement - parent is TPasFunctionType }
- TPasResultElement = class(TPasElement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- public
- ResultType: TPasType;
- end;
- { TPasFunctionType }
- TPasFunctionType = class(TPasProcedureType)
- public
- procedure FreeChildren(Prepare: boolean); override;
- class function TypeName: TPasTreeString; override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(Full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- ResultEl: TPasResultElement;
- end;
- TPasUnresolvedSymbolRef = class(TPasType)
- end;
- TPasUnresolvedTypeRef = class(TPasUnresolvedSymbolRef)
- public
- // Typerefs cannot be parented! -> AParent _must_ be NIL
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- function ElementTypeName: TPasTreeString; override;
- end;
- { TPasUnresolvedUnitRef }
- TPasUnresolvedUnitRef = Class(TPasUnresolvedSymbolRef)
- public
- FileName : TPasTreeString;
- function ElementTypeName: TPasTreeString; override;
- end;
- { TPasStringType - e.g. TPasTreeString[len] }
- TPasStringType = class(TPasUnresolvedTypeRef)
- public
- LengthExpr : TPasTreeString;
- CodePageExpr : TPasTreeString;
- function ElementTypeName: TPasTreeString; override;
- end;
- { TPasTypeRef - not used by TPasParser }
- TPasTypeRef = class(TPasUnresolvedTypeRef)
- public
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- RefType: TPasType;
- end;
- { TPasVariable }
- TVariableModifier = (vmCVar, vmExternal, vmPublic, vmExport, vmClass, vmStatic, vmfar);
- TVariableModifiers = set of TVariableModifier;
- TPasVariable = class(TPasElement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- public
- VarType: TPasType;
- VarModifiers : TVariableModifiers;
- LibraryName : TPasExpr; // libname of modifier external
- ExportName : TPasExpr; // symbol name of modifier external, export and public
- Modifiers : TPasTreeString;
- AbsoluteLocation : TPasTreeString deprecated; // deprecated in fpc 3.1.1
- AbsoluteExpr: TPasExpr;
- Expr: TPasExpr;
- Function Value : TPasTreeString;
- end;
- { TPasExportSymbol }
- TPasExportSymbol = class(TPasElement)
- public
- NameExpr: TPasExpr; // only if name is not a simple identifier
- ExportName : TPasExpr;
- ExportIndex : TPasExpr;
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- { TPasConst }
- TPasConst = class(TPasVariable)
- public
- IsConst: boolean; // true iff untyped const or typed with $WritableConst off
- function ElementTypeName: TPasTreeString; override;
- end;
- { TPasProperty }
- TPasProperty = class(TPasVariable)
- private
- FArgs: TFPList;
- FResolvedType : TPasType;
- function GetIsClass: boolean; inline;
- procedure SetIsClass(AValue: boolean);
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function GetDeclaration(full : boolean) : TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- IndexExpr: TPasExpr;
- ReadAccessor: TPasExpr;
- WriteAccessor: TPasExpr;
- DispIDExpr : TPasExpr; // Can be nil.
- Implements: TPasExprArray;
- StoredAccessor: TPasExpr;
- DefaultExpr: TPasExpr;
- ReadAccessorName: TPasTreeString; // not used by resolver
- WriteAccessorName: TPasTreeString; // not used by resolver
- ImplementsName: TPasTreeString; // not used by resolver
- StoredAccessorName: TPasTreeString; // not used by resolver
- DispIDReadOnly,
- IsDefault, IsNodefault: Boolean;
- property Args: TFPList read FArgs; // List of TPasArgument objects
- property IsClass: boolean read GetIsClass write SetIsClass;
- Function ResolvedType : TPasType;
- Function IndexValue : TPasTreeString;
- Function DefaultValue : TPasTreeString;
- end;
- { TPasAttributes }
- TPasAttributes = class(TPasElement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- procedure AddCall(Expr: TPasExpr);
- public
- Calls: TPasExprArray;
- end;
- TProcType = (ptProcedure, ptFunction,
- ptOperator, ptClassOperator,
- ptConstructor, ptDestructor,
- ptClassProcedure, ptClassFunction,
- ptClassConstructor, ptClassDestructor,
- ptAnonymousProcedure, ptAnonymousFunction);
- { TPasProcedureBase }
- TPasProcedureBase = class(TPasElement)
- public
- function TypeName: TPasTreeString; virtual; abstract;
- end;
- { TPasOverloadedProc - not used by resolver }
- TPasOverloadedProc = class(TPasProcedureBase)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Overloads: TFPList; // List of TPasProcedure nodes
- end;
- { TPasProcedure }
- TProcedureModifier = (pmVirtual, pmDynamic, pmAbstract, pmOverride,
- pmExport, pmOverload, pmMessage, pmReintroduce,
- pmInline, pmAssembler, pmPublic,
- pmCompilerProc, pmExternal, pmForward, pmDispId,
- pmNoReturn, pmFar, pmFinal, pmDiscardResult,
- pmNoStackFrame, pmsection, pmRtlProc, pmInternProc);
- TProcedureModifiers = Set of TProcedureModifier;
- TProcedureMessageType = (pmtNone,pmtInteger,pmtString);
- { TProcedureNamePart }
- TProcedureNamePart = class
- Name: TPasTreeString;
- Templates: TFPList; // optional list of TPasGenericTemplateType, can be nil!
- end;
- TProcedureNameParts = TFPList; // list of TProcedureNamePart
-
- TProcedureBody = class;
- { TPasProcedure - named procedure, not anonymous }
- TPasProcedure = class(TPasProcedureBase)
- Private
- FModifiers : TProcedureModifiers;
- FMessageName : TPasTreeString;
- FMessageType : TProcedureMessageType;
- function GetCallingConvention: TCallingConvention;
- procedure SetCallingConvention(AValue: TCallingConvention);
- public
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- function GetDeclaration(full: Boolean): TPasTreeString; override;
- procedure GetModifiers(List: TStrings);
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- PublicName, // e.g. public PublicName;
- LibrarySymbolIndex : TPasExpr;
- LibrarySymbolName,
- LibraryExpr : TPasExpr; // e.g. external LibraryExpr name LibrarySymbolName;
- DispIDExpr : TPasExpr;
- MessageExpr: TPasExpr;
- CompProcID : String;
- AliasName : TPasTreeString;
- ProcType : TPasProcedureType;
- Body : TProcedureBody;
- NameParts: TProcedureNameParts; // only used for generic aka parametrized functions
- Procedure AddModifier(AModifier : TProcedureModifier);
- Function CanParseImplementation : Boolean;
- Function HasNoImplementation : Boolean;
- Function IsVirtual : Boolean; inline;
- Function IsDynamic : Boolean; inline;
- Function IsAbstract : Boolean; inline;
- Function IsOverride : Boolean; inline;
- Function IsExported : Boolean; inline;
- Function IsExternal : Boolean; inline;
- Function IsOverload : Boolean; inline;
- Function IsMessage: Boolean; inline;
- Function IsReintroduced : Boolean; inline;
- Function IsStatic : Boolean; inline;
- Function IsForward: Boolean; inline;
- Function IsCompilerProc: Boolean; inline;
- Function IsInternProc: Boolean; inline;
- Function IsAssembler: Boolean; inline;
- Function IsAsync: Boolean; inline;
- Function GetProcTypeEnum: TProcType; virtual;
- procedure SetNameParts(Parts: TProcedureNameParts);
- Property Modifiers : TProcedureModifiers Read FModifiers Write FModifiers;
- Property CallingConvention : TCallingConvention Read GetCallingConvention Write SetCallingConvention;
- Property MessageName : TPasTreeString Read FMessageName Write FMessageName;
- property MessageType : TProcedureMessageType Read FMessageType Write FMessageType;
- end;
- TPasProcedureClass = class of TPasProcedure;
- TArrayOfPasProcedure = array of TPasProcedure;
- { TPasFunction - named function, not anonymous function}
- TPasFunction = class(TPasProcedure)
- private
- function GetFT: TPasFunctionType; inline;
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- Property FuncType : TPasFunctionType Read GetFT;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TPasOperator }
- TOperatorType = (
- otUnknown,
- otImplicit, otExplicit,
- otMul, otPlus, otMinus, otDivision,
- otLessThan, otEqual, otGreaterThan,
- otAssign, otNotEqual, otLessEqualThan, otGreaterEqualThan,
- otPower, otSymmetricalDifference,
- otInc, otDec,
- otMod,
- otNegative, otPositive,
- otBitWiseOr,
- otDiv,
- otLeftShift,
- otLogicalOr,
- otBitwiseAnd, otbitwiseXor,
- otLogicalAnd, otLogicalNot, otLogicalXor,
- otRightShift,
- otEnumerator, otIn,
- // Management operators
- otInitialize,
- otFinalize,
- otAddRef,
- otCopy
- );
- TOperatorTypes = set of TOperatorType;
- TPasOperator = class(TPasFunction)
- private
- FOperatorType: TOperatorType;
- FTokenBased: Boolean;
- function NameSuffix: TPasTreeString;
- public
- Class Function OperatorTypeToToken(T : TOperatorType) : TPasTreeString;
- Class Function OperatorTypeToOperatorName(T: TOperatorType) : TPasTreeString;
- Class Function TokenToOperatorType(S : TPasTreeString) : TOperatorType;
- Class Function NameToOperatorType(S : TPasTreeString) : TOperatorType;
- Procedure CorrectName;
- // For backwards compatibility the old name can still be used to search on.
- function GetOperatorDeclaration(Full: Boolean): TPasTreeString;
- Function OldName(WithPath : Boolean) : TPasTreeString;
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- function GetProcTypeEnum: TProcType; override;
- function GetDeclaration (full : boolean) : TPasTreeString; override;
- Property OperatorType : TOperatorType Read FOperatorType Write FOperatorType;
- // True if the declaration was using a token instead of an identifier
- Property TokenBased : Boolean Read FTokenBased Write FTokenBased;
- end;
- { TPasClassOperator }
- TPasClassOperator = class(TPasOperator)
- public
- function TypeName: TPasTreeString; override;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TPasConstructor }
- TPasConstructor = class(TPasProcedure)
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TPasClassConstructor }
- TPasClassConstructor = class(TPasConstructor)
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TPasDestructor }
- TPasDestructor = class(TPasProcedure)
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TPasClassDestructor }
- TPasClassDestructor = class(TPasDestructor)
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TPasClassProcedure }
- TPasClassProcedure = class(TPasProcedure)
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TPasClassFunction }
- TPasClassFunction = class(TPasFunction)
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TPasAnonymousProcedure - parent is TProcedureExpr }
- TPasAnonymousProcedure = class(TPasProcedure)
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TPasAnonymousFunction - parent is TProcedureExpr and ProcType is TPasFunctionType}
- TPasAnonymousFunction = class(TPasAnonymousProcedure)
- private
- function GetFT: TPasFunctionType; inline;
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- Property FuncType : TPasFunctionType Read GetFT;
- function GetProcTypeEnum: TProcType; override;
- end;
- { TProcedureExpr }
- TProcedureExpr = class(TPasExpr)
- public
- Proc: TPasAnonymousProcedure;
- constructor Create(AParent: TPasElement); overload;
- procedure FreeChildren(Prepare: boolean); override;
- function GetDeclaration(full: Boolean): TPasTreeString; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- { TPasMethodResolution }
- TPasMethodResolution = class(TPasElement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- ProcClass: TPasProcedureClass;
- InterfaceName: TPasExpr;
- InterfaceProc: TPasExpr;
- ImplementationProc: TPasExpr;
- end;
- TPasImplBlock = class;
- { TProcedureBody - the var+type+const+begin, without the header, child of TPasProcedure }
- TProcedureBody = class(TPasDeclarations)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Body: TPasImplBlock;
- end;
- { TPasProcedureImpl - used by mkxmlrpc, not by pparser }
- TPasProcedureImpl = class(TPasElement)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; virtual;
- public
- ProcType: TPasProcedureType;
- Locals: TFPList;
- Body: TPasImplBlock;
- IsClassMethod: boolean;
- end;
- { TPasConstructorImpl - used by mkxmlrpc, not by pparser }
- TPasConstructorImpl = class(TPasProcedureImpl)
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- end;
- { TPasDestructorImpl - used by mkxmlrpc, not by pparser }
- TPasDestructorImpl = class(TPasProcedureImpl)
- public
- function ElementTypeName: TPasTreeString; override;
- function TypeName: TPasTreeString; override;
- end;
- { TPasImplElement - implementation element }
- TPasImplElement = class(TPasElement)
- end;
- { TPasImplCommandBase }
- TPasImplCommandBase = class(TPasImplElement)
- public
- SemicolonAtEOL: boolean;
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- end;
- { TPasImplCommand - currently used as empty statement, e.g. if then else ; }
- TPasImplCommand = class(TPasImplCommandBase)
- public
- Command: TPasTreeString; // never set by TPasParser
- end;
- { TPasImplCommands - used by mkxmlrpc, not used by pparser }
- TPasImplCommands = class(TPasImplCommandBase)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- public
- Commands: TStrings;
- end;
- { TPasLabels }
- TPasLabels = class(TPasImplElement)
- public
- Labels: TStrings;
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- end;
- TPasImplBeginBlock = class;
- TPasImplRepeatUntil = class;
- TPasImplIfElse = class;
- TPasImplWhileDo = class;
- TPasImplWithDo = class;
- TPasImplCaseOf = class;
- TPasImplForLoop = class;
- TPasImplTry = class;
- TPasImplExceptOn = class;
- TPasImplRaise = class;
- TPasImplAssign = class;
- TPasImplSimple = class;
- TPasImplLabelMark = class;
- { TPasImplBlock }
- TPasImplBlock = class(TPasImplElement)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddElement(Element: TPasImplElement); virtual;
- function AddCommand(const ACommand: TPasTreeString): TPasImplCommand;
- function AddCommands: TPasImplCommands; // used by mkxmlrpc, not by pparser
- function AddBeginBlock: TPasImplBeginBlock;
- function AddRepeatUntil: TPasImplRepeatUntil;
- function AddIfElse(const ACondition: TPasExpr): TPasImplIfElse;
- function AddWhileDo(const ACondition: TPasExpr): TPasImplWhileDo;
- function AddWithDo(const Expression: TPasExpr): TPasImplWithDo;
- function AddCaseOf(const Expression: TPasExpr): TPasImplCaseOf;
- function AddForLoop(AVar: TPasVariable;
- const AStartValue, AEndValue: TPasExpr): TPasImplForLoop;
- function AddForLoop(AVarName : TPasExpr; AStartValue, AEndValue: TPasExpr;
- ADownTo: Boolean = false): TPasImplForLoop;
- function AddTry: TPasImplTry;
- function AddExceptOn(const VarName, TypeName: TPasTreeString): TPasImplExceptOn;
- function AddExceptOn(const VarName: TPasTreeString; VarType: TPasType): TPasImplExceptOn;
- function AddExceptOn(const VarEl: TPasVariable): TPasImplExceptOn;
- function AddExceptOn(const TypeEl: TPasType): TPasImplExceptOn;
- function AddRaise: TPasImplRaise;
- function AddLabelMark(const Id: TPasTreeString): TPasImplLabelMark;
- function AddAssign(Left, Right: TPasExpr): TPasImplAssign;
- function AddSimple(Expr: TPasExpr): TPasImplSimple;
- function CloseOnSemicolon: boolean; virtual;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Elements: TFPList; // list of TPasImplElement
- end;
- TPasImplBlockClass = class of TPasImplBlock;
- { TPasImplStatement - base class }
- TPasImplStatement = class(TPasImplBlock)
- public
- function CloseOnSemicolon: boolean; override;
- end;
- { TPasImplBeginBlock }
- TPasImplBeginBlock = class(TPasImplBlock)
- end;
- { TInitializationSection }
- TInitializationSection = class(TPasImplBlock)
- end;
- { TFinalizationSection }
- TFinalizationSection = class(TPasImplBlock)
- end;
- { TPasImplAsmStatement }
- TPasImplAsmStatement = class (TPasImplStatement)
- private
- FModifierTokens: TStrings;
- FTokens: TStrings;
- Public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- Property Tokens : TStrings Read FTokens;
- // ['register']
- Property ModifierTokens : TStrings Read FModifierTokens;
- end;
- { TPasImplRepeatUntil }
- TPasImplRepeatUntil = class(TPasImplBlock)
- public
- ConditionExpr : TPasExpr;
- procedure FreeChildren(Prepare: boolean); override;
- Function Condition: TPasTreeString;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- { TPasImplIfElse }
- TPasImplIfElse = class(TPasImplBlock)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddElement(Element: TPasImplElement); override;
- function CloseOnSemicolon: boolean; override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- ConditionExpr: TPasExpr;
- IfBranch: TPasImplElement;
- ElseBranch: TPasImplElement; // can be nil
- Function Condition: TPasTreeString;
- end;
- { TPasImplWhileDo }
- TPasImplWhileDo = class(TPasImplStatement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddElement(Element: TPasImplElement); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- ConditionExpr : TPasExpr;
- Body: TPasImplElement;
- function Condition: TPasTreeString;
- end;
- { TPasImplWithDo }
- TPasImplWithDo = class(TPasImplStatement)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddElement(Element: TPasImplElement); override;
- procedure AddExpression(const Expression: TPasExpr);
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Expressions: TFPList; // list of TPasExpr
- Body: TPasImplElement;
- end;
- { TPasInlineVarDeclStatement }
- TPasInlineVarDeclStatement = class(TPasImplStatement)
- public
- Declarations: TFPList; // list of TPasVariable
- Public
- constructor Create(const aName : TPasTreeString; aParent: TPasElement); override;
- procedure FreeChildren(Prepare: boolean); override;
- destructor Destroy; override;
- end;
- TPasImplCaseStatement = class;
- TPasImplCaseElse = class;
- { TPasImplCaseOf - Elements are TPasImplCaseStatement }
- TPasImplCaseOf = class(TPasImplBlock)
- public
- procedure FreeChildren(Prepare: boolean); override;
- function AddCase(const Expression: TPasExpr): TPasImplCaseStatement;
- function AddElse: TPasImplCaseElse;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- CaseExpr : TPasExpr;
- ElseBranch: TPasImplCaseElse; // this is also in Elements
- function Expression: TPasTreeString;
- end;
- { TPasImplCaseStatement }
- TPasImplCaseStatement = class(TPasImplStatement)
- public
- constructor Create(const AName: TPasTreeString; AParent: TPasElement); override;
- destructor Destroy; override;
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddElement(Element: TPasImplElement); override;
- procedure AddExpression(const Expr: TPasExpr);
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- Expressions: TFPList; // list of TPasExpr
- Body: TPasImplElement;
- end;
- { TPasImplCaseElse }
- TPasImplCaseElse = class(TPasImplBlock)
- end;
- { TPasImplForLoop
- - for VariableName in StartExpr do Body
- - for VariableName := StartExpr to EndExpr do Body }
- TLoopType = (ltNormal,ltDown,ltIn);
- TPasImplForLoop = class(TPasImplStatement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddElement(Element: TPasImplElement); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- VariableName : TPasExpr;
- LoopType : TLoopType;
- StartExpr : TPasExpr;
- EndExpr : TPasExpr; // if LoopType=ltIn this is nil
- Variable: TPasVariable; // not used by TPasParser
- VarType : TPasType; // For initialized variables
- ImplicitTyped : Boolean;
- Body: TPasImplElement;
- Function Down: boolean; inline;// downto, backward compatibility
- Function StartValue : TPasTreeString;
- Function EndValue: TPasTreeString;
- end;
- { TPasImplAssign }
- TAssignKind = (akDefault,akAdd,akMinus,akMul,akDivision);
- TPasImplAssign = class (TPasImplStatement)
- public
- Left : TPasExpr;
- Right : TPasExpr;
- Kind : TAssignKind;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- { TPasImplSimple }
- TPasImplSimple = class (TPasImplStatement)
- public
- Expr : TPasExpr;
- procedure FreeChildren(Prepare: boolean); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- end;
- TPasImplTryHandler = class;
- TPasImplTryFinally = class;
- TPasImplTryExcept = class;
- TPasImplTryExceptElse = class;
- { TPasImplTry }
- TPasImplTry = class(TPasImplBlock)
- public
- procedure FreeChildren(Prepare: boolean); override;
- function AddFinally: TPasImplTryFinally;
- function AddExcept: TPasImplTryExcept;
- function AddExceptElse: TPasImplTryExceptElse;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- public
- FinallyExcept: TPasImplTryHandler; // not in Elements
- ElseBranch: TPasImplTryExceptElse; // not in Elements
- end;
- TPasImplTryHandler = class(TPasImplBlock)
- end;
- { TPasImplTryFinally }
- TPasImplTryFinally = class(TPasImplTryHandler)
- end;
- { TPasImplTryExcept }
- TPasImplTryExcept = class(TPasImplTryHandler)
- end;
- { TPasImplTryExceptElse }
- TPasImplTryExceptElse = class(TPasImplTryHandler)
- end;
- { TPasImplExceptOn - Parent is TPasImplTryExcept }
- TPasImplExceptOn = class(TPasImplStatement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure AddElement(Element: TPasImplElement); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- procedure ClearTypeReferences(aType: TPasElement); override;
- public
- VarEl: TPasVariable; // can be nil
- TypeEl : TPasType; // if VarEl<>nil then TypeEl=VarEl.VarType
- Body: TPasImplElement;
- Function VariableName : TPasTreeString;
- Function TypeName: TPasTreeString;
- end;
- { TPasImplRaise }
- TPasImplRaise = class(TPasImplStatement)
- public
- procedure FreeChildren(Prepare: boolean); override;
- procedure ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer); override;
- Public
- ExceptObject,
- ExceptAddr : TPasExpr;
- end;
- { TPasImplLabelMark }
- TPasImplLabelMark = class(TPasImplElement)
- public
- LabelId: TPasTreeString;
- end;
- { TPasImplGoto }
- TPasImplGoto = class(TPasImplStatement)
- public
- LabelName: TPasTreeString;
- end;
- { TPassTreeVisitor }
- TPassTreeVisitor = class
- public
- procedure Visit(obj: TPasElement); virtual;
- end;
- const
- AccessNames: array[TArgumentAccess] of TPasTreeString = ('', 'const ', 'var ', 'out ','constref ');
- AccessDescriptions: array[TArgumentAccess] of TPasTreeString = ('default', 'const', 'var', 'out','constref');
- AllVisibilities: TPasMemberVisibilities =
- [visDefault, visPrivate, visProtected, visPublic,
- visPublished, visAutomated];
- VisibilityNames: array[TPasMemberVisibility] of TPasTreeString = (
- 'default','private', 'protected', 'public', 'published', 'automated',
- 'strict private', 'strict protected','required','optional');
- ObjKindNames: array[TPasObjKind] of TPasTreeString = (
- 'object', 'class', 'interface',
- 'class helper','record helper','type helper',
- 'dispinterface', 'ObjcClass', 'ObjcCategory',
- 'ObjcProtocol');
- InterfaceTypeNames: array[TPasClassInterfaceType] of TPasTreeString = (
- 'COM',
- 'Corba'
- );
- ExprKindNames : Array[TPasExprKind] of TPasTreeString = (
- 'Ident',
- 'Number',
- 'String',
- 'StringMultiLine',
- 'Set',
- 'Nil',
- 'BoolConst',
- 'Range',
- 'Unary',
- 'Binary',
- 'FuncParams',
- 'ArrayParams',
- 'ListOfExp',
- 'Inherited',
- 'Self',
- 'Specialize',
- 'Procedure');
- OpcodeStrings : Array[TExprOpCode] of TPasTreeString = (
- '','+','-','*','/','div','mod','**',
- 'shr','shl',
- 'not','and','or','xor',
- '=','<>',
- '<','>','<=','>=',
- 'in','is','as','><',
- '@','^','@@',
- '.');
- UnaryOperators = [otImplicit,otExplicit,otAssign,otNegative,otPositive,otEnumerator];
- OperatorTokens : Array[TOperatorType] of TPasTreeString
- = ('','','','*','+','-','/','<','=',
- '>',':=','<>','<=','>=','**',
- '><','Inc','Dec','mod','-','+','Or','div',
- 'shl','or','and','xor','and','not','xor',
- 'shr','enumerator','in','','','','');
- OperatorNames : Array[TOperatorType] of TPasTreeString
- = ('','implicit','explicit','multiply','add','subtract','divide','lessthan','equal',
- 'greaterthan','assign','notequal','lessthanorequal','greaterthanorequal','power',
- 'symmetricaldifference','inc','dec','modulus','negative','positive','bitwiseor','intdivide',
- 'leftshift','logicalor','bitwiseand','bitwisexor','logicaland','logicalnot','logicalxor',
- 'rightshift','enumerator','in','initialize','finalize','addref','copy');
- AssignKindNames : Array[TAssignKind] of TPasTreeString = (':=','+=','-=','*=','/=' );
- cPasMemberHint : Array[TPasMemberHint] of TPasTreeString =
- ( 'deprecated', 'library', 'platform', 'experimental', 'unimplemented' );
- cCallingConventions : Array[TCallingConvention] of TPasTreeString =
- ( '', 'Register','Pascal','cdecl','stdcall','OldFPCCall','safecall','SysCall','MWPascal',
- 'HardFloat','SysV_ABI_Default','SysV_ABI_CDecl',
- 'MS_ABI_Default','MS_ABI_CDecl',
- 'VectorCall');
- ProcTypeModifiers : Array[TProcTypeModifier] of TPasTreeString =
- ('of Object', 'is nested','static','varargs','reference to','async','far','cblock');
- ModifierNames : Array[TProcedureModifier] of TPasTreeString
- = ('virtual', 'dynamic','abstract', 'override',
- 'export', 'overload', 'message', 'reintroduce',
- 'inline','assembler','public',
- 'compilerproc','external','forward','dispid',
- 'noreturn','far','final','discardresult','nostackframe',
- 'section','rtlproc','internproc');
- VariableModifierNames : Array[TVariableModifier] of TPasTreeString
- = ('cvar', 'external', 'public', 'export', 'class', 'static','far');
- procedure FreeProcNameParts(var NameParts: TProcedureNameParts);
- procedure FreePasExprArray(Parent: TPasElement; var A: TPasExprArray; Prepare: boolean);
- function GenericTemplateTypesAsString(List: TFPList): TPasTreeString;
- function dbgs(const s: TProcTypeModifiers): TPasTreeString; overload;
- function WritePasElTree(Expr: TPasExpr; FollowPrefix: TPasTreeString = ''): TPasTreeString;
- function GetPasElementDesc(El: TPasElement): TPasTreeString;
- {$IFDEF HasPTDumpStack}
- procedure PTDumpStack;
- function GetPTDumpStack: TPasTreeString;
- {$ENDIF}
- implementation
- procedure FreeProcNameParts(var NameParts: TProcedureNameParts);
- var
- i: Integer;
- p: TProcedureNamePart;
- begin
- if NameParts=nil then exit;
- for i:=0 to NameParts.Count-1 do
- begin
- p:=TProcedureNamePart(NameParts[i]);
- p.Templates.Free;
- p.Free;
- end;
- NameParts.Free;
- NameParts:=nil;
- end;
- procedure FreePasExprArray(Parent: TPasElement; var A: TPasExprArray;
- Prepare: boolean);
- var
- i: Integer;
- begin
- for i:=0 to High(A) do
- Parent.FreeChild(A[i],Prepare);
- A:=nil;
- end;
- function GenericTemplateTypesAsString(List: TFPList): TPasTreeString;
- var
- i, j: Integer;
- T: TPasGenericTemplateType;
- begin
- Result:='';
- for i:=0 to List.Count-1 do
- begin
- if i>0 then
- Result:=Result+',';
- T:=TPasGenericTemplateType(List[i]);
- Result:=Result+T.Name;
- if length(T.Constraints)>0 then
- begin
- Result:=Result+':';
- for j:=0 to length(T.Constraints)-1 do
- begin
- if j>0 then
- Result:=Result+',';
- Result:=Result+T.GetDeclaration(false);
- end;
- end;
- end;
- Result:='<'+Result+'>';
- end;
- function dbgs(const s: TProcTypeModifiers): TPasTreeString;
- var
- m: TProcTypeModifier;
- begin
- Result:='';
- for m in s do
- begin
- if Result<>'' then Result:=Result+',';
- Result:=Result+ProcTypeModifiers[m];
- end;
- Result:='['+Result+']';
- end;
- function WritePasElTree(Expr: TPasExpr; FollowPrefix: TPasTreeString): TPasTreeString;
- { TBinary Kind= OpCode=
- +Left=TBinary Kind= OpCode=
- | +Left=TParamsExpr[]
- | | +Value=Prim Kind= Value=
- | | +Params[1]=Prim Kind= Value=
- +Right=Prim
- }
- var
- C: TClass;
- s: TPasTreeString;
- ParamsExpr: TParamsExpr;
- InlineSpecExpr: TInlineSpecializeExpr;
- SubEl: TPasElement;
- ArrayValues: TArrayValues;
- i: Integer;
- begin
- if Expr=nil then exit('nil');
- C:=Expr.ClassType;
- Result:=C.ClassName;
- str(Expr.Kind,s);
- Result:=Result+' '+s;
- str(Expr.OpCode,s);
- Result:=Result+' '+s;
- if C=TPrimitiveExpr then
- Result:=Result+' Value="'+TPrimitiveExpr(Expr).Value+'"'
- else if C=TUnaryExpr then
- Result:=Result+' Operand='+WritePasElTree(TUnaryExpr(Expr).Operand,FollowPrefix)
- else if C=TBoolConstExpr then
- Result:=Result+' Value='+BoolToStr(TBoolConstExpr(Expr).Value,'True','False')
- else if C=TArrayValues then
- begin
- ArrayValues:=TArrayValues(Expr);
- for i:=0 to length(ArrayValues.Values)-1 do
- Result:=Result+sLineBreak+FollowPrefix+'+Values['+IntToStr(i)+']='+WritePasElTree(ArrayValues.Values[i],FollowPrefix+'| ');
- end
- else if C=TBinaryExpr then
- begin
- Result:=Result+sLineBreak+FollowPrefix+'+Left='+WritePasElTree(TBinaryExpr(Expr).Left,FollowPrefix+'| ');
- Result:=Result+sLineBreak+FollowPrefix+'+Right='+WritePasElTree(TBinaryExpr(Expr).Right,FollowPrefix+'| ');
- end
- else if C=TParamsExpr then
- begin
- ParamsExpr:=TParamsExpr(Expr);
- Result:=Result+sLineBreak+FollowPrefix+'+Value='+WritePasElTree(ParamsExpr.Value,FollowPrefix+'| ');
- for i:=0 to length(ParamsExpr.Params)-1 do
- Result:=Result+sLineBreak+FollowPrefix+'+Params['+IntToStr(i)+']='+WritePasElTree(ParamsExpr.Params[i],FollowPrefix+'| ');
- end
- else if C=TInlineSpecializeExpr then
- begin
- InlineSpecExpr:=TInlineSpecializeExpr(Expr);
- Result:=Result+sLineBreak+FollowPrefix+'+Name='+WritePasElTree(InlineSpecExpr.NameExpr,FollowPrefix+'| ');
- if InlineSpecExpr.Params<>nil then
- for i:=0 to InlineSpecExpr.Params.Count-1 do
- begin
- Result:=Result+sLineBreak+FollowPrefix+'+Params['+IntToStr(i)+']=';
- SubEl:=TPasElement(InlineSpecExpr.Params[i]);
- if SubEl=nil then
- Result:=Result+'nil'
- else if SubEl is TPasExpr then
- Result:=Result+WritePasElTree(TPasExpr(SubEl),FollowPrefix+'| ')
- else
- Result:=Result+SubEl.Name+':'+SubEl.ClassName;
- end;
- end
- else
- Result:=C.ClassName+' Kind=';
- end;
- function GetPasElementDesc(El: TPasElement): TPasTreeString;
- begin
- if El=nil then exit('nil');
- Result:=El.Name+':'+El.ClassName+'['+El.SourceFilename+','+IntToStr(El.SourceLinenumber)+']';
- end;
- Function IndentStrings(S : TStrings; indent : Integer) : TPasTreeString;
- Var
- I,CurrLen,CurrPos : Integer;
- begin
- Result:='';
- CurrLen:=0;
- CurrPos:=0;
- For I:=0 to S.Count-1 do
- begin
- CurrLen:=Length(S[i]);
- If (CurrLen+CurrPos)>72 then
- begin
- Result:=Result+LineEnding+StringOfChar(' ',Indent);
- CurrPos:=Indent;
- end;
- Result:=Result+S[i];
- CurrPos:=CurrPos+CurrLen;
- end;
- end;
- { TPasGenericType }
- destructor TPasGenericType.Destroy;
- begin
- FreeAndNil(GenericTemplateTypes);
- inherited Destroy;
- end;
- procedure TPasGenericType.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(GenericTemplateTypes,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TPasGenericType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- if GenericTemplateTypes<>nil then
- for i:=0 to GenericTemplateTypes.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(GenericTemplateTypes[i]),false);
- end;
- procedure TPasGenericType.SetGenericTemplates(AList: TFPList);
- var
- I: Integer;
- El: TPasElement;
- begin
- if GenericTemplateTypes=nil then
- GenericTemplateTypes:=TFPList.Create;
- For I:=0 to AList.Count-1 do
- begin
- El:=TPasElement(AList[i]);
- El.Parent:=Self;
- GenericTemplateTypes.Add(El);
- end;
- AList.Clear;
- end;
- { TPasGenericTemplateType }
- destructor TPasGenericTemplateType.Destroy;
- begin
- inherited Destroy;
- end;
- procedure TPasGenericTemplateType.FreeChildren(Prepare: boolean);
- begin
- FreeChildArray(Constraints,Prepare);
- inherited FreeChildren(Prepare);
- end;
- function TPasGenericTemplateType.GetDeclaration(full: boolean): TPasTreeString;
- var
- i: Integer;
- begin
- Result:=inherited GetDeclaration(full);
- if length(Constraints)>0 then
- begin
- Result:=Result+': ';
- for i:=0 to length(Constraints)-1 do
- begin
- if i>0 then
- Result:=Result+',';
- Result:=Result+Constraints[i].GetDeclaration(false);
- end;
- end;
- end;
- procedure TPasGenericTemplateType.ForEachCall(
- const aMethodCall: TOnForEachPasElement; const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to length(Constraints)-1 do
- ForEachChildCall(aMethodCall,Arg,Constraints[i],false);
- end;
- procedure TPasGenericTemplateType.AddConstraint(El: TPasElement);
- var
- l: Integer;
- begin
- l:=Length(Constraints);
- SetLength(Constraints,l+1);
- Constraints[l]:=El;
- end;
- procedure TPasGenericTemplateType.ClearTypeReferences(aType: TPasElement);
- var
- i: SizeInt;
- aConstraint: TPasElement;
- begin
- for i:=length(Constraints)-1 downto 0 do
- begin
- aConstraint:=Constraints[i];
- if aConstraint=aType then
- Constraints[i]:=nil;
- end;
- end;
- {$IFDEF HasPTDumpStack}
- procedure PTDumpStack;
- begin
- {AllowWriteln}
- writeln(GetPTDumpStack);
- {AllowWriteln-}
- end;
- function GetPTDumpStack: TPasTreeString;
- var
- bp: Pointer;
- addr: Pointer;
- oldbp: Pointer;
- CurAddress: Shortstring;
- begin
- Result:='';
- { retrieve backtrace info }
- bp:=get_caller_frame(get_frame);
- while bp<>nil do begin
- addr:=get_caller_addr(bp);
- CurAddress:=BackTraceStrFunc(addr);
- Result:=Result+CurAddress+LineEnding;
- oldbp:=bp;
- bp:=get_caller_frame(bp);
- if (bp<=oldbp) or (bp>(StackBottom + StackLength)) then
- bp:=nil;
- end;
- end;
- {$ENDIF}
- { TPasAttributes }
- procedure TPasAttributes.FreeChildren(Prepare: boolean);
- begin
- FreePasExprArray(Self,Calls,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TPasAttributes.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to length(Calls)-1 do
- ForEachChildCall(aMethodCall,Arg,Calls[i],false);
- end;
- procedure TPasAttributes.AddCall(Expr: TPasExpr);
- var
- i : Integer;
- begin
- i:=Length(Calls);
- SetLength(Calls, i+1);
- Calls[i]:=Expr;
- end;
- { TPasMethodResolution }
- procedure TPasMethodResolution.FreeChildren(Prepare: boolean);
- begin
- InterfaceName:=TPasExpr(FreeChild(InterfaceName,Prepare));
- InterfaceProc:=TPasExpr(FreeChild(InterfaceProc,Prepare));
- ImplementationProc:=TPasExpr(FreeChild(ImplementationProc,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasMethodResolution.ForEachCall(
- const aMethodCall: TOnForEachPasElement; const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,InterfaceName,false);
- ForEachChildCall(aMethodCall,Arg,InterfaceProc,false);
- ForEachChildCall(aMethodCall,Arg,ImplementationProc,false);
- end;
- { TPasImplCommandBase }
- constructor TPasImplCommandBase.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- SemicolonAtEOL := true;
- end;
- { TInlineSpecializeExpr }
- constructor TInlineSpecializeExpr.Create(const AName: TPasTreeString;
- AParent: TPasElement);
- begin
- if AName='' then ;
- inherited Create(AParent, pekSpecialize, eopNone);
- Params:=TFPList.Create;
- end;
- destructor TInlineSpecializeExpr.Destroy;
- begin
- FreeAndNil(Params);
- inherited Destroy;
- end;
- procedure TInlineSpecializeExpr.FreeChildren(Prepare: boolean);
- begin
- NameExpr:=TPasExpr(FreeChild(NameExpr,Prepare));
- FreeChildList(Params,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TInlineSpecializeExpr.ClearTypeReferences(aType: TPasElement);
- var
- i: Integer;
- El: TPasElement;
- begin
- for i:=Params.Count-1 downto 0 do
- begin
- El:=TPasElement(Params[i]);
- if El=aType then
- Params.Delete(i);
- end;
- end;
- function TInlineSpecializeExpr.ElementTypeName: TPasTreeString;
- begin
- Result:=SPasTreeSpecializedExpr;
- end;
- function TInlineSpecializeExpr.GetDeclaration(full: Boolean): TPasTreeString;
- var
- i: Integer;
- begin
- Result:='specialize '+NameExpr.GetDeclaration(false)+'<';
- for i:=0 to Params.Count-1 do
- begin
- if i>0 then
- Result:=Result+',';
- Result:=Result+TPasElement(Params[i]).GetDeclaration(false);
- end;
- Result:=Result+'>';
- if full then ;
- end;
- procedure TInlineSpecializeExpr.ForEachCall(
- const aMethodCall: TOnForEachPasElement; const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,NameExpr,false);
- for i:=0 to Params.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Params[i]),true);
- end;
- { TPasSpecializeType }
- constructor TPasSpecializeType.Create(const AName: TPasTreeString; AParent: TPasElement
- );
- begin
- inherited Create(AName, AParent);
- Params:=TFPList.Create;
- end;
- destructor TPasSpecializeType.Destroy;
- begin
- FreeAndNil(Params);
- inherited Destroy;
- end;
- procedure TPasSpecializeType.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Params,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TPasSpecializeType.ClearTypeReferences(aType: TPasElement);
- var
- i: Integer;
- El: TPasElement;
- begin
- inherited ClearTypeReferences(aType);
- for i:=Params.Count-1 downto 0 do
- begin
- El:=TPasElement(Params[i]);
- if El=aType then
- Params.Delete(i);
- end;
- end;
- function TPasSpecializeType.ElementTypeName: TPasTreeString;
- begin
- Result:=SPasTreeSpecializedType;
- end;
- function TPasSpecializeType.GetDeclaration(full: boolean): TPasTreeString;
- var
- i: Integer;
- begin
- Result:='specialize '+DestType.Name+'<';
- for i:=0 to Params.Count-1 do
- begin
- if i>0 then
- Result:=Result+',';
- Result:=Result+TPasElement(Params[i]).GetDeclaration(false);
- end;
- If Full and (Name<>'') then
- begin
- Result:=Name+' = '+Result;
- ProcessHints(False,Result);
- end;
- end;
- procedure TPasSpecializeType.ForEachCall(
- const aMethodCall: TOnForEachPasElement; const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to Params.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Params[i]),true);
- end;
- { TInterfaceSection }
- function TInterfaceSection.ElementTypeName: TPasTreeString;
- begin
- Result:=SPasTreeInterfaceSection;
- end;
- { TLibrarySection }
- function TLibrarySection.ElementTypeName: TPasTreeString;
- begin
- Result:=SPasTreeLibrarySection;
- end;
- { TProgramSection }
- function TProgramSection.ElementTypeName: TPasTreeString;
- begin
- Result:=SPasTreeProgramSection;
- end;
- { TImplementationSection }
- function TImplementationSection.ElementTypeName: TPasTreeString;
- begin
- Result:=SPasTreeImplementationSection;
- end;
- { TPasUsesUnit }
- procedure TPasUsesUnit.FreeChildren(Prepare: boolean);
- begin
- Expr:=TPasExpr(FreeChild(Expr,Prepare));
- InFilename:=TPrimitiveExpr(FreeChild(InFilename,Prepare));
- Module:=TPasModule(FreeChild(Module,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasUsesUnit.ElementTypeName: TPasTreeString;
- begin
- Result := SPasTreeUsesUnit;
- end;
- procedure TPasUsesUnit.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Expr,false);
- ForEachChildCall(aMethodCall,Arg,InFilename,false);
- ForEachChildCall(aMethodCall,Arg,Module,true);
- end;
- { TPasElementBase }
- procedure TPasElementBase.Accept(Visitor: TPassTreeVisitor);
- begin
- if Visitor=nil then ;
- end;
- { TPasTypeRef }
- procedure TPasTypeRef.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,RefType,true);
- end;
- { TPasClassOperator }
- function TPasClassOperator.TypeName: TPasTreeString;
- begin
- Result:='class operator';
- end;
- function TPasClassOperator.GetProcTypeEnum: TProcType;
- begin
- Result:=ptClassOperator;
- end;
- { TPasImplAsmStatement }
- constructor TPasImplAsmStatement.Create(const AName: TPasTreeString;
- AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- FTokens:=TStringList.Create;
- FModifierTokens:=TStringList.Create;
- end;
- destructor TPasImplAsmStatement.Destroy;
- begin
- FreeAndNil(FTokens);
- FreeAndNil(FModifierTokens);
- inherited Destroy;
- end;
- { TPasClassConstructor }
- function TPasClassConstructor.TypeName: TPasTreeString;
- begin
- Result:='class '+ inherited TypeName;
- end;
- function TPasClassConstructor.GetProcTypeEnum: TProcType;
- begin
- Result:=ptClassConstructor;
- end;
- { TPasAnonymousProcedure }
- function TPasAnonymousProcedure.ElementTypeName: TPasTreeString;
- begin
- Result:=SPasTreeAnonymousProcedure;
- end;
- function TPasAnonymousProcedure.TypeName: TPasTreeString;
- begin
- Result:='anonymous procedure';
- end;
- function TPasAnonymousProcedure.GetProcTypeEnum: TProcType;
- begin
- Result:=ptAnonymousProcedure;
- end;
- { TPasAnonymousFunction }
- function TPasAnonymousFunction.GetFT: TPasFunctionType;
- begin
- Result:=ProcType as TPasFunctionType;
- end;
- function TPasAnonymousFunction.ElementTypeName: TPasTreeString;
- begin
- Result := SPasTreeAnonymousFunction;
- end;
- function TPasAnonymousFunction.TypeName: TPasTreeString;
- begin
- Result:='anonymous function';
- end;
- function TPasAnonymousFunction.GetProcTypeEnum: TProcType;
- begin
- Result:=ptAnonymousFunction;
- end;
- { TProcedureExpr }
- constructor TProcedureExpr.Create(AParent: TPasElement);
- begin
- inherited Create(AParent,pekProcedure,eopNone);
- end;
- procedure TProcedureExpr.FreeChildren(Prepare: boolean);
- begin
- Proc:=TPasAnonymousProcedure(FreeChild(Proc,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TProcedureExpr.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- if Proc<>nil then
- Result:=Proc.GetDeclaration(full)
- else
- Result:='procedure-expr';
- end;
- procedure TProcedureExpr.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Proc,false);
- end;
- { TPasImplRaise }
- procedure TPasImplRaise.FreeChildren(Prepare: boolean);
- begin
- ExceptObject:=TPasExpr(FreeChild(ExceptObject,Prepare));
- ExceptAddr:=TPasExpr(FreeChild(ExceptAddr,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplRaise.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,ExceptObject,false);
- ForEachChildCall(aMethodCall,Arg,ExceptAddr,false);
- end;
- { TPasImplRepeatUntil }
- procedure TPasImplRepeatUntil.FreeChildren(Prepare: boolean);
- begin
- ConditionExpr:=TPasExpr(FreeChild(ConditionExpr,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasImplRepeatUntil.Condition: TPasTreeString;
- begin
- If Assigned(ConditionExpr) then
- Result:=ConditionExpr.GetDeclaration(True)
- else
- Result:='';
- end;
- procedure TPasImplRepeatUntil.ForEachCall(
- const aMethodCall: TOnForEachPasElement; const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,ConditionExpr,false);
- end;
- { TPasImplSimple }
- procedure TPasImplSimple.FreeChildren(Prepare: boolean);
- begin
- Expr:=TPasExpr(FreeChild(Expr,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplSimple.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Expr,false);
- end;
- { TPasImplAssign }
- procedure TPasImplAssign.FreeChildren(Prepare: boolean);
- begin
- Left:=TPasExpr(FreeChild(Left,Prepare));
- Right:=TPasExpr(FreeChild(Right,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplAssign.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Left,false);
- ForEachChildCall(aMethodCall,Arg,Right,false);
- end;
- { TPasExportSymbol }
- procedure TPasExportSymbol.FreeChildren(Prepare: boolean);
- begin
- NameExpr:=TPasExpr(FreeChild(NameExpr,Prepare));
- ExportName:=TPasExpr(FreeChild(ExportName,Prepare));
- ExportIndex:=TPasExpr(FreeChild(ExportIndex,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasExportSymbol.ElementTypeName: TPasTreeString;
- begin
- Result:='Export'
- end;
- function TPasExportSymbol.GetDeclaration(full: boolean): TPasTreeString;
- begin
- Result:=Name;
- if (ExportName<>Nil) then
- Result:=Result+' name '+ExportName.GetDeclaration(Full)
- else if (ExportIndex<>Nil) then
- Result:=Result+' index '+ExportIndex.GetDeclaration(Full);
- end;
- procedure TPasExportSymbol.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,NameExpr,false);
- ForEachChildCall(aMethodCall,Arg,ExportName,false);
- ForEachChildCall(aMethodCall,Arg,ExportIndex,false);
- end;
- { TPasUnresolvedUnitRef }
- function TPasUnresolvedUnitRef.ElementTypeName: TPasTreeString;
- begin
- Result:=SPasTreeUnit;
- end;
- { TPasLibrary }
- procedure TPasLibrary.FreeChildren(Prepare: boolean);
- begin
- LibrarySection:=TLibrarySection(FreeChild(LibrarySection,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasLibrary.ElementTypeName: TPasTreeString;
- begin
- Result:=inherited ElementTypeName;
- end;
- procedure TPasLibrary.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- ForEachChildCall(aMethodCall,Arg,LibrarySection,false);
- inherited ForEachCall(aMethodCall, Arg);
- end;
- { TPasProgram }
- procedure TPasProgram.FreeChildren(Prepare: boolean);
- begin
- ProgramSection:=TProgramSection(FreeChild(ProgramSection,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasProgram.ElementTypeName: TPasTreeString;
- begin
- Result:=inherited ElementTypeName;
- end;
- procedure TPasProgram.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- ForEachChildCall(aMethodCall,Arg,ProgramSection,false);
- inherited ForEachCall(aMethodCall, Arg);
- end;
- { TPasUnitModule }
- function TPasUnitModule.ElementTypeName: TPasTreeString;
- begin
- Result:=SPasTreeUnit;
- end;
- { Parse tree element type name functions }
- function TPasElement.ElementTypeName: TPasTreeString; begin Result := SPasTreeElement end;
- function TPasElement.HintsString: TPasTreeString;
- Var
- H : TPasmemberHint;
- begin
- Result:='';
- For H := Low(TPasmemberHint) to High(TPasMemberHint) do
- if H in Hints then
- begin
- If (Result<>'') then
- Result:=Result+'; ';
- Result:=Result+cPasMemberHint[h];
- end;
- end;
- function TPasDeclarations.ElementTypeName: TPasTreeString; begin Result := SPasTreeSection end;
- procedure TPasDeclarations.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to Declarations.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Declarations[i]),false);
- end;
- function TPasModule.ElementTypeName: TPasTreeString; begin Result := SPasTreeModule end;
- function TPasPackage.ElementTypeName: TPasTreeString; begin Result := SPasTreePackage end;
- procedure TPasPackage.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to Modules.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasModule(Modules[i]),true);
- end;
- function TPasResString.ElementTypeName: TPasTreeString; begin Result := SPasTreeResString; end;
- function TPasType.FixTypeDecl(aDecl: TPasTreeString): TPasTreeString;
- begin
- Result:=aDecl;
- if (Name<>'') then
- Result:=SafeName+' = '+Result;
- ProcessHints(false,Result);
- end;
- function TPasType.SafeName: TPasTreeString;
- begin
- if SameText(Name,'TPasTreeString') then
- Result:=Name
- else
- Result:=inherited SafeName;
- end;
- function TPasType.ElementTypeName: TPasTreeString; begin Result := SPasTreeType; end;
- function TPasPointerType.ElementTypeName: TPasTreeString; begin Result := SPasTreePointerType; end;
- function TPasAliasType.ElementTypeName: TPasTreeString; begin Result := SPasTreeAliasType; end;
- function TPasTypeAliasType.ElementTypeName: TPasTreeString; begin Result := SPasTreeTypeAliasType; end;
- function TPasClassOfType.ElementTypeName: TPasTreeString; begin Result := SPasTreeClassOfType; end;
- function TPasRangeType.ElementTypeName: TPasTreeString; begin Result := SPasTreeRangeType; end;
- function TPasArrayType.ElementTypeName: TPasTreeString; begin Result := SPasTreeArrayType; end;
- function TPasFileType.ElementTypeName: TPasTreeString; begin Result := SPasTreeFileType; end;
- function TPasEnumValue.ElementTypeName: TPasTreeString; begin Result := SPasTreeEnumValue; end;
- procedure TPasEnumValue.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Value,false);
- end;
- procedure TPasEnumValue.FreeChildren(Prepare: boolean);
- begin
- Value:=TPasExpr(FreeChild(Value,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasEnumValue.AssignedValue: TPasTreeString;
- begin
- If Assigned(Value) then
- Result:=Value.GetDeclaration(True)
- else
- Result:='';
- end;
- function TPasEnumType.ElementTypeName: TPasTreeString; begin Result := SPasTreeEnumType end;
- function TPasSetType.ElementTypeName: TPasTreeString; begin Result := SPasTreeSetType end;
- function TPasRecordType.ElementTypeName: TPasTreeString; begin Result := SPasTreeRecordType end;
- function TPasArgument.ElementTypeName: TPasTreeString; begin Result := SPasTreeArgument end;
- function TPasProcedureType.ElementTypeName: TPasTreeString; begin Result := SPasTreeProcedureType end;
- function TPasResultElement.ElementTypeName: TPasTreeString; begin Result := SPasTreeResultElement end;
- procedure TPasResultElement.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,ResultType,true);
- end;
- procedure TPasResultElement.ClearTypeReferences(aType: TPasElement);
- begin
- if ResultType=aType then
- ResultType:=nil
- end;
- function TPasFunctionType.ElementTypeName: TPasTreeString; begin Result := SPasTreeFunctionType end;
- function TPasUnresolvedTypeRef.ElementTypeName: TPasTreeString; begin Result := SPasTreeUnresolvedTypeRef end;
- function TPasVariable.ElementTypeName: TPasTreeString; begin Result := SPasTreeVariable end;
- function TPasConst.ElementTypeName: TPasTreeString; begin Result := SPasTreeConst end;
- function TPasProperty.ElementTypeName: TPasTreeString; begin Result := SPasTreeProperty end;
- function TPasOverloadedProc.ElementTypeName: TPasTreeString; begin Result := SPasTreeOverloadedProcedure end;
- function TPasProcedure.ElementTypeName: TPasTreeString; begin Result := SPasTreeProcedure end;
- function TPasFunction.GetFT: TPasFunctionType;
- begin
- Result:=ProcType as TPasFunctionType;
- end;
- function TPasFunction.ElementTypeName: TPasTreeString; begin Result := SPasTreeFunction; end;
- function TPasClassProcedure.ElementTypeName: TPasTreeString; begin Result := SPasTreeClassProcedure; end;
- function TPasClassConstructor.ElementTypeName: TPasTreeString; begin Result := SPasTreeClassConstructor; end;
- function TPasClassDestructor.ElementTypeName: TPasTreeString; begin Result := SPasTreeClassDestructor; end;
- function TPasClassDestructor.TypeName: TPasTreeString;
- begin
- Result:='destructor';
- end;
- function TPasClassDestructor.GetProcTypeEnum: TProcType;
- begin
- Result:=ptClassDestructor;
- end;
- function TPasClassFunction.ElementTypeName: TPasTreeString; begin Result := SPasTreeClassFunction; end;
- class function TPasOperator.OperatorTypeToToken(T: TOperatorType): TPasTreeString;
- begin
- Result:=OperatorTokens[T];
- end;
- class function TPasOperator.OperatorTypeToOperatorName(T: TOperatorType
- ): TPasTreeString;
- begin
- Result:=OperatorNames[T];
- end;
- class function TPasOperator.TokenToOperatorType(S: TPasTreeString): TOperatorType;
- begin
- Result:=High(TOperatorType);
- While (Result>otUnknown) and (CompareText(S,OperatorTokens[Result])<>0) do
- Result:=Pred(Result);
- end;
- class function TPasOperator.NameToOperatorType(S: TPasTreeString): TOperatorType;
- begin
- Result:=High(TOperatorType);
- While (Result>otUnknown) and (CompareText(S,OperatorNames[Result])<>0) do
- Result:=Pred(Result);
- end;
- Function TPasOperator.NameSuffix : TPasTreeString;
- Var
- I : Integer;
- begin
- Result:='(';
- if Assigned(ProcType) and Assigned(ProcType.Args) then
- for i:=0 to ProcType.Args.Count-1 do
- begin
- if i>0 then
- Result:=Result+',';
- Result:=Result+TPasArgument(ProcType.Args[i]).ArgType.Name;
- end;
- Result:=Result+')';
- if Assigned(TPasFunctionType(ProcType)) and
- Assigned(TPasFunctionType(ProcType).ResultEl) and
- Assigned(TPasFunctionType(ProcType).ResultEl.ResultType) then
- Result:=Result+':'+TPasFunctionType(ProcType).ResultEl.ResultType.Name;
- end;
- procedure TPasOperator.CorrectName;
- begin
- Name:=OperatorNames[OperatorType]+NameSuffix;
- end;
- function TPasOperator.OldName(WithPath : Boolean): TPasTreeString;
- Var
- I : Integer;
- S : TPasTreeString;
- begin
- Result:=TypeName+' '+OperatorTokens[OperatorType];
- Result := Result + '(';
- if Assigned(ProcType) then
- begin
- for i := 0 to ProcType.Args.Count - 1 do
- begin
- if i > 0 then
- Result := Result + ', ';
- Result := Result + TPasArgument(ProcType.Args[i]).ArgType.Name;
- end;
- Result := Result + ')';
- if (OperatorType<>otInitialize) and Assigned(TPasFunctionType(ProcType).ResultEl.ResultType) then
- Result:=Result+': ' + TPasFunctionType(ProcType).ResultEl.ResultType.Name;
- If WithPath then
- begin
- S:=Self.ParentPath;
- if (S<>'') then
- Result:=S+'.'+Result;
- end;
- end;
- end;
- function TPasOperator.ElementTypeName: TPasTreeString;
- begin
- Result := SPasTreeOperator
- end;
- function TPasConstructor.ElementTypeName: TPasTreeString; begin Result := SPasTreeConstructor end;
- function TPasDestructor.ElementTypeName: TPasTreeString; begin Result := SPasTreeDestructor end;
- function TPasProcedureImpl.ElementTypeName: TPasTreeString; begin Result := SPasTreeProcedureImpl end;
- function TPasConstructorImpl.ElementTypeName: TPasTreeString; begin Result := SPasTreeConstructorImpl end;
- function TPasDestructorImpl.ElementTypeName: TPasTreeString; begin Result := SPasTreeDestructorImpl end;
- function TPasStringType.ElementTypeName: TPasTreeString; begin Result:=SPasStringType;end;
- { All other stuff: }
- procedure TPasElement.ProcessHints(const ASemiColonPrefix: boolean; var AResult: TPasTreeString);
- var
- S : TPasTreeString;
- begin
- if Hints <> [] then
- begin
- if ASemiColonPrefix then
- AResult := AResult + ';';
- S:=HintsString;
- if (S<>'') then
- AResult:=AResult+' '+S;
- if ASemiColonPrefix then
- AResult:=AResult+';';
- end;
- end;
- procedure TPasElement.SetParent(const AValue: TPasElement);
- begin
- FParent:=AValue;
- end;
- constructor TPasElement.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create;
- FName := AName;
- FParent := AParent;
- {$ifdef pas2js}
- inc(FLastPasElementId);
- FPasElementId:=FLastPasElementId;
- //writeln('TPasElement.Create ',Name,':',ClassName,' ID=[',FPasElementId,']');
- {$endif}
- end;
- destructor TPasElement.Destroy;
- begin
- FParent:=nil;
- inherited Destroy;
- end;
- class function TPasElement.IsKeyWord(const S: TPasTreeString): Boolean;
- Const
- KW=';absolute;and;array;asm;begin;case;const;constructor;destructor;div;do;'+
- 'downto;else;end;file;for;function;goto;if;implementation;in;inherited;'+
- 'inline;interface;label;mod;nil;not;object;of;on;operator;or;packed;'+
- 'procedure;program;record;reintroduce;repeat;self;set;shl;shr;TPasTreeString;then;'+
- 'to;type;unit;until;uses;var;while;with;xor;dispose;exit;false;new;true;'+
- 'as;class;dispinterface;except;exports;finalization;finally;initialization;'+
- 'inline;is;library;on;out;packed;property;raise;resourcestring;threadvar;try;'+
- 'private;published;length;setlength;';
- begin
- Result:=Pos(';'+lowercase(S)+';',KW)<>0;
- end;
- class function TPasElement.EscapeKeyWord(const S: TPasTreeString): TPasTreeString;
- begin
- Result:=S;
- If IsKeyWord(Result) then
- Result:='&'+Result;
- end;
- function TPasElement.FreeChild(Child: TPasElement; Prepare: boolean
- ): TPasElement;
- begin
- if Child=nil then
- exit(nil)
- else if Prepare then
- begin
- if Child.Parent=Self then
- begin
- Child.FreeChildren(true);
- exit(Child); // keep reference
- end
- else
- exit(nil); // clear reference
- end
- else
- begin
- Child.FreeChildren(false);
- Child.Free;
- Result:=nil;
- end;
- end;
- procedure TPasElement.FreeChildList(List: TFPList; Prepare: boolean);
- var
- i: Integer;
- begin
- if List=nil then exit;
- for i:=0 to List.Count-1 do
- List[i]:=FreeChild(TPasElement(List[i]),Prepare);
- List.Clear;
- end;
- procedure TPasElement.FreeChildArray(A: TPasElementArray; Prepare: boolean);
- var
- i: Integer;
- begin
- for i:=0 to High(A) do
- A[i]:=FreeChild(A[i],Prepare);
- end;
- procedure TPasElement.FreeChildren(Prepare: boolean);
- begin
- if Prepare then ;
- end;
- procedure TPasElement.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- aMethodCall(Self,Arg);
- end;
- procedure TPasElement.ForEachChildCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer; Child: TPasElement; CheckParent: boolean);
- begin
- if (Child=nil) then exit;
- if CheckParent and (not Child.HasParent(Self)) then exit;
- Child.ForEachCall(aMethodCall,Arg);
- end;
- function TPasElement.SafeName: TPasTreeString;
- begin
- Result:=Name;
- if IsKeyWord(Result) then
- Result:='&'+Result;
- end;
- function TPasElement.FullPath: TPasTreeString;
- var
- p: TPasElement;
- begin
- Result := '';
- p := Parent;
- while Assigned(p) and not p.InheritsFrom(TPasDeclarations) do
- begin
- if (p.Name<>'') and (Not (p is TPasOverloadedProc)) then
- if Length(Result) > 0 then
- Result := p.Name + '.' + Result
- else
- Result := p.Name;
- p := p.Parent;
- end;
- end;
- function TPasElement.FullName: TPasTreeString;
- begin
- Result := FullPath;
- if Result<>'' then
- Result:=Result+'.'+Name
- else
- Result:=Name;
- end;
- function TPasElement.ParentPath: TPasTreeString;
- var
- p: TPasElement;
- begin
- Result:='';
- p := Parent;
- while Assigned(p) do
- begin
- if (p.Name<>'') and (Not (p is TPasOverloadedProc)) then
- if Length(Result) > 0 then
- Result := p.Name + '.' + Result
- else
- Result := p.Name;
- p := p.Parent;
- end;
- end;
- function TPasElement.PathName: TPasTreeString;
- begin
- Result := ParentPath;
- if Result<>'' then
- Result:=Result+'.'+Name
- else
- Result:=Name;
- end;
- function TPasElement.GetModule: TPasModule;
- Var
- p : TPaselement;
- begin
- if Self is TPasPackage then
- Result := nil
- else
- begin
- P:=Self;
- While (P<>Nil) and Not (P is TPasModule) do
- P:=P.Parent;
- Result:=TPasModule(P);
- end;
- end;
- function TPasElement.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- if Full then
- Result := SafeName
- else
- Result := '';
- end;
- procedure TPasElement.Accept(Visitor: TPassTreeVisitor);
- begin
- Visitor.Visit(Self);
- end;
- procedure TPasElement.ClearTypeReferences(aType: TPasElement);
- begin
- if aType=nil then ;
- end;
- function TPasElement.HasParent(aParent: TPasElement): boolean;
- var
- El: TPasElement;
- begin
- El:=Parent;
- while El<>nil do
- begin
- if El=aParent then exit(true);
- El:=El.Parent;
- end;
- Result:=false;
- end;
- constructor TPasDeclarations.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Declarations := TFPList.Create;
- Attributes := TFPList.Create;
- Classes := TFPList.Create;
- Consts := TFPList.Create;
- ExportSymbols := TFPList.Create;
- Functions := TFPList.Create;
- Properties := TFPList.Create;
- ResStrings := TFPList.Create;
- Types := TFPList.Create;
- Labels := TFPList.Create;
- Variables := TFPList.Create;
- end;
- destructor TPasDeclarations.Destroy;
- begin
- {$IFDEF VerbosePasTreeMem}writeln('TPasDeclarations.Destroy START');{$ENDIF}
- FreeAndNil(Variables);
- FreeAndNil(Types);
- FreeAndNil(ResStrings);
- FreeAndNil(Properties);
- FreeAndNil(Functions);
- FreeAndNil(ExportSymbols);
- FreeAndNil(Consts);
- FreeAndNil(Classes);
- FreeAndNil(Attributes);
- FreeAndNil(Labels);
- FreeAndNil(Declarations);
- {$IFDEF VerbosePasTreeMem}writeln('TPasDeclarations.Destroy inherited');{$ENDIF}
- inherited Destroy;
- {$IFDEF VerbosePasTreeMem}writeln('TPasDeclarations.Destroy END');{$ENDIF}
- end;
- procedure TPasDeclarations.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Declarations,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TPasModule.FreeChildren(Prepare: boolean);
- begin
- GlobalDirectivesSection:=TPasImplCommandBase(FreeChild(GlobalDirectivesSection,Prepare));
- InterfaceSection:=TInterfaceSection(FreeChild(InterfaceSection,Prepare));
- ImplementationSection:=TImplementationSection(FreeChild(ImplementationSection,Prepare));
- InitializationSection:=TInitializationSection(FreeChild(InitializationSection,Prepare));
- FinalizationSection:=TFinalizationSection(FreeChild(FinalizationSection,Prepare));
- inherited FreeChildren(Prepare);
- end;
- constructor TPasPackage.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- if (Length(AName) > 0) and (AName[1] <> '#') then
- inherited Create('#' + AName, AParent)
- else
- inherited Create(AName, AParent);
- Modules := TFPList.Create;
- end;
- destructor TPasPackage.Destroy;
- begin
- FreeAndNil(Modules);
- inherited Destroy;
- end;
- procedure TPasPackage.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Modules,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TPasPointerType.FreeChildren(Prepare: boolean);
- begin
- DestType:=TPasType(FreeChild(DestType,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasAliasType.FreeChildren(Prepare: boolean);
- begin
- SubType:=TPasType(FreeChild(SubType,Prepare));
- DestType:=TPasType(FreeChild(DestType,Prepare));
- Expr:=TPasExpr(FreeChild(Expr,Prepare));
- CodepageExpr:=TPasExpr(FreeChild(CodepageExpr,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasArrayType.FreeChildren(Prepare: boolean);
- begin
- FreePasExprArray(Self,Ranges,Prepare);
- ElType:=TPasTypeRef(FreeChild(ElType,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasArrayType.ClearTypeReferences(aType: TPasElement);
- begin
- inherited ClearTypeReferences(aType);
- if ElType=aType then
- ElType:=nil;
- end;
- procedure TPasFileType.FreeChildren(Prepare: boolean);
- begin
- ElType:=TPasType(FreeChild(ElType,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasFileType.ClearTypeReferences(aType: TPasElement);
- begin
- if aType=ElType then
- ElType:=nil;
- end;
- constructor TPasEnumType.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Values := TFPList.Create;
- end;
- destructor TPasEnumType.Destroy;
- begin
- FreeAndNil(Values);
- inherited Destroy;
- end;
- procedure TPasEnumType.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Values,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TPasEnumType.GetEnumNames(Names: TStrings);
- var
- i: Integer;
- begin
- with Values do
- begin
- for i := 0 to Count - 2 do
- Names.Add(TPasEnumValue(Items[i]).Name + ',');
- if Count > 0 then
- Names.Add(TPasEnumValue(Items[Count - 1]).Name);
- end;
- end;
- procedure TPasEnumType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to Values.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasEnumValue(Values[i]),false);
- end;
- constructor TPasVariant.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Values := TFPList.Create;
- end;
- destructor TPasVariant.Destroy;
- begin
- FreeAndNil(Values);
- inherited Destroy;
- end;
- procedure TPasVariant.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Values,Prepare);
- Members:=TPasRecordType(FreeChild(Members,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasVariant.GetDeclaration(full: boolean): TPasTreeString;
- Var
- i : Integer;
- S : TStrings;
- begin
- Result:='';
- For I:=0 to Values.Count-1 do
- begin
- if (Result<>'') then
- Result:=Result+', ';
- Result:=Result+TPasElement(Values[i]).GetDeclaration(False);
- Result:=Result+': ('+sLineBreak;
- S:=TStringList.Create;
- try
- Members.GetMembers(S);
- Result:=Result+S.Text;
- finally
- S.Free;
- end;
- Result:=Result+');';
- if Full then ;
- end;
- end;
- procedure TPasVariant.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to Values.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Values[i]),false);
- ForEachChildCall(aMethodCall,Arg,Members,false);
- end;
- { TPasRecordType }
- constructor TPasRecordType.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- end;
- destructor TPasRecordType.Destroy;
- begin
- FreeAndNil(Variants);
- inherited Destroy;
- end;
- procedure TPasRecordType.FreeChildren(Prepare: boolean);
- begin
- VariantEl:=FreeChild(VariantEl,Prepare);
- FreeChildList(Variants,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TPasRecordType.ClearTypeReferences(aType: TPasElement);
- begin
- inherited ClearTypeReferences(aType);
- if VariantEl=aType then
- VariantEl:=nil;
- end;
- { TPasClassType }
- constructor TPasClassType.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- IsShortDefinition := False;
- Modifiers := TStringList.Create;
- Interfaces:= TFPList.Create;
- end;
- destructor TPasClassType.Destroy;
- begin
- FreeAndNil(Interfaces);
- FreeAndNil(Modifiers);
- inherited Destroy;
- end;
- procedure TPasClassType.FreeChildren(Prepare: boolean);
- begin
- AncestorType:=TPasType(FreeChild(AncestorType,Prepare));
- HelperForType:=TPasType(FreeChild(HelperForType,Prepare));
- GUIDExpr:=TPasExpr(FreeChild(GUIDExpr,Prepare));
- FreeChildList(Interfaces,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TPasClassType.ClearTypeReferences(aType: TPasElement);
- var
- i: Integer;
- El: TPasElement;
- begin
- inherited ClearTypeReferences(aType);
- if AncestorType=aType then
- AncestorType:=nil;
- if HelperForType=aType then
- HelperForType:=nil;
- for i := Interfaces.Count - 1 downto 0 do
- begin
- El:=TPasElement(Interfaces[i]);
- if El=aType then
- Interfaces[i]:=nil;
- end;
- end;
- function TPasClassType.ElementTypeName: TPasTreeString;
- begin
- case ObjKind of
- okObject: Result := SPasTreeObjectType;
- okClass: Result := SPasTreeClassType;
- okInterface: Result := SPasTreeInterfaceType;
- okClassHelper : Result:=SPasClassHelperType;
- okRecordHelper : Result:=SPasRecordHelperType;
- okTypeHelper : Result:=SPasTypeHelperType;
- else
- Result:='ObjKind('+IntToStr(ord(ObjKind))+')';
- end;
- end;
- procedure TPasClassType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,AncestorType,true);
- for i:=0 to Interfaces.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Interfaces[i]),true);
- ForEachChildCall(aMethodCall,Arg,HelperForType,true);
- ForEachChildCall(aMethodCall,Arg,GUIDExpr,false);
- end;
- function TPasClassType.IsObjCClass: Boolean;
- begin
- Result:=ObjKind in okObjCClasses;
- end;
- function TPasClassType.FindMember(MemberClass: TPTreeElement; const MemberName: TPasTreeString): TPasElement;
- Var
- I : Integer;
- begin
- // Writeln('Looking for ',MemberName,'(',MemberClass.ClassName,') in ',Name);
- Result:=Nil;
- I:=0;
- While (Result=Nil) and (I<Members.Count) do
- begin
- Result:=TPasElement(Members[i]);
- if (Result.ClassType<>MemberClass) or (CompareText(Result.Name,MemberName)<>0) then
- Result:=Nil;
- Inc(I);
- end;
- end;
- function TPasClassType.FindMemberInAncestors(MemberClass: TPTreeElement;
- const MemberName: TPasTreeString): TPasElement;
- Function A (C : TPasClassType) : TPasClassType;
- begin
- if C.AncestorType is TPasClassType then
- result:=TPasClassType(C.AncestorType)
- else
- result:=Nil;
- end;
- Var
- C : TPasClassType;
- begin
- Result:=Nil;
- C:=A(Self);
- While (Result=Nil) and (C<>Nil) do
- begin
- Result:=C.FindMember(MemberClass,MemberName);
- C:=A(C);
- end;
- end;
- function TPasClassType.InterfaceGUID: TPasTreeString;
- begin
- If Assigned(GUIDExpr) then
- Result:=GUIDExpr.GetDeclaration(True)
- else
- Result:=''
- end;
- function TPasClassType.IsSealed: Boolean;
- begin
- Result:=HasModifier('sealed');
- end;
- function TPasClassType.IsAbstract: Boolean;
- begin
- Result:=HasModifier('abstract');
- end;
- function TPasClassType.HasModifier(const aModifier: TPasTreeString): Boolean;
- var
- i: Integer;
- begin
- for i:=0 to Modifiers.Count-1 do
- if CompareText(aModifier,Modifiers[i])=0 then
- exit(true);
- Result:=false;
- end;
- { TPasArgument }
- procedure TPasArgument.FreeChildren(Prepare: boolean);
- begin
- ArgType:=TPasTypeRef(FreeChild(ArgType,Prepare));
- ValueExpr:=TPasExpr(FreeChild(ValueExpr,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasArgument.ClearTypeReferences(aType: TPasElement);
- begin
- if ArgType=aType then
- ArgType:=nil;
- end;
- function TPasArgument.GetDeclaration (full : boolean) : TPasTreeString;
- begin
- If Assigned(ArgType) then
- begin
- If ArgType.Name<>'' then
- Result:=ArgType.SafeName
- else
- Result:=ArgType.GetDeclaration(False);
- If Full and (Name<>'') then
- Result:=SafeName+': '+Result;
- end
- else If Full then
- Result:=SafeName
- else
- Result:='';
- end;
- procedure TPasArgument.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,ArgType,true);
- ForEachChildCall(aMethodCall,Arg,ValueExpr,false);
- end;
- function TPasArgument.Value: TPasTreeString;
- begin
- If Assigned(ValueExpr) then
- Result:=ValueExpr.GetDeclaration(true)
- else
- Result:='';
- end;
- { TPasProcedureType }
- // inline
- function TPasProcedureType.GetIsAsync: Boolean;
- begin
- Result:=ptmAsync in Modifiers;
- end;
- // inline
- function TPasProcedureType.GetIsNested: Boolean;
- begin
- Result:=ptmIsNested in Modifiers;
- end;
- // inline
- function TPasProcedureType.GetIsOfObject: Boolean;
- begin
- Result:=ptmOfObject in Modifiers;
- end;
- // inline
- function TPasProcedureType.GetIsReference: Boolean;
- begin
- Result:=ptmReferenceTo in Modifiers;
- end;
- procedure TPasProcedureType.SetIsAsync(const AValue: Boolean);
- begin
- if AValue then
- Include(Modifiers,ptmAsync)
- else
- Exclude(Modifiers,ptmAsync);
- end;
- procedure TPasProcedureType.SetIsNested(const AValue: Boolean);
- begin
- if AValue then
- Include(Modifiers,ptmIsNested)
- else
- Exclude(Modifiers,ptmIsNested);
- end;
- procedure TPasProcedureType.SetIsOfObject(const AValue: Boolean);
- begin
- if AValue then
- Include(Modifiers,ptmOfObject)
- else
- Exclude(Modifiers,ptmOfObject);
- end;
- procedure TPasProcedureType.SetIsReference(AValue: Boolean);
- begin
- if AValue then
- Include(Modifiers,ptmReferenceTo)
- else
- Exclude(Modifiers,ptmReferenceTo);
- end;
- constructor TPasProcedureType.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Args := TFPList.Create;
- end;
- destructor TPasProcedureType.Destroy;
- begin
- FreeAndNil(Args);
- inherited Destroy;
- end;
- procedure TPasProcedureType.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Args,Prepare);
- VarArgsType:=TPasType(FreeChild(VarArgsType,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasProcedureType.ClearTypeReferences(aType: TPasElement);
- begin
- inherited ClearTypeReferences(aType);
- if VarArgsType=aType then
- VarArgsType:=nil;
- end;
- class function TPasProcedureType.TypeName: TPasTreeString;
- begin
- Result := 'procedure';
- end;
- function TPasProcedureType.CreateArgument(const AName,
- AUnresolvedTypeName: TPasTreeString): TPasArgument;
- begin
- Result := TPasArgument.Create(AName, Self);
- Args.Add(Result);
- if AUnresolvedTypeName<>'' then
- Result.ArgType := TPasUnresolvedTypeRef.Create(AUnresolvedTypeName, Result);
- end;
- procedure TPasProcedureType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to Args.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Args[i]),false);
- ForEachChildCall(aMethodCall,Arg,VarArgsType,false);
- end;
- { TPasResultElement }
- procedure TPasResultElement.FreeChildren(Prepare: boolean);
- begin
- ResultType:=TPasType(FreeChild(ResultType,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasFunctionType.FreeChildren(Prepare: boolean);
- begin
- ResultEl:=TPasResultElement(FreeChild(ResultEl,Prepare));
- inherited FreeChildren(Prepare);
- end;
- class function TPasFunctionType.TypeName: TPasTreeString;
- begin
- Result := 'function';
- end;
- constructor TPasUnresolvedTypeRef.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, nil);
- if AParent=nil then ;
- end;
- procedure TPasVariable.FreeChildren(Prepare: boolean);
- begin
- VarType:=TPasType(FreeChild(VarType,Prepare));
- LibraryName:=TPasExpr(FreeChild(LibraryName,Prepare));
- ExportName:=TPasExpr(FreeChild(ExportName,Prepare));
- AbsoluteExpr:=TPasExpr(FreeChild(AbsoluteExpr,Prepare));
- Expr:=TPasExpr(FreeChild(Expr,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasProperty.GetIsClass: boolean;
- begin
- Result:=vmClass in VarModifiers;
- end;
- procedure TPasProperty.SetIsClass(AValue: boolean);
- begin
- if AValue then
- Include(VarModifiers,vmClass)
- else
- Exclude(VarModifiers,vmClass);
- end;
- constructor TPasProperty.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- FArgs := TFPList.Create;
- end;
- destructor TPasProperty.Destroy;
- begin
- FreeAndNil(FArgs);
- SetLength(Implements,0);
- inherited Destroy;
- end;
- procedure TPasProperty.FreeChildren(Prepare: boolean);
- begin
- IndexExpr:=TPasExpr(FreeChild(IndexExpr,Prepare));
- ReadAccessor:=TPasExpr(FreeChild(ReadAccessor,Prepare));
- WriteAccessor:=TPasExpr(FreeChild(WriteAccessor,Prepare));
- DispIDExpr:=TPasExpr(FreeChild(DispIDExpr,Prepare));
- FreePasExprArray(Self,Implements,Prepare);
- StoredAccessor:=TPasExpr(FreeChild(StoredAccessor,Prepare));
- DefaultExpr:=TPasExpr(FreeChild(DefaultExpr,Prepare));
- inherited FreeChildren(Prepare);
- end;
- constructor TPasOverloadedProc.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Overloads := TFPList.Create;
- end;
- destructor TPasOverloadedProc.Destroy;
- begin
- FreeAndNil(Overloads);
- inherited Destroy;
- end;
- procedure TPasOverloadedProc.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Overloads,Prepare);
- inherited FreeChildren(Prepare);
- end;
- function TPasOverloadedProc.TypeName: TPasTreeString;
- begin
- if Assigned(TPasProcedure(Overloads[0]).ProcType) then
- Result := TPasProcedure(Overloads[0]).ProcType.TypeName
- else
- SetLength(Result, 0);
- end;
- procedure TPasOverloadedProc.ForEachCall(
- const aMethodCall: TOnForEachPasElement; const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to Overloads.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasProcedure(Overloads[i]),false);
- end;
- function TPasProcedure.GetCallingConvention: TCallingConvention;
- begin
- Result:=ccDefault;
- if Assigned(ProcType) then
- Result:=ProcType.CallingConvention;
- end;
- procedure TPasProcedure.SetCallingConvention(AValue: TCallingConvention);
- begin
- if Assigned(ProcType) then
- ProcType.CallingConvention:=AValue;
- end;
- destructor TPasProcedure.Destroy;
- begin
- FreeProcNameParts(NameParts);
- inherited Destroy;
- end;
- procedure TPasProcedure.FreeChildren(Prepare: boolean);
- begin
- PublicName:=TPasExpr(FreeChild(PublicName,Prepare));
- LibrarySymbolIndex:=TPasExpr(FreeChild(LibrarySymbolIndex,Prepare));
- LibrarySymbolName:=TPasExpr(FreeChild(LibrarySymbolName,Prepare));
- LibraryExpr:=TPasExpr(FreeChild(LibraryExpr,Prepare));
- DispIDExpr:=TPasExpr(FreeChild(DispIDExpr,Prepare));
- MessageExpr:=TPasExpr(FreeChild(MessageExpr,Prepare));
- ProcType:=TPasProcedureType(FreeChild(ProcType,Prepare));
- Body:=TProcedureBody(FreeChild(Body,Prepare));
- //FreeProcNameParts(Self,NameParts,Prepare);
- inherited FreeChildren(Prepare);
- end;
- function TPasProcedure.TypeName: TPasTreeString;
- begin
- Result := 'procedure';
- end;
- constructor TPasProcedureImpl.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Locals := TFPList.Create;
- end;
- destructor TPasProcedureImpl.Destroy;
- begin
- FreeAndNil(Locals);
- inherited Destroy;
- end;
- procedure TPasProcedureImpl.FreeChildren(Prepare: boolean);
- begin
- ProcType:=TPasProcedureType(FreeChild(ProcType,Prepare));
- FreeChildList(Locals,Prepare);
- Body:=TPasImplBlock(FreeChild(Body,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasProcedureImpl.TypeName: TPasTreeString;
- begin
- Result := ProcType.TypeName;
- end;
- function TPasConstructorImpl.TypeName: TPasTreeString;
- begin
- Result := 'constructor';
- end;
- function TPasDestructorImpl.TypeName: TPasTreeString;
- begin
- Result := 'destructor';
- end;
- constructor TPasImplCommands.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Commands := TStringList.Create;
- end;
- destructor TPasImplCommands.Destroy;
- begin
- FreeAndNil(Commands);
- inherited Destroy;
- end;
- procedure TPasImplIfElse.FreeChildren(Prepare: boolean);
- begin
- ConditionExpr:=TPasExpr(FreeChild(ConditionExpr,Prepare));
- IfBranch:=TPasImplElement(FreeChild(IfBranch,Prepare));
- ElseBranch:=TPasImplElement(FreeChild(ElseBranch,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplIfElse.AddElement(Element: TPasImplElement);
- begin
- inherited AddElement(Element);
- if IfBranch=nil then
- begin
- IfBranch:=Element;
- end
- else if ElseBranch=nil then
- begin
- ElseBranch:=Element;
- end
- else
- raise EPasTree.Create('TPasImplIfElse.AddElement if and else already set - please report this bug');
- end;
- function TPasImplIfElse.CloseOnSemicolon: boolean;
- begin
- Result:=ElseBranch<>nil;
- end;
- procedure TPasImplIfElse.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- ForEachChildCall(aMethodCall,Arg,ConditionExpr,false);
- if Elements.IndexOf(IfBranch)<0 then
- ForEachChildCall(aMethodCall,Arg,IfBranch,false);
- if Elements.IndexOf(ElseBranch)<0 then
- ForEachChildCall(aMethodCall,Arg,ElseBranch,false);
- inherited ForEachCall(aMethodCall, Arg);
- end;
- function TPasImplIfElse.Condition: TPasTreeString;
- begin
- If Assigned(ConditionExpr) then
- Result:=ConditionExpr.GetDeclaration(True)
- else
- Result:='';
- end;
- procedure TPasImplForLoop.FreeChildren(Prepare: boolean);
- begin
- VariableName:=TPasExpr(FreeChild(VariableName,Prepare));
- StartExpr:=TPasExpr(FreeChild(StartExpr,Prepare));
- EndExpr:=TPasExpr(FreeChild(EndExpr,Prepare));
- Variable:=TPasVariable(FreeChild(Variable,Prepare));
- VarType:=TPasType(FreeChild(VarType,Prepare));
- Body:=TPasImplElement(FreeChild(Body,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplForLoop.AddElement(Element: TPasImplElement);
- begin
- inherited AddElement(Element);
- if Body=nil then
- begin
- Body:=Element;
- end
- else
- raise EPasTree.Create('TPasImplForLoop.AddElement body already set - please report this bug');
- end;
- procedure TPasImplForLoop.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- ForEachChildCall(aMethodCall,Arg,VariableName,false);
- ForEachChildCall(aMethodCall,Arg,Variable,false);
- ForEachChildCall(aMethodCall,Arg,StartExpr,false);
- ForEachChildCall(aMethodCall,Arg,EndExpr,false);
- if Elements.IndexOf(Body)<0 then
- ForEachChildCall(aMethodCall,Arg,Body,false);
- inherited ForEachCall(aMethodCall, Arg);
- end;
- function TPasImplForLoop.Down: boolean;
- begin
- Result:=(LoopType=ltDown);
- end;
- function TPasImplForLoop.StartValue: TPasTreeString;
- begin
- If Assigned(StartExpr) then
- Result:=StartExpr.GetDeclaration(true)
- else
- Result:='';
- end;
- function TPasImplForLoop.EndValue: TPasTreeString;
- begin
- If Assigned(EndExpr) then
- Result:=EndExpr.GetDeclaration(true)
- else
- Result:='';
- end;
- constructor TPasImplBlock.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Elements := TFPList.Create;
- end;
- destructor TPasImplBlock.Destroy;
- begin
- FreeAndNil(Elements);
- inherited Destroy;
- end;
- procedure TPasImplBlock.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Elements,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplBlock.AddElement(Element: TPasImplElement);
- begin
- Elements.Add(Element);
- end;
- function TPasImplBlock.AddCommand(const ACommand: TPasTreeString): TPasImplCommand;
- begin
- Result := TPasImplCommand.Create('', Self);
- Result.Command := ACommand;
- AddElement(Result);
- end;
- function TPasImplBlock.AddCommands: TPasImplCommands;
- begin
- Result := TPasImplCommands.Create('', Self);
- AddElement(Result);
- end;
- function TPasImplBlock.AddBeginBlock: TPasImplBeginBlock;
- begin
- Result := TPasImplBeginBlock.Create('', Self);
- AddElement(Result);
- end;
- function TPasImplBlock.AddRepeatUntil: TPasImplRepeatUntil;
- begin
- Result := TPasImplRepeatUntil.Create('', Self);
- AddElement(Result);
- end;
- function TPasImplBlock.AddIfElse(const ACondition: TPasExpr): TPasImplIfElse;
- begin
- Result := TPasImplIfElse.Create('', Self);
- Result.ConditionExpr := ACondition;
- ACondition.Parent:=Result;
- AddElement(Result);
- end;
- function TPasImplBlock.AddWhileDo(const ACondition: TPasExpr): TPasImplWhileDo;
- begin
- Result := TPasImplWhileDo.Create('', Self);
- Result.ConditionExpr := ACondition;
- ACondition.Parent:=Result;
- AddElement(Result);
- end;
- function TPasImplBlock.AddWithDo(const Expression: TPasExpr): TPasImplWithDo;
- begin
- Result := TPasImplWithDo.Create('', Self);
- Result.AddExpression(Expression);
- AddElement(Result);
- end;
- function TPasImplBlock.AddCaseOf(const Expression: TPasExpr): TPasImplCaseOf;
- begin
- Result := TPasImplCaseOf.Create('', Self);
- Result.CaseExpr:= Expression;
- Expression.Parent:=Result;
- AddElement(Result);
- end;
- function TPasImplBlock.AddForLoop(AVar: TPasVariable; const AStartValue,
- AEndValue: TPasExpr): TPasImplForLoop;
- begin
- Result := TPasImplForLoop.Create('', Self);
- Result.Variable := AVar;
- Result.StartExpr := AStartValue;
- AStartValue.Parent := Result;
- Result.EndExpr := AEndValue;
- AEndValue.Parent := Result;
- AddElement(Result);
- end;
- function TPasImplBlock.AddForLoop(AVarName: TPasExpr; AStartValue,
- AEndValue: TPasExpr; ADownTo: Boolean): TPasImplForLoop;
- begin
- Result := TPasImplForLoop.Create('', Self);
- Result.VariableName := AVarName;
- Result.StartExpr := AStartValue;
- AStartValue.Parent := Result;
- Result.EndExpr := AEndValue;
- AEndValue.Parent := Result;
- if ADownto then
- Result.Looptype := ltDown;
- AddElement(Result);
- end;
- function TPasImplBlock.AddTry: TPasImplTry;
- begin
- Result := TPasImplTry.Create('', Self);
- AddElement(Result);
- end;
- function TPasImplBlock.AddExceptOn(const VarName, TypeName: TPasTreeString
- ): TPasImplExceptOn;
- begin
- Result:=AddExceptOn(VarName,TPasUnresolvedTypeRef.Create(TypeName,nil));
- end;
- function TPasImplBlock.AddExceptOn(const VarName: TPasTreeString; VarType: TPasType
- ): TPasImplExceptOn;
- var
- V: TPasVariable;
- begin
- V:=TPasVariable.Create(VarName,nil);
- V.VarType:=VarType;
- if VarType.Parent=nil then
- VarType.Parent:=V;
- Result:=AddExceptOn(V);
- end;
- function TPasImplBlock.AddExceptOn(const VarEl: TPasVariable): TPasImplExceptOn;
- begin
- Result:=TPasImplExceptOn.Create('',Self);
- Result.VarEl:=VarEl;
- VarEl.Parent:=Result;
- Result.TypeEl:=VarEl.VarType;
- AddElement(Result);
- end;
- function TPasImplBlock.AddExceptOn(const TypeEl: TPasType): TPasImplExceptOn;
- begin
- Result:=TPasImplExceptOn.Create('',Self);
- Result.TypeEl:=TypeEl;
- if TypeEl.Parent=nil then
- TypeEl.Parent:=Result;
- AddElement(Result);
- end;
- function TPasImplBlock.AddRaise: TPasImplRaise;
- begin
- Result:=TPasImplRaise.Create('',Self);
- AddElement(Result);
- end;
- function TPasImplBlock.AddLabelMark(const Id: TPasTreeString): TPasImplLabelMark;
- begin
- Result:=TPasImplLabelMark.Create('', Self);
- Result.LabelId:=Id;
- AddElement(Result);
- end;
- function TPasImplBlock.AddAssign(Left,Right:TPasExpr):TPasImplAssign;
- begin
- Result:=TPasImplAssign.Create('', Self);
- Result.Left:=Left;
- Left.Parent:=Result;
- Result.Right:=Right;
- Right.Parent:=Result;
- AddElement(Result);
- end;
- function TPasImplBlock.AddSimple(Expr:TPasExpr):TPasImplSimple;
- begin
- Result:=TPasImplSimple.Create('', Self);
- Result.Expr:=Expr;
- Expr.Parent:=Result;
- AddElement(Result);
- end;
- function TPasImplBlock.CloseOnSemicolon: boolean;
- begin
- Result:=false;
- end;
- procedure TPasImplBlock.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to Elements.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Elements[i]),false);
- end;
- { ---------------------------------------------------------------------
- ---------------------------------------------------------------------}
- function TPasModule.GetDeclaration(full : boolean): TPasTreeString;
- begin
- Result := 'Unit ' + SafeName;
- if full then ;
- end;
- procedure TPasModule.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,InterfaceSection,false);
- ForEachChildCall(aMethodCall,Arg,ImplementationSection,false);
- ForEachChildCall(aMethodCall,Arg,InitializationSection,false);
- ForEachChildCall(aMethodCall,Arg,FinalizationSection,false);
- end;
- function TPasResString.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- Result:=Expr.GetDeclaration(true);
- If Full Then
- begin
- Result:=SafeName+' = '+Result;
- ProcessHints(False,Result);
- end;
- end;
- procedure TPasResString.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Expr,false);
- end;
- procedure TPasResString.FreeChildren(Prepare: boolean);
- begin
- Expr:=TPasExpr(FreeChild(Expr,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasPointerType.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- Result:='^'+DestType.SafeName;
- If Full then
- begin
- Result:=SafeName+' = '+Result;
- ProcessHints(False,Result);
- end;
- end;
- procedure TPasPointerType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,DestType,true);
- end;
- procedure TPasPointerType.ClearTypeReferences(aType: TPasElement);
- begin
- if DestType=aType then
- DestType:=nil;
- end;
- function TPasAliasType.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- Result:=DestType.SafeName;
- If Full then
- Result:=FixTypeDecl(Result);
- end;
- procedure TPasAliasType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,DestType,true);
- ForEachChildCall(aMethodCall,Arg,Expr,false);
- end;
- procedure TPasAliasType.ClearTypeReferences(aType: TPasElement);
- begin
- if DestType=aType then
- DestType:=nil;
- end;
- function TPasClassOfType.GetDeclaration (full : boolean) : TPasTreeString;
- begin
- Result:='class of '+DestType.SafeName;
- If Full then
- Result:=FixTypeDecl(Result);
- end;
- function TPasRangeType.GetDeclaration (full : boolean) : TPasTreeString;
- begin
- Result:=RangeStart+'..'+RangeEnd;
- If Full then
- Result:=FixTypeDecl(Result);
- end;
- procedure TPasRangeType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,RangeExpr,false);
- end;
- procedure TPasRangeType.FreeChildren(Prepare: boolean);
- begin
- RangeExpr:=TBinaryExpr(FreeChild(RangeExpr,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasRangeType.RangeStart: TPasTreeString;
- begin
- Result:=RangeExpr.Left.GetDeclaration(False);
- end;
- function TPasRangeType.RangeEnd: TPasTreeString;
- begin
- Result:=RangeExpr.Right.GetDeclaration(False);
- end;
- function TPasArrayType.GetDeclaration (full : boolean) : TPasTreeString;
- begin
- Result:='Array';
- if Full then
- begin
- if GenericTemplateTypes<>nil then
- Result:=SafeName+GenericTemplateTypesAsString(GenericTemplateTypes)+' = '+Result
- else
- Result:=SafeName+' = '+Result;
- end;
- If (IndexRange<>'') then
- Result:=Result+'['+IndexRange+']';
- Result:=Result+' of ';
- If IsPacked then
- Result := 'packed '+Result; // 12/04/04 Dave - Added
- If Assigned(Eltype) then
- Result:=Result+ElType.SafeName
- else
- Result:=Result+'const';
- end;
- function TPasArrayType.IsGenericArray: Boolean;
- begin
- Result:=GenericTemplateTypes<>nil;
- end;
- function TPasArrayType.IsPacked: Boolean;
- begin
- Result:=PackMode=pmPacked;
- end;
- procedure TPasArrayType.AddRange(Range: TPasExpr);
- var
- i: Integer;
- begin
- i:=Length(Ranges);
- SetLength(Ranges, i+1);
- Ranges[i]:=Range;
- end;
- function TPasFileType.GetDeclaration (full : boolean) : TPasTreeString;
- begin
- Result:='File';
- If Assigned(Eltype) then
- Result:=Result+' of '+ElType.SafeName;
- If Full Then
- Result:=FixTypeDecl(Result);
- end;
- procedure TPasFileType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,ElType,true);
- end;
- function TPasEnumType.GetDeclaration (full : boolean) : TPasTreeString;
- Var
- S : TStringList;
- begin
- S:=TStringList.Create;
- Try
- If Full and (Name<>'') then
- S.Add(SafeName+' = (')
- else
- S.Add('(');
- GetEnumNames(S);
- S[S.Count-1]:=S[S.Count-1]+')';
- If Full then
- Result:=IndentStrings(S,Length(SafeName)+4)
- else
- Result:=IndentStrings(S,1);
- if Full then
- ProcessHints(False,Result);
- finally
- S.Free;
- end;
- end;
- procedure TPasSetType.FreeChildren(Prepare: boolean);
- begin
- EnumType:=TPasTypeRef(FreeChild(EnumType,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasSetType.ClearTypeReferences(aType: TPasElement);
- begin
- if EnumType=aType then
- EnumType:=nil;
- end;
- function TPasSetType.GetDeclaration (full : boolean) : TPasTreeString;
- Var
- S : TStringList;
- i : Integer;
- begin
- If (EnumType is TPasEnumType) and (EnumType.Name='') then
- begin
- S:=TStringList.Create;
- Try
- If Full and (Name<>'') then
- S.Add(SafeName+'= Set of (')
- else
- S.Add('Set of (');
- TPasEnumType(EnumType).GetEnumNames(S);
- S[S.Count-1]:=S[S.Count-1]+')';
- I:=Pos('(',S[0]);
- Result:=IndentStrings(S,i);
- finally
- S.Free;
- end;
- end
- else
- begin
- Result:='Set of '+EnumType.SafeName;
- If Full then
- Result:=SafeName+' = '+Result;
- end;
- If Full then
- ProcessHints(False,Result);
- end;
- procedure TPasSetType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,EnumType,true);
- end;
- { TPasMembersType }
- constructor TPasMembersType.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- PackMode:=pmNone;
- Members := TFPList.Create;
- GenericTemplateTypes:=TFPList.Create;
- end;
- destructor TPasMembersType.Destroy;
- begin
- FreeAndNil(GenericTemplateTypes);
- FreeAndNil(Members);
- inherited Destroy;
- end;
- procedure TPasMembersType.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(GenericTemplateTypes,Prepare);
- FreeChildList(Members,Prepare);
- inherited FreeChildren(Prepare);
- end;
- function TPasMembersType.IsPacked: Boolean;
- begin
- Result:=(PackMode <> pmNone);
- end;
- function TPasMembersType.IsBitPacked: Boolean;
- begin
- Result:=(PackMode=pmBitPacked)
- end;
- procedure TPasMembersType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to Members.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Members[i]),false);
- end;
- { TPasRecordType }
- procedure TPasRecordType.GetMembers(S: TStrings);
- Var
- T : TStringList;
- temp : TPasTreeString;
- I,J : integer;
- E : TPasElement;
- CV : TPasMemberVisibility ;
- begin
- T:=TStringList.Create;
- try
- CV:=visDefault;
- For I:=0 to Members.Count-1 do
- begin
- E:=TPasElement(Members[i]);
- if E.Visibility<>CV then
- begin
- CV:=E.Visibility;
- if CV<>visDefault then
- S.Add(VisibilityNames[CV]);
- end;
- Temp:=E.GetDeclaration(True);
- If E is TPasProperty then
- Temp:='property '+Temp;
- If Pos(LineEnding,Temp)>0 then
- begin
- T.Text:=Temp;
- For J:=0 to T.Count-1 do
- if J=T.Count-1 then
- S.Add(' '+T[J]+';')
- else
- S.Add(' '+T[J])
- end
- else
- S.Add(' '+Temp+';');
- end;
- if Variants<>nil then
- begin
- temp:='case ';
- if (VariantEl is TPasVariable) then
- temp:=Temp+VariantEl.Name+' : '+TPasVariable(VariantEl).VarType.Name
- else if (VariantEl<>Nil) then
- temp:=temp+VariantEl.Name;
- S.Add(temp+' of');
- T.Clear;
- For I:=0 to Variants.Count-1 do
- T.Add(TPasVariant(Variants[i]).GetDeclaration(True));
- S.AddStrings(T);
- end;
- finally
- T.Free;
- end;
- end;
- function TPasRecordType.GetDeclaration (full : boolean) : TPasTreeString;
- Var
- S : TStringList;
- temp : TPasTreeString;
- begin
- S:=TStringList.Create;
- Try
- Temp:='record';
- If IsPacked then
- if IsBitPacked then
- Temp:='bitpacked '+Temp
- else
- Temp:='packed '+Temp;
- If Full and (Name<>'') then
- begin
- if GenericTemplateTypes.Count>0 then
- Temp:=SafeName+GenericTemplateTypesAsString(GenericTemplateTypes)+' = '+Temp
- else
- Temp:=SafeName+' = '+Temp;
- end;
- S.Add(Temp);
- GetMembers(S);
- S.Add('end');
- Result:=S.Text;
- if Full then
- ProcessHints(False, Result);
- finally
- S.free;
- end;
- end;
- procedure TPasRecordType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,VariantEl,true);
- if Variants<>nil then
- for i:=0 to Variants.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Variants[i]),false);
- end;
- function TPasRecordType.IsAdvancedRecord: Boolean;
- Var
- I : Integer;
- Member: TPasElement;
- begin
- Result:=False;
- For I:=0 to Members.Count-1 do
- begin
- Member:=TPasElement(Members[i]);
- if (Member.Visibility<>visPublic) then
- Exit(True);
- if (Member.ClassType<>TPasVariable) then
- Exit(True);
- end;
- end;
- procedure TPasProcedureType.GetArguments(List : TStrings);
- Var
- T : TPasTreeString;
- I : Integer;
- begin
- For I:=0 to Args.Count-1 do
- begin
- T:=AccessNames[TPasArgument(Args[i]).Access];
- T:=T+TPasArgument(Args[i]).GetDeclaration(True);
- If I=0 then
- T:='('+T;
- If I<Args.Count-1 then
- List.Add(T+'; ')
- else
- List.Add(T+')');
- end;
- end;
- function TPasProcedureType.GetDeclaration (full : boolean) : TPasTreeString;
- Var
- S : TStringList;
- begin
- S:=TStringList.Create;
- Try
- If Full then
- S.Add(Format('%s = ',[SafeName]));
- S.Add(TypeName);
- GetArguments(S);
- If IsOfObject then
- S.Add(' of object')
- else if IsNested then
- S.Add(' is nested');
- If Full then
- Result:=IndentStrings(S,Length(S[0])+Length(S[1])+1)
- else
- Result:=IndentStrings(S,Length(S[0])+1);
- finally
- S.Free;
- end;
- end;
- function TPasFunctionType.GetDeclaration(Full: boolean): TPasTreeString;
- Var
- S : TStringList;
- T : TPasTreeString;
- begin
- S:=TStringList.Create;
- Try
- If Full then
- S.Add(Format('%s = ',[SafeName]));
- S.Add(TypeName);
- GetArguments(S);
- If Assigned(ResultEl) then
- begin
- T:=' : ';
- If (ResultEl.ResultType.Name<>'') then
- T:=T+ResultEl.ResultType.SafeName
- else
- T:=T+ResultEl.ResultType.GetDeclaration(False);
- S.Add(T);
- end;
- If IsOfObject then
- S.Add(' of object');
- If Full then
- Result:=IndentStrings(S,Length(S[0])+Length(S[1])+1)
- else
- Result:=IndentStrings(S,Length(S[0])+1);
- finally
- S.Free;
- end;
- end;
- procedure TPasFunctionType.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,ResultEl,false);
- end;
- function TPasVariable.GetDeclaration (full : boolean) : TPasTreeString;
- Const
- Seps : Array[Boolean] of Char = ('=',':');
- begin
- If Assigned(VarType) then
- begin
- If VarType.Name='' then
- Result:=VarType.GetDeclaration(False)
- else
- Result:=VarType.SafeName;
- Result:=Result+Modifiers;
- if (Value<>'') then
- Result:=Result+' = '+Value;
- end
- else
- Result:=Value;
- If Full then
- begin
- Result:=SafeName+' '+Seps[Assigned(VarType)]+' '+Result;
- Result:=Result+HintsString;
- end;
- end;
- procedure TPasVariable.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,VarType,true);
- ForEachChildCall(aMethodCall,Arg,Expr,false);
- ForEachChildCall(aMethodCall,Arg,LibraryName,false);
- ForEachChildCall(aMethodCall,Arg,ExportName,false);
- ForEachChildCall(aMethodCall,Arg,AbsoluteExpr,false);
- end;
- procedure TPasVariable.ClearTypeReferences(aType: TPasElement);
- begin
- if VarType=aType then
- VarType:=nil;
- end;
- function TPasVariable.Value: TPasTreeString;
- begin
- If Assigned(Expr) then
- Result:=Expr.GetDeclaration(True)
- else
- Result:='';
- end;
- function TPasProperty.GetDeclaration (full : boolean) : TPasTreeString;
- Var
- S : TPasTreeString;
- I : Integer;
- begin
- Result:='';
- If Assigned(VarType) then
- begin
- If VarType.Name='' then
- Result:=VarType.GetDeclaration(False)
- else
- Result:=VarType.SafeName;
- end
- else if Assigned(Expr) then
- Result:=Expr.GetDeclaration(True);
- S:='';
- If Assigned(Args) and (Args.Count>0) then
- begin
- For I:=0 to Args.Count-1 do
- begin
- If (S<>'') then
- S:=S+';';
- S:=S+TPasElement(Args[i]).GetDeclaration(true);
- end;
- end;
- If S<>'' then
- S:='['+S+']'
- else
- S:=' ';
- If Full then
- begin
- Result:=SafeName+S+': '+Result;
- If (ImplementsName<>'') then
- Result:=Result+' implements '+EscapeKeyWord(ImplementsName);
- end;
- If IsDefault then
- Result:=Result+'; default';
- ProcessHints(True, Result);
- end;
- procedure TPasProperty.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,IndexExpr,false);
- for i:=0 to Args.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Args[i]),false);
- ForEachChildCall(aMethodCall,Arg,ReadAccessor,false);
- ForEachChildCall(aMethodCall,Arg,WriteAccessor,false);
- for i:=0 to length(Implements)-1 do
- ForEachChildCall(aMethodCall,Arg,Implements[i],false);
- ForEachChildCall(aMethodCall,Arg,StoredAccessor,false);
- ForEachChildCall(aMethodCall,Arg,DefaultExpr,false);
- end;
- function TPasProperty.ResolvedType: TPasType;
- Function GC(P : TPasProperty) : TPasClassType;
- begin
- if Assigned(P) and Assigned(P.Parent) and (P.Parent is TPasClassType) then
- Result:=P.Parent as TPasClassType
- else
- Result:=Nil;
- end;
- Var
- P : TPasProperty;
- C : TPasClassType;
- begin
- Result:=FResolvedType;
- if Result=Nil then
- Result:=VarType;
- P:=Self;
- While (Result=Nil) and (P<>Nil) do
- begin
- C:=GC(P);
- // Writeln('Looking for ',Name,' in ancestor ',C.Name);
- P:=TPasProperty(C.FindMemberInAncestors(TPasProperty,Name));
- if Assigned(P) then
- begin
- // Writeln('Found ',Name,' in ancestor : ',P.Name);
- Result:=P.ResolvedType;
- end
- end;
- end;
- function TPasProperty.IndexValue: TPasTreeString;
- begin
- If Assigned(IndexExpr) then
- Result:=IndexExpr.GetDeclaration(true)
- else
- Result:='';
- end;
- function TPasProperty.DefaultValue: TPasTreeString;
- begin
- If Assigned(DefaultExpr) then
- Result:=DefaultExpr.GetDeclaration(true)
- else
- Result:='';
- end;
- procedure TPasProcedure.GetModifiers(List: TStrings);
- Procedure DoAdd(B : Boolean; S : TPasTreeString);
- begin
- if B then
- List.add('; '+S);
- end;
- begin
- Doadd(IsVirtual,' Virtual');
- DoAdd(IsDynamic,' Dynamic');
- DoAdd(IsOverride,' Override');
- DoAdd(IsAbstract,' Abstract');
- DoAdd(IsOverload,' Overload');
- DoAdd(IsReintroduced,' Reintroduce');
- DoAdd(IsStatic,' Static');
- DoAdd(IsMessage,' Message');
- end;
- procedure TPasProcedure.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i, j: Integer;
- Templates: TFPList;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- if NameParts<>nil then
- for i:=0 to NameParts.Count-1 do
- begin
- Templates:=TProcedureNamePart(NameParts[i]).Templates;
- if Templates<>nil then
- for j:=0 to Templates.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Templates[j]),false);
- end;
- ForEachChildCall(aMethodCall,Arg,ProcType,false);
- ForEachChildCall(aMethodCall,Arg,PublicName,false);
- ForEachChildCall(aMethodCall,Arg,LibraryExpr,false);
- ForEachChildCall(aMethodCall,Arg,LibrarySymbolName,false);
- ForEachChildCall(aMethodCall,Arg,MessageExpr,false);
- ForEachChildCall(aMethodCall,Arg,Body,false);
- end;
- procedure TPasProcedure.AddModifier(AModifier: TProcedureModifier);
- begin
- Include(FModifiers,AModifier);
- end;
- function TPasProcedure.CanParseImplementation: Boolean;
- begin
- Result:=not HasNoImplementation
- and ((Parent is TImplementationSection) or (Parent is TProcedureBody));
- end;
- function TPasProcedure.HasNoImplementation: Boolean;
- begin
- Result:=IsExternal or IsForward or IsInternProc;
- end;
- function TPasProcedure.IsVirtual: Boolean;
- begin
- Result:=pmVirtual in FModifiers;
- end;
- function TPasProcedure.IsDynamic: Boolean;
- begin
- Result:=pmDynamic in FModifiers;
- end;
- function TPasProcedure.IsAbstract: Boolean;
- begin
- Result:=pmAbstract in FModifiers;
- end;
- function TPasProcedure.IsOverride: Boolean;
- begin
- Result:=pmOverride in FModifiers;
- end;
- function TPasProcedure.IsExported: Boolean;
- begin
- Result:=pmExport in FModifiers;
- end;
- function TPasProcedure.IsExternal: Boolean;
- begin
- Result:=pmExternal in FModifiers;
- end;
- function TPasProcedure.IsOverload: Boolean;
- begin
- Result:=pmOverload in FModifiers;
- end;
- function TPasProcedure.IsMessage: Boolean;
- begin
- Result:=pmMessage in FModifiers;
- end;
- function TPasProcedure.IsReintroduced: Boolean;
- begin
- Result:=pmReintroduce in FModifiers;
- end;
- function TPasProcedure.IsStatic: Boolean;
- begin
- Result:=ptmStatic in ProcType.Modifiers;
- end;
- function TPasProcedure.IsForward: Boolean;
- begin
- Result:=pmForward in FModifiers;
- end;
- function TPasProcedure.IsCompilerProc: Boolean;
- begin
- Result:=pmCompilerProc in FModifiers;
- end;
- function TPasProcedure.IsInternProc: Boolean;
- begin
- Result:=pmInternProc in FModifiers;
- end;
- function TPasProcedure.IsAssembler: Boolean;
- begin
- Result:=pmAssembler in FModifiers;
- end;
- function TPasProcedure.IsAsync: Boolean;
- begin
- Result:=ProcType.IsAsync;
- end;
- function TPasProcedure.GetProcTypeEnum: TProcType;
- begin
- Result:=ptProcedure;
- end;
- procedure TPasProcedure.SetNameParts(Parts: TProcedureNameParts);
- var
- i, j: Integer;
- El: TPasElement;
- begin
- if NameParts<>nil then
- FreeProcNameParts(NameParts);
- NameParts:=TFPList.Create;
- NameParts.Assign(Parts);
- Parts.Clear;
- for i:=0 to NameParts.Count-1 do
- with TProcedureNamePart(NameParts[i]) do
- if Templates<>nil then
- for j:=0 to Templates.Count-1 do
- begin
- El:=TPasElement(Templates[j]);
- El.Parent:=Self;
- end;
- end;
- function TPasProcedure.GetDeclaration(full: Boolean): TPasTreeString;
- Var
- S : TStringList;
- T: TPasTreeString;
- i: Integer;
- begin
- S:=TStringList.Create;
- try
- If Full then
- begin
- T:=TypeName;
- if NameParts<>nil then
- begin
- T:=T+' ';
- for i:=0 to NameParts.Count-1 do
- begin
- if i>0 then
- T:=T+'.';
- with TProcedureNamePart(NameParts[i]) do
- begin
- T:=T+Name;
- if Templates<>nil then
- T:=T+GenericTemplateTypesAsString(Templates);
- end;
- end;
- end
- else if Name<>'' then
- T:=T+' '+SafeName;
- S.Add(T);
- end;
- ProcType.GetArguments(S);
- If (ProcType is TPasFunctionType)
- and Assigned(TPasFunctionType(Proctype).ResultEl) then
- With TPasFunctionType(ProcType).ResultEl.ResultType do
- begin
- T:=' : ';
- If (Name<>'') then
- T:=T+SafeName
- else
- T:=T+GetDeclaration(False);
- S.Add(T);
- end;
- GetModifiers(S);
- Result:=IndentStrings(S,Length(S[0]));
- finally
- S.Free;
- end;
- end;
- function TPasFunction.TypeName: TPasTreeString;
- begin
- Result:='function';
- end;
- function TPasFunction.GetProcTypeEnum: TProcType;
- begin
- Result:=ptFunction;
- end;
- function TPasOperator.GetOperatorDeclaration(Full : Boolean) : TPasTreeString;
- begin
- if Full then
- begin
- Result:=FullPath;
- if (Result<>'') then
- Result:=Result+'.';
- end
- else
- Result:='';
- if TokenBased then
- Result:=Result+TypeName+' '+OperatorTypeToToken(OperatorType)
- else
- Result:=Result+TypeName+' '+OperatorTypeToOperatorName(OperatorType);
- end;
- function TPasOperator.GetDeclaration (full : boolean) : TPasTreeString;
- Var
- S : TStringList;
- T : TPasTreeString;
- begin
- S:=TStringList.Create;
- try
- If Full then
- S.Add(GetOperatorDeclaration(Full));
- ProcType.GetArguments(S);
- If Assigned((Proctype as TPasFunctionType).ResultEl) then
- if Assigned(TPasFunctionType(ProcType).ResultEl.ResultType) then
- With TPasFunctionType(ProcType).ResultEl.ResultType do
- begin
- T:=' : ';
- If (Name<>'') then
- T:=T+SafeName
- else
- T:=T+GetDeclaration(False);
- S.Add(T);
- end;
- GetModifiers(S);
- Result:=IndentStrings(S,Length(S[0]));
- finally
- S.Free;
- end;
- end;
- function TPasOperator.TypeName: TPasTreeString;
- begin
- Result:='operator';
- end;
- function TPasOperator.GetProcTypeEnum: TProcType;
- begin
- Result:=ptOperator;
- end;
- function TPasClassProcedure.TypeName: TPasTreeString;
- begin
- Result:='class procedure';
- end;
- function TPasClassProcedure.GetProcTypeEnum: TProcType;
- begin
- Result:=ptClassProcedure;
- end;
- function TPasClassFunction.TypeName: TPasTreeString;
- begin
- Result:='class function';
- end;
- function TPasClassFunction.GetProcTypeEnum: TProcType;
- begin
- Result:=ptClassFunction;
- end;
- function TPasConstructor.TypeName: TPasTreeString;
- begin
- Result:='constructor';
- end;
- function TPasConstructor.GetProcTypeEnum: TProcType;
- begin
- Result:=ptConstructor;
- end;
- function TPasDestructor.TypeName: TPasTreeString;
- begin
- Result:='destructor';
- end;
- function TPasDestructor.GetProcTypeEnum: TProcType;
- begin
- Result:=ptDestructor;
- end;
- { TPassTreeVisitor }
- procedure TPassTreeVisitor.Visit(obj: TPasElement);
- begin
- // Needs to be implemented by descendents.
- if Obj=nil then ;
- end;
- { TPasSection }
- constructor TPasSection.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- UsesList := TFPList.Create;
- end;
- destructor TPasSection.Destroy;
- begin
- FreeAndNil(UsesList);
- {$IFDEF VerbosePasTreeMem}writeln('TPasSection.Destroy inherited');{$ENDIF}
- inherited Destroy;
- {$IFDEF VerbosePasTreeMem}writeln('TPasSection.Destroy END');{$ENDIF}
- end;
- procedure TPasSection.FreeChildren(Prepare: boolean);
- var
- i: Integer;
- begin
- FreeChildList(UsesList,Prepare);
- for i := 0 to high(UsesClause) do
- UsesClause[i]:=TPasUsesUnit(FreeChild(UsesClause[i],Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasSection.AddUnitToUsesList(const AUnitName: TPasTreeString;
- aName: TPasExpr; InFilename: TPrimitiveExpr; aModule: TPasElement;
- UsesUnit: TPasUsesUnit): TPasUsesUnit;
- var
- l: Integer;
- begin
- if (InFilename<>nil) and (InFilename.Kind<>pekString) then
- raise EPasTree.Create('Wrong In expression for '+aUnitName);
- if aModule=nil then
- aModule:=TPasUnresolvedUnitRef.Create(AUnitName, Self);
- l:=length(UsesClause);
- SetLength(UsesClause,l+1);
- if UsesUnit=nil then
- begin
- UsesUnit:=TPasUsesUnit.Create(AUnitName,Self);
- if aName<>nil then
- begin
- UsesUnit.SourceFilename:=aName.SourceFilename;
- UsesUnit.SourceLinenumber:=aName.SourceLinenumber;
- end;
- end;
- UsesClause[l]:=UsesUnit;
- UsesUnit.Expr:=aName;
- UsesUnit.InFilename:=InFilename;
- UsesUnit.Module:=aModule;
- Result:=UsesUnit;
- UsesList.Add(aModule);
- end;
- function TPasSection.ElementTypeName: TPasTreeString;
- begin
- Result := SPasTreeSection;
- end;
- procedure TPasSection.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to length(UsesClause)-1 do
- ForEachChildCall(aMethodCall,Arg,UsesClause[i],false);
- end;
- { TProcedureBody }
- procedure TProcedureBody.FreeChildren(Prepare: boolean);
- begin
- Body:=TPasImplBlock(FreeChild(Body,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TProcedureBody.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Body,false);
- end;
- { TPasImplWhileDo }
- procedure TPasImplWhileDo.FreeChildren(Prepare: boolean);
- begin
- ConditionExpr:=TPasExpr(FreeChild(ConditionExpr,Prepare));
- Body:=TPasImplElement(FreeChild(Body,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplWhileDo.AddElement(Element: TPasImplElement);
- begin
- inherited AddElement(Element);
- if Body=nil then
- begin
- Body:=Element;
- end
- else
- raise EPasTree.Create('TPasImplWhileDo.AddElement body already set');
- end;
- procedure TPasImplWhileDo.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- ForEachChildCall(aMethodCall,Arg,ConditionExpr,false);
- if Elements.IndexOf(Body)<0 then
- ForEachChildCall(aMethodCall,Arg,Body,false);
- inherited ForEachCall(aMethodCall, Arg);
- end;
- function TPasImplWhileDo.Condition: TPasTreeString;
- begin
- If Assigned(ConditionExpr) then
- Result:=ConditionExpr.GetDeclaration(True)
- else
- Result:='';
- end;
- { TPasImplCaseOf }
- procedure TPasImplCaseOf.FreeChildren(Prepare: boolean);
- begin
- CaseExpr:=TPasExpr(FreeChild(CaseExpr,Prepare));
- ElseBranch:=TPasImplCaseElse(FreeChild(ElseBranch,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasImplCaseOf.AddCase(const Expression: TPasExpr
- ): TPasImplCaseStatement;
- begin
- Result:=TPasImplCaseStatement.Create('',Self);
- Result.AddExpression(Expression);
- AddElement(Result);
- end;
- function TPasImplCaseOf.AddElse: TPasImplCaseElse;
- begin
- Result:=TPasImplCaseElse.Create('',Self);
- ElseBranch:=Result;
- AddElement(Result);
- end;
- procedure TPasImplCaseOf.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- ForEachChildCall(aMethodCall,Arg,CaseExpr,false);
- if Elements.IndexOf(ElseBranch)<0 then
- ForEachChildCall(aMethodCall,Arg,ElseBranch,false);
- inherited ForEachCall(aMethodCall, Arg);
- end;
- function TPasImplCaseOf.Expression: TPasTreeString;
- begin
- if Assigned(CaseExpr) then
- Result:=CaseExpr.GetDeclaration(True)
- else
- Result:='';
- end;
- { TPasImplCaseStatement }
- constructor TPasImplCaseStatement.Create(const AName: TPasTreeString;
- AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Expressions:=TFPList.Create;
- end;
- destructor TPasImplCaseStatement.Destroy;
- begin
- FreeAndNil(Expressions);
- inherited Destroy;
- end;
- procedure TPasImplCaseStatement.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Expressions,Prepare);
- Body:=TPasImplElement(FreeChild(Body,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplCaseStatement.AddElement(Element: TPasImplElement);
- begin
- inherited AddElement(Element);
- if Body=nil then
- begin
- Body:=Element;
- end
- else
- raise EPasTree.Create('TPasImplCaseStatement.AddElement body already set');
- end;
- procedure TPasImplCaseStatement.AddExpression(const Expr: TPasExpr);
- begin
- Expressions.Add(Expr);
- Expr.Parent:=Self;
- end;
- procedure TPasImplCaseStatement.ForEachCall(
- const aMethodCall: TOnForEachPasElement; const Arg: Pointer);
- var
- i: Integer;
- begin
- for i:=0 to Expressions.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Expressions[i]),false);
- if Elements.IndexOf(Body)<0 then
- ForEachChildCall(aMethodCall,Arg,Body,false);
- inherited ForEachCall(aMethodCall, Arg);
- end;
- { TPasImplWithDo }
- constructor TPasImplWithDo.Create(const AName: TPasTreeString; AParent: TPasElement);
- begin
- inherited Create(AName, AParent);
- Expressions:=TFPList.Create;
- end;
- destructor TPasImplWithDo.Destroy;
- begin
- FreeAndNil(Expressions);
- inherited Destroy;
- end;
- procedure TPasImplWithDo.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Expressions,Prepare);
- Body:=TPasImplElement(FreeChild(Body,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplWithDo.AddElement(Element: TPasImplElement);
- begin
- inherited AddElement(Element);
- if Body=nil then
- begin
- Body:=Element;
- end
- else
- raise EPasTree.Create('TPasImplWithDo.AddElement body already set');
- end;
- procedure TPasImplWithDo.AddExpression(const Expression: TPasExpr);
- begin
- Expressions.Add(Expression);
- if Expression.Parent=nil then
- Expression.Parent:=Self;
- end;
- procedure TPasImplWithDo.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- for i:=0 to Expressions.Count-1 do
- ForEachChildCall(aMethodCall,Arg,TPasElement(Expressions[i]),false);
- if Elements.IndexOf(Body)<0 then
- ForEachChildCall(aMethodCall,Arg,Body,false);
- inherited ForEachCall(aMethodCall, Arg);
- end;
- { TPasInlineVarDeclStatement }
- constructor TPasInlineVarDeclStatement.Create(const aName: TPasTreeString; aParent: TPasElement);
- begin
- inherited Create(aName,aParent);
- Declarations:=TFPList.Create;
- end;
- procedure TPasInlineVarDeclStatement.FreeChildren(Prepare: boolean);
- begin
- FreeChildList(Declarations,Prepare);
- inherited FreeChildren(Prepare);
- end;
- destructor TPasInlineVarDeclStatement.Destroy;
- begin
- inherited Destroy;
- FreeAndNil(Declarations)
- end;
- { TPasImplTry }
- procedure TPasImplTry.FreeChildren(Prepare: boolean);
- begin
- FinallyExcept:=TPasImplTryHandler(FreeChild(FinallyExcept,Prepare));
- ElseBranch:=TPasImplTryExceptElse(FreeChild(ElseBranch,Prepare));
- inherited FreeChildren(Prepare);
- end;
- function TPasImplTry.AddFinally: TPasImplTryFinally;
- begin
- Result:=TPasImplTryFinally.Create('',Self);
- FinallyExcept:=Result;
- end;
- function TPasImplTry.AddExcept: TPasImplTryExcept;
- begin
- Result:=TPasImplTryExcept.Create('',Self);
- FinallyExcept:=Result;
- end;
- function TPasImplTry.AddExceptElse: TPasImplTryExceptElse;
- begin
- Result:=TPasImplTryExceptElse.Create('',Self);
- ElseBranch:=Result;
- end;
- procedure TPasImplTry.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,FinallyExcept,false);
- ForEachChildCall(aMethodCall,Arg,ElseBranch,false);
- end;
- { TPasImplExceptOn }
- procedure TPasImplExceptOn.FreeChildren(Prepare: boolean);
- begin
- VarEl:=TPasVariable(FreeChild(VarEl,Prepare));
- TypeEl:=TPasType(FreeChild(TypeEl,Prepare));
- Body:=TPasImplElement(FreeChild(Body,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TPasImplExceptOn.AddElement(Element: TPasImplElement);
- begin
- inherited AddElement(Element);
- if Body=nil then
- Body:=Element;
- end;
- procedure TPasImplExceptOn.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- ForEachChildCall(aMethodCall,Arg,VarEl,false);
- ForEachChildCall(aMethodCall,Arg,TypeEl,true);
- if Elements.IndexOf(Body)<0 then
- ForEachChildCall(aMethodCall,Arg,Body,false);
- inherited ForEachCall(aMethodCall, Arg);
- end;
- procedure TPasImplExceptOn.ClearTypeReferences(aType: TPasElement);
- begin
- if TypeEl=aType then
- TypeEl:=nil;
- end;
- function TPasImplExceptOn.VariableName: TPasTreeString;
- begin
- If assigned(VarEl) then
- Result:=VarEl.Name
- else
- Result:='';
- end;
- function TPasImplExceptOn.TypeName: TPasTreeString;
- begin
- If assigned(TypeEl) then
- Result:=TypeEl.GetDeclaration(True)
- else
- Result:='';
- end;
- { TPasImplStatement }
- function TPasImplStatement.CloseOnSemicolon: boolean;
- begin
- Result:=true;
- end;
- { TPasExpr }
- constructor TPasExpr.Create(AParent: TPasElement; AKind: TPasExprKind;
- AOpCode: TExprOpCode);
- begin
- inherited Create(ClassName, AParent);
- Kind:=AKind;
- OpCode:=AOpCode;
- end;
- procedure TPasExpr.FreeChildren(Prepare: boolean);
- begin
- Format1:=TPasExpr(FreeChild(Format1,Prepare));
- Format2:=TPasExpr(FreeChild(Format2,Prepare));
- inherited FreeChildren(Prepare);
- end;
- { TPrimitiveExpr }
- function TPrimitiveExpr.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- Result:=Value;
- if full then ;
- end;
- constructor TPrimitiveExpr.Create(AParent : TPasElement; AKind: TPasExprKind; const AValue : TPasTreeString);
- begin
- inherited Create(AParent,AKind, eopNone);
- Value:=AValue;
- end;
- { TBoolConstExpr }
- constructor TBoolConstExpr.Create(AParent : TPasElement; AKind: TPasExprKind; const ABoolValue : Boolean);
- begin
- inherited Create(AParent,AKind, eopNone);
- Value:=ABoolValue;
- end;
- function TBoolConstExpr.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- If Value then
- Result:='True'
- else
- Result:='False';
- if full then ;
- end;
- { TUnaryExpr }
- function TUnaryExpr.GetDeclaration(full: Boolean): TPasTreeString;
- Const
- WordOpcodes = [eopDiv,eopMod,eopshr,eopshl,eopNot,eopAnd,eopOr,eopXor];
- begin
- Result:=OpCodeStrings[Opcode];
- if OpCode in WordOpCodes then
- Result:=Result+' ';
- If Assigned(Operand) then
- Result:=Result+' '+Operand.GetDeclaration(Full);
- end;
- constructor TUnaryExpr.Create(AParent : TPasElement; AOperand: TPasExpr; AOpCode: TExprOpCode);
- begin
- inherited Create(AParent,pekUnary, AOpCode);
- Operand:=AOperand;
- Operand.Parent:=Self;
- end;
- procedure TUnaryExpr.FreeChildren(Prepare: boolean);
- begin
- Operand:=TPasExpr(FreeChild(Operand,Prepare));
- inherited FreeChildren(Prepare);
- end;
- procedure TUnaryExpr.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Operand,false);
- end;
- { TBinaryExpr }
- function TBinaryExpr.GetDeclaration(full: Boolean): TPasTreeString;
- function OpLevel(op: TPasExpr): Integer;
- begin
- case op.OpCode of
- eopNot,eopAddress:
- Result := 4;
- eopMultiply, eopDivide, eopDiv, eopMod, eopAnd, eopShl,
- eopShr, eopAs, eopPower:
- Result := 3;
- eopAdd, eopSubtract, eopOr, eopXor:
- Result := 2;
- eopEqual, eopNotEqual, eopLessThan, eopLessthanEqual, eopGreaterThan,
- eopGreaterThanEqual, eopIn, eopIs:
- Result := 1;
- else
- Result := 5; // Numbers and Identifiers
- end;
- end;
- var op: TPasTreeString;
- begin
- If Kind=pekRange then
- Result:='..'
- else
- begin
- Result:=OpcodeStrings[Opcode];
- if Not (OpCode in [eopAddress,eopDeref,eopSubIdent]) then
- Result:=' '+Result+' ';
- end;
- If Assigned(Left) then
- begin
- op := Left.GetDeclaration(Full);
- if OpLevel(Left) < OpLevel(Self) then
- Result := '(' + op + ')' + Result
- else
- Result := op + Result;
- end;
- If Assigned(Right) then
- begin
- op := Right.GetDeclaration(Full);
- if OpLevel(Left) < OpLevel(Self) then
- Result := Result + '(' + op + ')'
- else
- Result := Result + op;
- end;
- end;
- constructor TBinaryExpr.Create(AParent : TPasElement; xleft,xright:TPasExpr; AOpCode:TExprOpCode);
- begin
- inherited Create(AParent,pekBinary, AOpCode);
- Left:=xleft;
- Left.Parent:=Self;
- Right:=xright;
- Right.Parent:=Self;
- end;
- constructor TBinaryExpr.CreateRange(AParent : TPasElement; xleft,xright:TPasExpr);
- begin
- inherited Create(AParent,pekRange, eopNone);
- Left:=xleft;
- Left.Parent:=Self;
- Right:=xright;
- Right.Parent:=Self;
- end;
- procedure TBinaryExpr.FreeChildren(Prepare: boolean);
- var
- El: TPasExpr;
- SubBin: TBinaryExpr;
- begin
- // handle Left of binary chains without stack
- El:=Left;
- while El is TBinaryExpr do
- begin
- SubBin:=TBinaryExpr(El);
- El:=SubBin.Left;
- if (El=nil) or (El.Parent<>SubBin) then
- begin
- El:=SubBin;
- break;
- end;
- end;
- repeat
- if El=Left then
- SubBin:=Self
- else
- SubBin:=TBinaryExpr(El.Parent);
- if SubBin.Left<>nil then
- begin
- if Prepare then
- begin
- if SubBin.Left.Parent<>SubBin then
- SubBin.Left:=nil; // clear reference
- end
- else
- begin
- SubBin.Left.FreeChildren(false);
- SubBin.Left.Free;
- SubBin.Left:=nil;
- end;
- end;
- SubBin.Right:=TPasExpr(SubBin.FreeChild(SubBin.Right,Prepare));
- El:=SubBin;
- until El=Self;
- inherited FreeChildren(Prepare);
- end;
- procedure TBinaryExpr.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Left,false);
- ForEachChildCall(aMethodCall,Arg,Right,false);
- end;
- class function TBinaryExpr.IsRightSubIdent(El: TPasElement): boolean;
- var
- Bin: TBinaryExpr;
- begin
- if (El=nil) or not (El.Parent is TBinaryExpr) then exit(false);
- Bin:=TBinaryExpr(El.Parent);
- Result:=(Bin.Right=El) and (Bin.OpCode=eopSubIdent);
- end;
- { TParamsExpr }
- function TParamsExpr.GetDeclaration(full: Boolean): TPasTreeString;
- Var
- I : Integer;
- begin
- Result := '';
- For I:=0 to High(Params) do
- begin
- If (Result<>'') then
- Result:=Result+', ';
- Result:=Result+Params[I].GetDeclaration(Full);
- if Assigned(Params[I].Format1) then
- Result:=Result+':'+Params[I].Format1.GetDeclaration(false);
- if Assigned(Params[I].Format2) then
- Result:=Result+':'+Params[I].Format2.GetDeclaration(false);
- end;
- if Kind in [pekSet,pekArrayParams] then
- Result := '[' + Result + ']'
- else
- Result := '(' + Result + ')';
- if full and Assigned(Value) then
- Result:=Value.GetDeclaration(True)+Result;
- end;
- procedure TParamsExpr.AddParam(xp:TPasExpr);
- var
- i : Integer;
- begin
- i:=Length(Params);
- SetLength(Params, i+1);
- Params[i]:=xp;
- end;
- procedure TParamsExpr.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- ForEachChildCall(aMethodCall,Arg,Value,false);
- for i:=0 to High(Params) do
- ForEachChildCall(aMethodCall,Arg,Params[i],false);
- end;
- constructor TParamsExpr.Create(AParent : TPasElement; AKind: TPasExprKind);
- begin
- inherited Create(AParent,AKind, eopNone);
- end;
- procedure TParamsExpr.FreeChildren(Prepare: boolean);
- begin
- Value:=TPasExpr(FreeChild(Value,Prepare));
- FreePasExprArray(Self,Params,Prepare);
- inherited FreeChildren(Prepare);
- end;
- { TRecordValues }
- function TRecordValues.GetDeclaration(full: Boolean): TPasTreeString;
- Var
- I : Integer;
- begin
- Result := '';
- For I:=0 to High(Fields) do
- begin
- If Result<>'' then
- Result:=Result+'; ';
- Result:=Result+EscapeKeyWord(Fields[I].Name)+': '+Fields[i].ValueExp.getDeclaration(Full);
- end;
- Result:='('+Result+')';
- end;
- procedure TRecordValues.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to length(Fields)-1 do
- with Fields[i] do
- begin
- if NameExp<>nil then
- ForEachChildCall(aMethodCall,Arg,NameExp,false);
- if ValueExp<>nil then
- ForEachChildCall(aMethodCall,Arg,ValueExp,false);
- end;
- end;
- constructor TRecordValues.Create(AParent : TPasElement);
- begin
- inherited Create(AParent,pekListOfExp, eopNone);
- end;
- destructor TRecordValues.Destroy;
- begin
- Fields:=nil;
- inherited Destroy;
- end;
- procedure TRecordValues.FreeChildren(Prepare: boolean);
- var
- i: Integer;
- begin
- for i:=0 to High(Fields) do
- begin
- Fields[i].NameExp:=TPrimitiveExpr(FreeChild(Fields[i].NameExp,Prepare));
- Fields[i].ValueExp:=TPasExpr(FreeChild(Fields[i].ValueExp,Prepare));
- end;
- inherited FreeChildren(Prepare);
- end;
- procedure TRecordValues.AddField(AName: TPrimitiveExpr; Value: TPasExpr);
- var
- i : Integer;
- begin
- i:=length(Fields);
- SetLength(Fields, i+1);
- Fields[i].Name:=AName.Value;
- Fields[i].NameExp:=AName;
- AName.Parent:=Self;
- Fields[i].ValueExp:=Value;
- Value.Parent:=Self;
- end;
- { TNilExpr }
- function TNilExpr.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- Result:='Nil';
- if full then ;
- end;
- { TInheritedExpr }
- function TInheritedExpr.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- Result:='Inherited';
- if full then ;
- end;
- { TSelfExpr }
- function TSelfExpr.GetDeclaration(full: Boolean): TPasTreeString;
- begin
- Result:='Self';
- if full then ;
- end;
- { TArrayValues }
- function TArrayValues.GetDeclaration(full: Boolean): TPasTreeString;
- Var
- I : Integer;
- begin
- Result := '';
- For I:=0 to High(Values) do
- begin
- If Result<>'' then
- Result:=Result+', ';
- Result:=Result+Values[i].getDeclaration(Full);
- end;
- Result:='('+Result+')';
- end;
- procedure TArrayValues.ForEachCall(const aMethodCall: TOnForEachPasElement;
- const Arg: Pointer);
- var
- i: Integer;
- begin
- inherited ForEachCall(aMethodCall, Arg);
- for i:=0 to length(Values)-1 do
- ForEachChildCall(aMethodCall,Arg,Values[i],false);
- end;
- constructor TArrayValues.Create(AParent : TPasElement);
- begin
- inherited Create(AParent,pekListOfExp, eopNone);
- end;
- destructor TArrayValues.Destroy;
- begin
- Values:=nil;
- inherited Destroy;
- end;
- procedure TArrayValues.FreeChildren(Prepare: boolean);
- begin
- FreePasExprArray(Self,Values,Prepare);
- inherited FreeChildren(Prepare);
- end;
- procedure TArrayValues.AddValues(AValue:TPasExpr);
- var
- i : Integer;
- begin
- i:=length(Values);
- SetLength(Values, i+1);
- Values[i]:=AValue;
- AValue.Parent:=Self;
- end;
- { TNilExpr }
- constructor TNilExpr.Create(AParent : TPasElement);
- begin
- inherited Create(AParent,pekNil, eopNone);
- end;
- { TInheritedExpr }
- constructor TInheritedExpr.Create(AParent : TPasElement);
- begin
- inherited Create(AParent,pekInherited, eopNone);
- end;
- { TSelfExpr }
- constructor TSelfExpr.Create(AParent : TPasElement);
- begin
- inherited Create(AParent,pekSelf, eopNone);
- end;
- { TPasLabels }
- constructor TPasLabels.Create(const AName:TPasTreeString;AParent:TPasElement);
- begin
- inherited Create(AName,AParent);
- Labels := TStringList.Create;
- end;
- destructor TPasLabels.Destroy;
- begin
- FreeAndNil(Labels);
- inherited Destroy;
- end;
- end.
|