BfReducer.cpp 344 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876
  1. #include "BfAst.h"
  2. #include "BfReducer.h"
  3. #include "BfParser.h"
  4. #include "BfSystem.h"
  5. #include "BfUtil.h"
  6. #include "BeefySysLib/util/BeefPerf.h"
  7. #include "BeefySysLib/util/StackHelper.h"
  8. #include "BeefySysLib/util/AllocDebug.h"
  9. #include <functional>
  10. USING_NS_BF;
  11. #define MEMBER_SET(dest, member, src) \
  12. { dest->member = src; \
  13. MoveNode(src, dest); }
  14. #define MEMBER_SET_CHECKED(dest, member, src) \
  15. { if (src == NULL) return dest; \
  16. dest->member = src; \
  17. MoveNode(src, dest); }
  18. #define MEMBER_SET_CHECKED_BOOL(dest, member, src) \
  19. { if (src == NULL) return false; \
  20. dest->member = src; \
  21. MoveNode(src, dest); }
  22. BfReducer::BfReducer()
  23. {
  24. mCurTypeDecl = NULL;
  25. mLastTypeDecl = NULL;
  26. mCurMethodDecl = NULL;
  27. mLastBlockNode = NULL;
  28. mSource = NULL;
  29. mClassDepth = 0;
  30. mAlloc = NULL;
  31. mStmtHasError = false;
  32. mPrevStmtHadError = false;
  33. mPassInstance = NULL;
  34. mCompatMode = false;
  35. mAllowTypeWildcard = false;
  36. mIsFieldInitializer = false;
  37. mInParenExpr = false;
  38. mSkipCurrentNodeAssert = false;
  39. mAssertCurrentNodeIdx = 0;
  40. mSystem = NULL;
  41. mResolvePassData = NULL;
  42. mMethodDepth = 0;
  43. mDocumentCheckIdx = 0;
  44. mTypeMemberNodeStart = NULL;
  45. mCurTypeState = NULL;
  46. mLastErrorSrcEnd = -1;
  47. }
  48. bool BfReducer::IsSemicolon(BfAstNode* node)
  49. {
  50. auto tokenNode = BfNodeDynCast<BfTokenNode>(node);
  51. return (tokenNode != NULL) && (tokenNode->GetToken() == BfToken_Semicolon);
  52. }
  53. bool BfReducer::StringEquals(BfAstNode* node, BfAstNode* node2)
  54. {
  55. int len = node->GetSrcLength();
  56. int len2 = node2->GetSrcLength();
  57. if (len != len2)
  58. return false;
  59. int start = node->GetSrcStart();
  60. int start2 = node2->GetSrcStart();
  61. const char* srcStr = node->GetSourceData()->mSrc;
  62. for (int i = 0; i < len; i++)
  63. {
  64. if (srcStr[start + i] != srcStr[start2 + i])
  65. return false;
  66. }
  67. return true;
  68. }
  69. int gAssertCurrentNodeIdx = 0;
  70. bool BfReducer::AssertCurrentNode(BfAstNode* node)
  71. {
  72. if (mSkipCurrentNodeAssert)
  73. return true;
  74. bool success = true;
  75. auto currentNode = mVisitorPos.GetCurrent();
  76. if (currentNode == NULL)
  77. return success;
  78. if ((!node->LocationEndEquals(currentNode)) && (mLastErrorSrcEnd != currentNode->mSrcEnd))
  79. {
  80. const char* lastCPtr = &node->GetSourceData()->mSrc[node->GetSrcEnd() - 1];
  81. // We have an "exceptional" case where breaking a double chevron will look like a position error
  82. if ((lastCPtr[0] != '>') || (lastCPtr[1] != '>'))
  83. {
  84. //BF_FATAL("Internal parsing error");
  85. Fail("Internal parsing error", currentNode);
  86. AddErrorNode(currentNode);
  87. success = false;
  88. }
  89. }
  90. gAssertCurrentNodeIdx++;
  91. mAssertCurrentNodeIdx++;
  92. return success;
  93. }
  94. // For autocomplete we only do a reduce on nodes the cursor is in
  95. bool BfReducer::IsNodeRelevant(BfAstNode* astNode)
  96. {
  97. BfParser* bfParser = astNode->GetSourceData()->ToParser();
  98. if (bfParser == NULL)
  99. return true;
  100. int cursorPos = bfParser->mCursorIdx;
  101. if ((cursorPos == -1) || (astNode->Contains(cursorPos, 1, 0)))
  102. return true;
  103. BF_ASSERT(bfParser->mParserData->mRefCount == -1);
  104. return false;
  105. }
  106. bool BfReducer::IsCursorInside(BfAstNode* astNode)
  107. {
  108. BfParser* bfParser = astNode->GetSourceData()->ToParser();
  109. if (bfParser == NULL)
  110. return false;
  111. int cursorPos = bfParser->mCursorIdx;
  112. if (cursorPos == -1)
  113. return false;
  114. if (astNode->Contains(cursorPos, 1, 0))
  115. return true;
  116. BF_ASSERT(bfParser->mParserData->mRefCount == -1);
  117. return false;
  118. }
  119. bool BfReducer::IsNodeRelevant(BfAstNode* startNode, BfAstNode* endNode)
  120. {
  121. if (startNode == NULL)
  122. return IsNodeRelevant(endNode);
  123. BfParser* bfParser = startNode->GetSourceData()->ToParser();
  124. if (bfParser == NULL)
  125. return true;
  126. int cursorPos = bfParser->mCursorIdx;
  127. int lenAdd = 1;
  128. if ((cursorPos == -1) ||
  129. ((cursorPos >= startNode->GetSrcStart()) && (cursorPos < endNode->GetSrcEnd() + lenAdd)))
  130. return true;
  131. BF_ASSERT(bfParser->mParserData->mRefCount == -1);
  132. return false;
  133. }
  134. void BfReducer::MoveNode(BfAstNode* srcNode, BfAstNode* newOwner)
  135. {
  136. #ifdef BF_AST_HAS_PARENT_MEMBER
  137. srcNode->mParent = newOwner;
  138. #endif
  139. int srcStart = srcNode->mSrcStart;
  140. int srcEnd = srcNode->mSrcEnd;
  141. if (srcStart < newOwner->mSrcStart)
  142. newOwner->mSrcStart = srcStart;
  143. if (srcEnd > newOwner->mSrcEnd)
  144. newOwner->mSrcEnd = srcEnd;
  145. }
  146. // Replaces prevNode with new node and adds prevNode to newNode's children
  147. // It can be considered that newNode encapsulated prevNode.
  148. void BfReducer::ReplaceNode(BfAstNode* prevNode, BfAstNode* newNode)
  149. {
  150. #ifdef BF_AST_HAS_PARENT_MEMBER
  151. newNode->mParent = prevNode->mParent;
  152. #endif
  153. if (!newNode->IsInitialized())
  154. {
  155. #ifdef BF_AST_COMPACT
  156. if (prevNode->mIsCompact)
  157. {
  158. newNode->mIsCompact = prevNode->mIsCompact;
  159. newNode->mCompact_SrcStart = prevNode->mCompact_SrcStart;
  160. newNode->mCompact_SrcLen = prevNode->mCompact_SrcLen;
  161. newNode->mCompact_TriviaLen = prevNode->mCompact_TriviaLen;
  162. }
  163. else
  164. {
  165. int prevTriviaStart;
  166. int prevSrcStart;
  167. int prevSrcEnd;
  168. prevNode->GetSrcPositions(prevTriviaStart, prevSrcStart, prevSrcEnd);
  169. newNode->Init(prevTriviaStart, prevSrcStart, prevSrcEnd);
  170. }
  171. #else
  172. newNode->mTriviaStart = prevNode->mTriviaStart;
  173. newNode->mSrcStart = prevNode->mSrcStart;
  174. newNode->mSrcEnd = prevNode->mSrcEnd;
  175. #endif
  176. }
  177. else
  178. {
  179. int newTriviaStart;
  180. int newSrcStart;
  181. int newSrcEnd;
  182. newNode->GetSrcPositions(newTriviaStart, newSrcStart, newSrcEnd);
  183. int prevTriviaStart;
  184. int prevSrcStart;
  185. int prevSrcEnd;
  186. prevNode->GetSrcPositions(prevTriviaStart, prevSrcStart, prevSrcEnd);
  187. if (prevTriviaStart < newTriviaStart)
  188. newNode->SetTriviaStart(prevTriviaStart);
  189. if (prevSrcStart < newSrcStart)
  190. newNode->SetSrcStart(prevSrcStart);
  191. if (prevSrcEnd > newSrcEnd)
  192. newNode->SetSrcEnd(prevSrcEnd);
  193. }
  194. #ifdef BF_AST_HAS_PARENT_MEMBER
  195. prevNode->mParent = newNode;
  196. #endif
  197. }
  198. BfAstNode* BfReducer::Fail(const StringImpl& errorMsg, BfAstNode* refNode)
  199. {
  200. mStmtHasError = true;
  201. if (mPassInstance->HasLastFailedAt(refNode)) // No duplicate failures
  202. return NULL;
  203. auto error = mPassInstance->Fail(errorMsg, refNode);
  204. if ((error != NULL) && (mSource != NULL))
  205. error->mProject = mSource->mProject;
  206. return NULL;
  207. }
  208. BfAstNode* BfReducer::FailAfter(const StringImpl& errorMsg, BfAstNode* prevNode)
  209. {
  210. mStmtHasError = true;
  211. auto error = mPassInstance->FailAfter(errorMsg, prevNode);
  212. if ((error != NULL) && (mSource != NULL))
  213. error->mProject = mSource->mProject;
  214. return NULL;
  215. }
  216. void BfReducer::AddErrorNode(BfAstNode* astNode, bool removeNode)
  217. {
  218. if (mSource != NULL)
  219. mSource->AddErrorNode(astNode);
  220. if (removeNode)
  221. astNode->RemoveSelf();
  222. mLastErrorSrcEnd = BF_MAX(mLastErrorSrcEnd, astNode->mSrcEnd);
  223. }
  224. bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int endNode, int* retryNode, int* outEndNode, bool* couldBeExpr, bool* isGenericType, bool* isTuple)
  225. {
  226. if (!AssertCurrentNode(checkNode))
  227. return false;
  228. if (couldBeExpr != NULL)
  229. *couldBeExpr = true;
  230. if (outEndNode != NULL)
  231. *outEndNode = -1;
  232. auto firstNode = checkNode;
  233. if (checkNode == NULL)
  234. return false;
  235. int checkIdx = mVisitorPos.mReadPos;
  236. if ((!checkNode->IsA<BfIdentifierNode>()) && (!checkNode->IsA<BfMemberReferenceExpression>()))
  237. {
  238. if (auto checkTokenNode = BfNodeDynCast<BfTokenNode>(checkNode))
  239. {
  240. BfToken checkToken = checkTokenNode->GetToken();
  241. if ((checkToken == BfToken_Ref) || (checkToken == BfToken_Mut))
  242. {
  243. checkIdx++;
  244. if (mVisitorPos.Get(checkIdx) == NULL)
  245. return false;
  246. }
  247. else if ((checkToken == BfToken_Var) || (checkToken == BfToken_Let))
  248. {
  249. checkIdx++;
  250. checkNode = mVisitorPos.Get(checkIdx);
  251. checkTokenNode = BfNodeDynCast<BfTokenNode>(checkNode);
  252. if (outEndNode)
  253. *outEndNode = checkIdx;
  254. if (successToken == BfToken_None)
  255. return true;
  256. return (checkToken == successToken);
  257. }
  258. else if (checkToken == BfToken_Unsigned)
  259. {
  260. // Unsigned val start
  261. }
  262. else if (checkToken == BfToken_LParen)
  263. {
  264. // Tuple start
  265. }
  266. else if ((checkToken == BfToken_Comptype) || (checkToken == BfToken_Decltype) || (checkToken == BfToken_AllocType) || (checkToken == BfToken_RetType) || (checkToken == BfToken_Nullable))
  267. {
  268. // Decltype start
  269. }
  270. else if ((checkToken == BfToken_Delegate) || (checkToken == BfToken_Function))
  271. {
  272. int startNode = mVisitorPos.mReadPos;
  273. mVisitorPos.mReadPos++;
  274. int endNode = -1;
  275. bool failed = false;
  276. // Return type
  277. auto checkNode = mVisitorPos.GetCurrent();
  278. if (auto checkToken = BfNodeDynCast<BfTokenNode>(checkNode))
  279. {
  280. if (checkToken->mToken == BfToken_LBracket)
  281. {
  282. while (true)
  283. {
  284. mVisitorPos.mReadPos++;
  285. checkNode = mVisitorPos.GetCurrent();
  286. if (checkNode == NULL)
  287. {
  288. failed = true;
  289. break;
  290. }
  291. if (BfNodeIsA<BfBlock>(checkNode))
  292. {
  293. failed = true;
  294. break;
  295. }
  296. if (checkToken = BfNodeDynCast<BfTokenNode>(checkNode))
  297. {
  298. if (checkToken->mToken == BfToken_RBracket)
  299. {
  300. mVisitorPos.mReadPos++;
  301. checkNode = mVisitorPos.GetCurrent();
  302. break;
  303. }
  304. if ((checkToken->mToken != BfToken_Comma) &&
  305. (checkToken->mToken != BfToken_Dot) &&
  306. (checkToken->mToken != BfToken_LParen) &&
  307. (checkToken->mToken != BfToken_RParen))
  308. {
  309. failed = true;
  310. break;
  311. }
  312. }
  313. }
  314. }
  315. }
  316. if ((failed) || (checkNode == NULL) || (!IsTypeReference(checkNode, BfToken_LParen, -1, &endNode, couldBeExpr, isGenericType, isTuple)))
  317. {
  318. if (outEndNode != NULL)
  319. *outEndNode = endNode;
  320. mVisitorPos.mReadPos = startNode;
  321. return false;
  322. }
  323. // Take in params as a tuple
  324. mVisitorPos.mReadPos = endNode;
  325. auto currentNode = mVisitorPos.GetCurrent();
  326. bool hasParams = false;
  327. if (currentNode != NULL)
  328. {
  329. if (auto openToken = BfNodeDynCast<BfTokenNode>(currentNode))
  330. {
  331. if (openToken->GetToken() == BfToken_LParen)
  332. {
  333. int parenDepth = 1;
  334. // Do a smarter check?
  335. checkIdx = endNode + 1;
  336. while (true)
  337. {
  338. auto checkNode = mVisitorPos.Get(checkIdx);
  339. if (checkNode == NULL)
  340. break;
  341. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(checkNode))
  342. {
  343. bool done = false;
  344. switch (tokenNode->GetToken())
  345. {
  346. case BfToken_LParen:
  347. parenDepth++;
  348. break;
  349. case BfToken_RParen:
  350. parenDepth--;
  351. if (parenDepth == 0)
  352. {
  353. endNode = checkIdx + 1;
  354. done = true;
  355. }
  356. break;
  357. case BfToken_Semicolon:
  358. // Failed
  359. done = true;
  360. break;
  361. default: break;
  362. }
  363. if (done)
  364. break;
  365. }
  366. checkIdx++;
  367. }
  368. hasParams = parenDepth == 0;
  369. }
  370. }
  371. }
  372. if (!hasParams)
  373. {
  374. if (outEndNode != NULL)
  375. *outEndNode = endNode;
  376. mVisitorPos.mReadPos = startNode;
  377. return false;
  378. }
  379. if (outEndNode != NULL)
  380. *outEndNode = endNode;
  381. mVisitorPos.mReadPos = startNode;
  382. return true;
  383. }
  384. else if (BfTokenIsTypeDecl(checkToken))
  385. {
  386. checkIdx++;
  387. auto nextNode = mVisitorPos.Get(checkIdx);
  388. if (auto block = BfNodeDynCast<BfBlock>(nextNode))
  389. {
  390. if (outEndNode != NULL)
  391. *outEndNode = checkIdx;
  392. return true;
  393. }
  394. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  395. {
  396. if (tokenNode->mToken == BfToken_Colon)
  397. {
  398. while (true)
  399. {
  400. checkIdx++;
  401. auto checkNode = mVisitorPos.Get(checkIdx);
  402. if (checkNode == NULL)
  403. return false;
  404. if (auto block = BfNodeDynCast<BfBlock>(checkNode))
  405. {
  406. if (outEndNode != NULL)
  407. *outEndNode = checkIdx;
  408. return true;
  409. }
  410. }
  411. }
  412. }
  413. return false;
  414. }
  415. else
  416. return false;
  417. }
  418. else
  419. return false;
  420. }
  421. int chevronDepth = 0;
  422. bool identifierExpected = true;
  423. int endBracket = -1;
  424. int bracketDepth = 0;
  425. int parenDepth = 0;
  426. bool hadTupleComma = false;
  427. bool hadIdentifier = false;
  428. bool foundSuccessToken = false;
  429. bool hadUnexpectedIdentifier = false;
  430. BfTokenNode* lastToken = NULL;
  431. SizedArray<BfToken, 8> tokenStack;
  432. while (true)
  433. {
  434. if ((endNode != -1) && (checkIdx >= endNode))
  435. break;
  436. auto checkNode = mVisitorPos.Get(checkIdx);
  437. if (checkNode == NULL)
  438. break;
  439. auto checkTokenNode = BfNodeDynCast<BfTokenNode>(checkNode);
  440. if (checkTokenNode != NULL)
  441. {
  442. if (endBracket != -1)
  443. {
  444. if (outEndNode)
  445. *outEndNode = endBracket;
  446. return false;
  447. }
  448. BfToken checkToken = checkTokenNode->GetToken();
  449. if (bracketDepth > 0)
  450. {
  451. if ((checkToken == BfToken_LBracket) || (checkToken == BfToken_QuestionLBracket))
  452. {
  453. bracketDepth++;
  454. }
  455. else if (checkToken == BfToken_RBracket)
  456. {
  457. bracketDepth--;
  458. }
  459. }
  460. else
  461. {
  462. bool doEnding = (checkToken == successToken) && (checkTokenNode != firstNode) && (tokenStack.size() <= 1);
  463. if ((doEnding) && (tokenStack.size() == 1))
  464. doEnding = checkToken == tokenStack.back();
  465. if (doEnding)
  466. {
  467. bool success = false;
  468. if ((lastToken != NULL) && ((lastToken->GetToken() == BfToken_RChevron) || (lastToken->GetToken() == BfToken_RDblChevron)))
  469. {
  470. if (couldBeExpr != NULL)
  471. *couldBeExpr = false;
  472. }
  473. if (successToken == BfToken_RParen)
  474. {
  475. success = (chevronDepth == 0) && (bracketDepth == 0) && (parenDepth == 1);
  476. if (success)
  477. {
  478. // Check identifierExpected - this catches (.) casts
  479. if ((identifierExpected) && (couldBeExpr != NULL))
  480. *couldBeExpr = false;
  481. }
  482. }
  483. else if ((successToken == BfToken_Comma) ||
  484. (successToken == BfToken_LBracket))
  485. {
  486. success = (chevronDepth == 0) && (bracketDepth == 0) && (parenDepth == 0);
  487. }
  488. if ((success) || (doEnding))
  489. {
  490. if ((!hadTupleComma) && (hadUnexpectedIdentifier)) // Looked like a tuple but wasn't
  491. return false;
  492. }
  493. if (success)
  494. {
  495. if (outEndNode != NULL)
  496. *outEndNode = checkIdx;
  497. return true;
  498. }
  499. if (doEnding)
  500. {
  501. if (outEndNode != NULL)
  502. *outEndNode = checkIdx;
  503. return (chevronDepth == 0) && (bracketDepth == 0) && (parenDepth == 0);
  504. }
  505. }
  506. bool isDone = false;
  507. if (checkToken == BfToken_LParen)
  508. {
  509. if (chevronDepth > 0)
  510. {
  511. SetAndRestoreValue<int> prevIdx(mVisitorPos.mReadPos, checkIdx);
  512. int endToken = 0;
  513. if (!IsTypeReference(checkNode, BfToken_RParen, -1, &endToken, NULL, NULL, NULL))
  514. return false;
  515. checkIdx = endToken + 1;
  516. continue;
  517. }
  518. else if ((hadIdentifier) && (chevronDepth == 0) && (bracketDepth == 0) && (parenDepth == 0))
  519. isDone = true;
  520. else
  521. {
  522. tokenStack.Add(BfToken_RParen);
  523. parenDepth++;
  524. }
  525. }
  526. else if (checkToken == BfToken_RParen)
  527. {
  528. if ((parenDepth == 0) || (tokenStack.back() != BfToken_RParen))
  529. {
  530. if (outEndNode != NULL)
  531. *outEndNode = checkIdx;
  532. return false;
  533. }
  534. tokenStack.pop_back();
  535. parenDepth--;
  536. if (parenDepth > 0)
  537. {
  538. // if we are embedded in a multi-tuple like (A, (B, C), D) then we expect a , or ) after
  539. // closing an inner tuple. Otherwise this is an expression like ((Type)a)
  540. auto nextNode = mVisitorPos.Get(checkIdx + 1);
  541. bool isOkay = false;
  542. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  543. {
  544. isOkay = (nextToken->mToken == BfToken_Comma) || (nextToken->mToken == BfToken_RParen);
  545. if ((!tokenStack.IsEmpty()) && (nextToken->mToken == tokenStack.back()))
  546. isOkay = true;
  547. }
  548. if (!isOkay)
  549. {
  550. if (outEndNode != NULL)
  551. *outEndNode = checkIdx;
  552. return false;
  553. }
  554. }
  555. if ((parenDepth < 0) ||
  556. // Probably a cast
  557. ((successToken == BfToken_None) && (parenDepth == 0) && (!hadTupleComma)))
  558. {
  559. if (successToken == BfToken_RParen)
  560. {
  561. foundSuccessToken = true;
  562. break;
  563. }
  564. else
  565. {
  566. if (outEndNode != NULL)
  567. *outEndNode = checkIdx;
  568. return false;
  569. }
  570. }
  571. }
  572. else if ((checkToken == BfToken_Const) && (chevronDepth > 0))
  573. {
  574. if (mCompatMode)
  575. {
  576. identifierExpected = true;
  577. }
  578. else
  579. {
  580. int prevReadPos = mVisitorPos.mReadPos;
  581. auto nextNode = mVisitorPos.Get(checkIdx + 1);
  582. if (nextNode != NULL)
  583. {
  584. mVisitorPos.mReadPos = checkIdx + 1;
  585. auto expr = CreateExpression(nextNode, CreateExprFlags_BreakOnRChevron);
  586. int endExprReadPos = mVisitorPos.mReadPos;
  587. mVisitorPos.mReadPos = prevReadPos;
  588. if (expr == NULL)
  589. {
  590. if (outEndNode != NULL)
  591. *outEndNode = checkIdx;
  592. return false;
  593. }
  594. checkIdx = endExprReadPos;
  595. }
  596. }
  597. }
  598. else if ((checkToken == BfToken_Minus) && (mCompatMode) && (chevronDepth > 0) && (parenDepth == 0) && (bracketDepth == 0))
  599. {
  600. // Allow
  601. }
  602. else if (checkToken == BfToken_Unsigned)
  603. {
  604. identifierExpected = true;
  605. }
  606. else if ((checkToken == BfToken_Ref) || (checkToken == BfToken_Mut))
  607. {
  608. identifierExpected = true;
  609. }
  610. else if (checkToken == BfToken_LChevron)
  611. {
  612. identifierExpected = true;
  613. chevronDepth++;
  614. tokenStack.Add(BfToken_RChevron);
  615. *retryNode = checkIdx;
  616. }
  617. else if ((checkToken == BfToken_RChevron) || (checkToken == BfToken_RDblChevron))
  618. {
  619. *retryNode = -1;
  620. if (tokenStack.IsEmpty())
  621. break;
  622. for (int i = 0; i < ((checkToken == BfToken_RDblChevron) ? 2 : 1); i++)
  623. {
  624. if (tokenStack.back() != BfToken_RChevron)
  625. {
  626. if (outEndNode != NULL)
  627. *outEndNode = checkIdx;
  628. return false;
  629. }
  630. tokenStack.pop_back();
  631. chevronDepth--;
  632. }
  633. identifierExpected = false;
  634. if (chevronDepth < 0)
  635. {
  636. if (outEndNode != NULL)
  637. *outEndNode = checkIdx;
  638. return false;
  639. }
  640. if (chevronDepth == 0)
  641. {
  642. if (isGenericType != NULL)
  643. *isGenericType = true;
  644. }
  645. }
  646. else if (checkToken == BfToken_RDblChevron)
  647. chevronDepth -= 2;
  648. else if (checkToken == BfToken_Comma)
  649. {
  650. if ((bracketDepth == 0) && (tokenStack.IsEmpty()))
  651. {
  652. if (outEndNode != NULL)
  653. *outEndNode = checkIdx;
  654. return false;
  655. }
  656. if ((!tokenStack.IsEmpty()) && (tokenStack.back() == BfToken_RParen))
  657. {
  658. hadTupleComma = true;
  659. if (isTuple != NULL)
  660. {
  661. *isTuple = true;
  662. }
  663. }
  664. identifierExpected = true;
  665. }
  666. else if (checkToken == BfToken_Dot)
  667. {
  668. auto prevNode = mVisitorPos.Get(checkIdx - 1);
  669. if (auto prevToken = BfNodeDynCast<BfTokenNode>(prevNode))
  670. {
  671. if (couldBeExpr != NULL)
  672. {
  673. // UH- NO, it could be referencing a static member
  674. // a ">." can only be a reference to an inner type of a generic type
  675. //if ((prevToken->GetToken() == BfToken_RChevron) || (prevToken->GetToken() == BfToken_RDblChevron))
  676. //*couldBeExpr = false;
  677. }
  678. // a ".[" can only be a member reference after an indexer expression
  679. if (prevToken->GetToken() == BfToken_RBracket)
  680. {
  681. if (outEndNode != NULL)
  682. *outEndNode = checkIdx;
  683. return false;
  684. }
  685. }
  686. identifierExpected = true;
  687. }
  688. else if (checkToken == BfToken_RBracket)
  689. {
  690. if (bracketDepth == 0)
  691. {
  692. // Not even an array
  693. return false;
  694. }
  695. endBracket = checkIdx;
  696. }
  697. else if ((checkToken == BfToken_Star) || (checkToken == BfToken_Question))
  698. {
  699. bool keepParsing = false;
  700. if (checkToken == BfToken_Star)
  701. {
  702. auto prevNode = mVisitorPos.Get(checkIdx - 1);
  703. if (auto prevToken = BfNodeDynCast<BfTokenNode>(prevNode))
  704. {
  705. switch (prevToken->GetToken())
  706. {
  707. case BfToken_RParen:
  708. case BfToken_RBracket:
  709. case BfToken_RChevron:
  710. case BfToken_RDblChevron:
  711. break;
  712. default:
  713. // These are definitely dereferences
  714. return false;
  715. }
  716. }
  717. while (true)
  718. {
  719. auto nextNode = mVisitorPos.Get(checkIdx + 1);
  720. auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode);
  721. if ((nextToken != NULL) && (nextToken->GetToken() == BfToken_LBracket))
  722. {
  723. keepParsing = true;
  724. break;
  725. }
  726. if ((nextToken == NULL) || (nextToken->GetToken() != BfToken_Star))
  727. break;
  728. checkTokenNode = nextToken;
  729. checkToken = checkTokenNode->GetToken();
  730. checkIdx++;
  731. }
  732. }
  733. else
  734. {
  735. auto prevNode = mVisitorPos.Get(checkIdx - 1);
  736. if (auto prevToken = BfNodeDynCast<BfTokenNode>(prevNode))
  737. {
  738. // If this is just a 'loose' comma then it can't be part of a nullable
  739. if (((prevToken->GetToken() == BfToken_Comma) && (chevronDepth == 0)) ||
  740. (prevToken->GetToken() == BfToken_LParen))
  741. {
  742. return false;
  743. }
  744. }
  745. }
  746. // Star or Question normally end a TypeRef
  747. if (keepParsing)
  748. {
  749. // Keep going
  750. }
  751. else if ((chevronDepth == 0) && (parenDepth == 0) && (bracketDepth == 0))
  752. {
  753. if (hadTupleComma)
  754. return false;
  755. if (couldBeExpr != NULL)
  756. *couldBeExpr = false;
  757. if (outEndNode != NULL)
  758. *outEndNode = checkIdx + 1;
  759. if (successToken == BfToken_None)
  760. return true;
  761. auto nextNode = mVisitorPos.Get(checkIdx + 1);
  762. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  763. {
  764. if (nextToken->GetToken() == successToken)
  765. {
  766. if (outEndNode != NULL)
  767. *outEndNode = checkIdx + 1;
  768. return true;
  769. }
  770. if (nextToken->GetToken() == BfToken_LBracket)
  771. {
  772. // A rare case of something like "char*[...]", let the bracket information through
  773. }
  774. else
  775. break;
  776. }
  777. else
  778. return false;
  779. }
  780. }
  781. else if ((checkToken == BfToken_LBracket) || (checkToken == BfToken_QuestionLBracket))
  782. {
  783. auto prevNode = mVisitorPos.Get(checkIdx - 1);
  784. if (auto prevToken = BfNodeDynCast<BfTokenNode>(prevNode))
  785. {
  786. // .[ - that's not a valid type, but could be an attributed member reference
  787. if ((prevToken->GetToken() == BfToken_Dot) || (prevToken->GetToken() == BfToken_DotDot))
  788. {
  789. if (outEndNode != NULL)
  790. *outEndNode = checkIdx - 1;
  791. return false;
  792. }
  793. }
  794. bracketDepth++;
  795. }
  796. else if (checkToken == BfToken_This)
  797. {
  798. if ((parenDepth == 1) && (hadIdentifier))
  799. {
  800. // If this looks like it's from a '(<type> this ...)' then it could be part of a function declaration, so allow it
  801. }
  802. else
  803. {
  804. if (outEndNode != NULL)
  805. *outEndNode = checkIdx;
  806. return false;
  807. }
  808. }
  809. else if ((checkToken == BfToken_Delegate) || (checkToken == BfToken_Function))
  810. {
  811. int funcEndNode = -1;
  812. int prevReadPos = mVisitorPos.mReadPos;
  813. mVisitorPos.mReadPos = checkIdx;
  814. bool isTypeRef = IsTypeReference(checkNode, BfToken_None, -1, &funcEndNode);
  815. mVisitorPos.mReadPos = prevReadPos;
  816. if (!isTypeRef)
  817. {
  818. if (outEndNode != NULL)
  819. *outEndNode = checkIdx;
  820. return false;
  821. }
  822. checkIdx = funcEndNode;
  823. continue;
  824. }
  825. else if ((checkToken == BfToken_Comptype) || (checkToken == BfToken_Decltype) || (checkToken == BfToken_AllocType) || (checkToken == BfToken_RetType) || (checkToken == BfToken_Nullable))
  826. {
  827. int endNodeIdx = checkIdx + 1;
  828. auto nextNode = mVisitorPos.Get(checkIdx + 1);
  829. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  830. {
  831. if (tokenNode->mToken != BfToken_LParen)
  832. {
  833. isDone = true;
  834. }
  835. else
  836. {
  837. int openCount = 1;
  838. while (true)
  839. {
  840. endNodeIdx++;
  841. auto checkNextNode = mVisitorPos.Get(endNodeIdx);
  842. if (checkNextNode == NULL)
  843. break;
  844. if (auto checkNextToken = BfNodeDynCast<BfTokenNode>(checkNextNode))
  845. {
  846. if (checkNextToken->GetToken() == BfToken_LParen)
  847. openCount++;
  848. else if (checkNextToken->GetToken() == BfToken_RParen)
  849. {
  850. openCount--;
  851. if (openCount == 0)
  852. break;
  853. }
  854. }
  855. }
  856. }
  857. }
  858. identifierExpected = false;
  859. checkIdx = endNodeIdx;
  860. /*if (outEndNode != NULL)
  861. *outEndNode = endNodeIdx + 1;
  862. return true;*/
  863. }
  864. else if ((checkToken == BfToken_DotDotDot) && (chevronDepth > 0))
  865. {
  866. isDone = true;
  867. auto prevNode = mVisitorPos.Get(checkIdx + 1);
  868. if (prevNode = BfNodeDynCast<BfLiteralExpression>(prevNode))
  869. {
  870. // Allow expressions like '3...'
  871. isDone = false;
  872. }
  873. auto nextNode = mVisitorPos.Get(checkIdx + 1);
  874. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  875. {
  876. if ((nextToken->mToken == BfToken_RChevron) || (nextToken->mToken == BfToken_RDblChevron))
  877. isDone = false;
  878. }
  879. }
  880. else if ((checkToken == BfToken_Minus) && (chevronDepth > 0))
  881. {
  882. // Allow - literal
  883. }
  884. else if (checkToken != BfToken_LBracket)
  885. isDone = true;
  886. if (isDone)
  887. {
  888. if (outEndNode != NULL)
  889. *outEndNode = checkIdx;
  890. if (isGenericType != NULL)
  891. *isGenericType = false;
  892. return false;
  893. }
  894. }
  895. }
  896. else if (bracketDepth > 0)
  897. {
  898. // Ignore
  899. }
  900. else if ((checkNode->IsA<BfIdentifierNode>()) || (checkNode->IsA<BfMemberReferenceExpression>()))
  901. {
  902. // Identifier is always allowed in tuple (parenDepth == 0), because it's potentially the field name
  903. // (successToken == BfToken_RParen) infers we are already checking inside parentheses, such as
  904. // when we see a potential cast expression
  905. if (!identifierExpected)
  906. {
  907. if ((parenDepth == 0) && (successToken != BfToken_RParen))
  908. {
  909. if (outEndNode != NULL)
  910. *outEndNode = checkIdx;
  911. if (successToken == BfToken_None)
  912. return chevronDepth == 0;
  913. return false;
  914. }
  915. hadUnexpectedIdentifier = true;
  916. }
  917. // if (checkNode->Equals("tag"))
  918. // {
  919. // // Keep looking for tag name
  920. // }
  921. // else
  922. {
  923. hadIdentifier = true;
  924. identifierExpected = false;
  925. }
  926. }
  927. else if (checkNode->IsA<BfBlock>())
  928. {
  929. if (successToken == BfToken_LBrace)
  930. {
  931. foundSuccessToken = true;
  932. }
  933. break;
  934. }
  935. else if ((mCompatMode) && (checkNode->IsExact<BfLiteralExpression>()) && (chevronDepth > 0) && (identifierExpected))
  936. {
  937. // Allow
  938. identifierExpected = false;
  939. }
  940. else
  941. {
  942. bool mayBeExprPart = false;
  943. if (chevronDepth > 0)
  944. {
  945. if (checkNode->IsExact<BfLiteralExpression>())
  946. mayBeExprPart = true;
  947. else if (auto tokenNode = BfNodeDynCast<BfTokenNode>(checkNode))
  948. {
  949. if (tokenNode->mToken == BfToken_Question)
  950. mayBeExprPart = true;
  951. }
  952. }
  953. if (!mayBeExprPart)
  954. {
  955. if (outEndNode != NULL)
  956. *outEndNode = checkIdx;
  957. return false;
  958. }
  959. }
  960. lastToken = checkTokenNode;
  961. checkIdx++;
  962. }
  963. if (outEndNode != NULL)
  964. *outEndNode = checkIdx;
  965. if ((!hadTupleComma) && (hadUnexpectedIdentifier)) // Looked like a tuple but wasn't
  966. return false;
  967. return (hadIdentifier) && (chevronDepth == 0) && (bracketDepth == 0) && (parenDepth == 0) && ((successToken == BfToken_None) || (foundSuccessToken));
  968. }
  969. static int sTRIdx = 0;
  970. bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int endNode, int* outEndNode, bool* couldBeExpr, bool* isGenericType, bool* isTuple)
  971. {
  972. int retryNode = -1;
  973. if (IsTypeReference(checkNode, successToken, endNode, &retryNode, outEndNode, couldBeExpr, isGenericType, isTuple))
  974. return true;
  975. if ((retryNode != -1) && (successToken == BfToken_None))
  976. {
  977. int newEndNode = -1;
  978. if (IsTypeReference(checkNode, successToken, retryNode, &retryNode, &newEndNode, couldBeExpr, isGenericType, isTuple))
  979. {
  980. if (outEndNode != NULL)
  981. *outEndNode = newEndNode;
  982. return true;
  983. }
  984. }
  985. return false;
  986. }
  987. bool BfReducer::IsLocalMethod(BfAstNode* nameNode)
  988. {
  989. if (!AssertCurrentNode(nameNode))
  990. return false;
  991. int parenDepth = 0;
  992. bool hadParens = false;
  993. int chevronDepth = 0;
  994. bool hadGenericParams = false;
  995. int checkIdx = mVisitorPos.mReadPos + 1;
  996. while (true)
  997. {
  998. auto checkNode = mVisitorPos.Get(checkIdx);
  999. if (checkNode == NULL)
  1000. return false;
  1001. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(checkNode))
  1002. {
  1003. BfToken token = tokenNode->GetToken();
  1004. if (token == BfToken_LParen)
  1005. {
  1006. parenDepth++;
  1007. hadParens = true;
  1008. }
  1009. else if (token == BfToken_RParen)
  1010. {
  1011. parenDepth--;
  1012. if (parenDepth == 0)
  1013. return true;
  1014. }
  1015. else
  1016. {
  1017. switch (token)
  1018. {
  1019. case BfToken_Semicolon: // Never can be a local method
  1020. return false;
  1021. case BfToken_Where: // Always denotes a local method
  1022. return true;
  1023. default: break;
  1024. }
  1025. }
  1026. }
  1027. else if (auto tokenNode = BfNodeDynCast<BfBlock>(checkNode))
  1028. {
  1029. //return (hadParens) && (parenDepth == 0);
  1030. return false;
  1031. }
  1032. else
  1033. {
  1034. }
  1035. checkIdx++;
  1036. }
  1037. return false;
  1038. }
  1039. int BfReducer::QualifiedBacktrack(BfAstNode* endNode, int checkIdx, bool* outHadChevrons)
  1040. {
  1041. auto checkNode = endNode;
  1042. BF_ASSERT(checkNode == mVisitorPos.Get(checkIdx));
  1043. int chevronDepth = 0;
  1044. bool identifierExpected = true;
  1045. bool hadEndBracket = false;
  1046. bool lastWasIdentifier = false;
  1047. while (checkNode != NULL)
  1048. {
  1049. auto checkTokenNode = BfNodeDynCast<BfTokenNode>(checkNode);
  1050. if (checkTokenNode != NULL)
  1051. {
  1052. BfToken checkToken = checkTokenNode->GetToken();
  1053. if ((checkToken == BfToken_Dot) || (checkToken == BfToken_DotDot))
  1054. {
  1055. if (chevronDepth == 0)
  1056. return checkIdx;
  1057. }
  1058. else if (checkToken == BfToken_LChevron)
  1059. {
  1060. if (outHadChevrons != NULL)
  1061. *outHadChevrons = true;
  1062. chevronDepth++;
  1063. }
  1064. else if (checkToken == BfToken_RChevron)
  1065. {
  1066. // Was this a case like "Test<T> MethodName"? Those are split.
  1067. if (lastWasIdentifier)
  1068. return -1;
  1069. chevronDepth--;
  1070. }
  1071. else if (checkToken == BfToken_RDblChevron)
  1072. {
  1073. if (lastWasIdentifier)
  1074. return -1;
  1075. chevronDepth -= 2;
  1076. }
  1077. else if ((checkToken != BfToken_Comma) &&
  1078. (checkToken != BfToken_Dot) &&
  1079. (checkToken != BfToken_DotDot) &&
  1080. (checkToken != BfToken_RBracket) &&
  1081. (checkToken != BfToken_Star) &&
  1082. (checkToken != BfToken_Question) &&
  1083. (checkToken != BfToken_LBracket))
  1084. {
  1085. return -1;
  1086. }
  1087. if (chevronDepth == 0)
  1088. return -1;
  1089. lastWasIdentifier = false;
  1090. }
  1091. else if (checkNode->IsA<BfIdentifierNode>())
  1092. {
  1093. // Two identifiers in a row denotes a break
  1094. if (lastWasIdentifier)
  1095. return -1;
  1096. lastWasIdentifier = true;
  1097. }
  1098. else
  1099. {
  1100. return -1;
  1101. }
  1102. checkIdx--;
  1103. checkNode = mVisitorPos.Get(checkIdx);
  1104. }
  1105. return -1;
  1106. }
  1107. BfExpression* BfReducer::ApplyToFirstExpression(BfUnaryOperatorExpression* unaryOp, BfExpression* target)
  1108. {
  1109. auto condExpression = BfNodeDynCast<BfConditionalExpression>(target);
  1110. if (condExpression != NULL)
  1111. {
  1112. auto result = ApplyToFirstExpression(unaryOp, condExpression->mConditionExpression);
  1113. if (result == condExpression->mConditionExpression)
  1114. {
  1115. //TODO: Make sure this one works, check children and next's and such
  1116. //ReplaceNode(unaryOp, binOpExpression);
  1117. unaryOp->mExpression = condExpression->mConditionExpression;
  1118. ReplaceNode(unaryOp, condExpression);
  1119. unaryOp->SetSrcEnd(condExpression->mConditionExpression->GetSrcEnd());
  1120. condExpression->mConditionExpression = unaryOp;
  1121. }
  1122. condExpression->SetSrcStart(unaryOp->GetSrcStart());
  1123. return result;
  1124. }
  1125. auto binOpExpression = BfNodeDynCast<BfBinaryOperatorExpression>(target);
  1126. if (binOpExpression != NULL)
  1127. {
  1128. auto result = ApplyToFirstExpression(unaryOp, binOpExpression->mLeft);
  1129. if (result == binOpExpression->mLeft)
  1130. {
  1131. unaryOp->mExpression = binOpExpression->mLeft;
  1132. unaryOp->SetSrcEnd(binOpExpression->mLeft->GetSrcEnd());
  1133. binOpExpression->mLeft = unaryOp;
  1134. }
  1135. binOpExpression->SetSrcStart(unaryOp->GetSrcStart());
  1136. return result;
  1137. }
  1138. return target;
  1139. }
  1140. static String DbgNodeToString(BfAstNode* astNode)
  1141. {
  1142. if (auto binOpExpr = BfNodeDynCast<BfBinaryOperatorExpression>(astNode))
  1143. {
  1144. String str;
  1145. str += "(";
  1146. str += DbgNodeToString(binOpExpr->mLeft);
  1147. str += " ";
  1148. str += DbgNodeToString(binOpExpr->mOpToken);
  1149. str += " ";
  1150. str += DbgNodeToString(binOpExpr->mRight);
  1151. str += ")";
  1152. return str;
  1153. }
  1154. else if (auto condExpr = BfNodeDynCast<BfConditionalExpression>(astNode))
  1155. {
  1156. String str;
  1157. str += "( ";
  1158. str += "(";
  1159. str += DbgNodeToString(condExpr->mConditionExpression);
  1160. str += ") ? (";
  1161. str += DbgNodeToString(condExpr->mTrueExpression);
  1162. str += ") : (";
  1163. str += DbgNodeToString(condExpr->mFalseExpression);
  1164. str += ")";
  1165. str += " )";
  1166. return str;
  1167. }
  1168. return astNode->ToString();
  1169. }
  1170. BfExpression* BfReducer::CheckBinaryOperatorPrecedence(BfBinaryOperatorExpression* binOpExpression)
  1171. {
  1172. BfExpression* resultExpr = binOpExpression;
  1173. bool dbg = false;
  1174. #ifdef BF_AST_HAS_PARENT_MEMBER
  1175. BF_ASSERT(BfNodeDynCast<BfBinaryOperatorExpression>(binOpExpression->mParent) == NULL);
  1176. #endif
  1177. SizedArray<BfBinaryOperatorExpression*, 8> binOpParents;
  1178. SizedArray<BfBinaryOperatorExpression*, 8> deferredChecks;
  1179. BfBinaryOperatorExpression* checkBinOpExpression = binOpExpression;
  1180. while (true)
  1181. {
  1182. if (checkBinOpExpression == NULL)
  1183. {
  1184. if (deferredChecks.size() == 0)
  1185. break;
  1186. checkBinOpExpression = deferredChecks.back();
  1187. deferredChecks.pop_back();
  1188. }
  1189. if (dbg)
  1190. OutputDebugStrF("Checking: %s\n", DbgNodeToString(checkBinOpExpression).c_str());
  1191. #ifdef BF_AST_HAS_PARENT_MEMBER
  1192. BfBinaryOperatorExpression* prevBinOpExpression = BfNodeDynCast<BfBinaryOperatorExpression>(checkBinOpExpression->mParent);
  1193. if (prevBinOpExpression != NULL)
  1194. {
  1195. BF_ASSERT(binOpParents.back() == prevBinOpExpression);
  1196. }
  1197. #else
  1198. BfBinaryOperatorExpression* prevBinOpExpression = NULL;
  1199. #endif
  1200. if (!binOpParents.IsEmpty())
  1201. {
  1202. prevBinOpExpression = binOpParents.back();
  1203. }
  1204. BfBinaryOperatorExpression* nextBinaryOperatorExpression = NULL;
  1205. bool didCondSwap = false;
  1206. while (auto rightCondExpression = BfNodeDynCast<BfConditionalExpression>(checkBinOpExpression->mRight))
  1207. {
  1208. if (rightCondExpression->mTrueExpression == NULL)
  1209. break;
  1210. // Turn (A || (B ? C : D)) into ((A || B) ? C : D)
  1211. BfExpression* exprA = checkBinOpExpression->mLeft;
  1212. BfExpression* exprB = rightCondExpression->mConditionExpression;
  1213. BfExpression* exprC = rightCondExpression->mTrueExpression;
  1214. checkBinOpExpression->SetSrcEnd(exprB->GetSrcEnd());
  1215. MEMBER_SET(rightCondExpression, mConditionExpression, checkBinOpExpression);
  1216. MEMBER_SET(checkBinOpExpression, mLeft, exprA);
  1217. MEMBER_SET(checkBinOpExpression, mRight, exprB);
  1218. didCondSwap = true;
  1219. if (dbg)
  1220. {
  1221. OutputDebugStrF("NewCond: %s\n", DbgNodeToString(rightCondExpression).c_str());
  1222. OutputDebugStrF("CheckAfterCond: %s\n", DbgNodeToString(checkBinOpExpression).c_str());
  1223. }
  1224. if (prevBinOpExpression != NULL)
  1225. {
  1226. BF_ASSERT(checkBinOpExpression == prevBinOpExpression->mRight);
  1227. MEMBER_SET(prevBinOpExpression, mRight, rightCondExpression);
  1228. nextBinaryOperatorExpression = prevBinOpExpression;
  1229. binOpParents.pop_back();
  1230. }
  1231. else
  1232. {
  1233. BF_ASSERT(resultExpr == checkBinOpExpression);
  1234. resultExpr = rightCondExpression;
  1235. }
  1236. }
  1237. if (nextBinaryOperatorExpression != NULL)
  1238. {
  1239. checkBinOpExpression = nextBinaryOperatorExpression;
  1240. continue;
  1241. }
  1242. /*auto _CheckLeftBinaryOpearator = [&](BfBinaryOperatorExpression* checkBinOpExpression)
  1243. {
  1244. while (auto leftBinOpExpression = BfNodeDynCast<BfBinaryOperatorExpression>(checkBinOpExpression->mLeft))
  1245. {
  1246. if (dbg)
  1247. {
  1248. OutputDebugStrF("CheckCur : %s\n", DbgNodeToString(checkBinOpExpression).c_str());
  1249. OutputDebugStrF("Left : %s\n", DbgNodeToString(leftBinOpExpression).c_str());
  1250. }
  1251. if (leftBinOpExpression->mRight == NULL)
  1252. {
  1253. BF_ASSERT(mPassInstance->HasFailed());
  1254. return;
  1255. }
  1256. int leftPrecedence = BfGetBinaryOpPrecendence(leftBinOpExpression->mOp);
  1257. int rightPrecedence = BfGetBinaryOpPrecendence(checkBinOpExpression->mOp);
  1258. // Turn ((A + B) * C) into (A + (B * C))
  1259. if (leftPrecedence >= rightPrecedence)
  1260. {
  1261. break;
  1262. }
  1263. BfTokenNode* tokenNode = checkBinOpExpression->mOpToken;
  1264. BfExpression* exprA = leftBinOpExpression->mLeft;
  1265. BfExpression* exprB = leftBinOpExpression->mRight;
  1266. BfExpression* exprC = checkBinOpExpression->mRight;
  1267. auto rightBinOpExpression = leftBinOpExpression; // We reuse this memory for the right side now
  1268. auto binOp = checkBinOpExpression->mOp;
  1269. checkBinOpExpression->mLeft = exprA;
  1270. checkBinOpExpression->mOp = leftBinOpExpression->mOp;
  1271. checkBinOpExpression->mOpToken = leftBinOpExpression->mOpToken;
  1272. checkBinOpExpression->mRight = rightBinOpExpression;
  1273. rightBinOpExpression->mLeft = exprB;
  1274. rightBinOpExpression->mOp = binOp;
  1275. rightBinOpExpression->mOpToken = tokenNode;
  1276. rightBinOpExpression->mRight = exprC;
  1277. rightBinOpExpression->SetSrcStart(rightBinOpExpression->mLeft->GetSrcStart());
  1278. rightBinOpExpression->SetSrcEnd(rightBinOpExpression->mRight->GetSrcEnd());
  1279. if (dbg)
  1280. {
  1281. OutputDebugStrF("CheckAfter : %s\n", DbgNodeToString(checkBinOpExpression).c_str());
  1282. }
  1283. }
  1284. };*/
  1285. while (auto rightBinOpExpression = BfNodeDynCast<BfBinaryOperatorExpression>(checkBinOpExpression->mRight))
  1286. {
  1287. if (dbg)
  1288. {
  1289. OutputDebugStrF("CheckCur : %s\n", DbgNodeToString(checkBinOpExpression).c_str());
  1290. OutputDebugStrF("Right : %s\n", DbgNodeToString(rightBinOpExpression).c_str());
  1291. }
  1292. if (rightBinOpExpression->mRight == NULL)
  1293. {
  1294. BF_ASSERT(mPassInstance->HasFailed());
  1295. return binOpExpression;
  1296. }
  1297. int leftPrecedence = BfGetBinaryOpPrecendence(checkBinOpExpression->mOp);
  1298. int rightPrecedence = BfGetBinaryOpPrecendence(rightBinOpExpression->mOp);
  1299. // Turn (A * (B + C)) into ((A * B) + C)
  1300. // Note: this DOES need to be '<' in order to preserve left-to-right evaluation when precedence is equal
  1301. if (leftPrecedence < rightPrecedence)
  1302. {
  1303. binOpParents.Add(checkBinOpExpression);
  1304. nextBinaryOperatorExpression = rightBinOpExpression;
  1305. break;
  1306. }
  1307. BfTokenNode* tokenNode = checkBinOpExpression->mOpToken;
  1308. BfExpression* exprA = checkBinOpExpression->mLeft;
  1309. BfExpression* exprB = rightBinOpExpression->mLeft;
  1310. BfExpression* exprC = rightBinOpExpression->mRight;
  1311. auto leftBinOpExpression = rightBinOpExpression; // We reuse this memory for the left side now
  1312. auto binOp = checkBinOpExpression->mOp;
  1313. checkBinOpExpression->mLeft = leftBinOpExpression;
  1314. checkBinOpExpression->mOp = rightBinOpExpression->mOp;
  1315. checkBinOpExpression->mOpToken = rightBinOpExpression->mOpToken;
  1316. checkBinOpExpression->mRight = exprC;
  1317. leftBinOpExpression->mLeft = exprA;
  1318. leftBinOpExpression->mOp = binOp;
  1319. leftBinOpExpression->mOpToken = tokenNode;
  1320. leftBinOpExpression->mRight = exprB;
  1321. leftBinOpExpression->SetSrcStart(leftBinOpExpression->mLeft->GetSrcStart());
  1322. leftBinOpExpression->SetSrcEnd(leftBinOpExpression->mRight->GetSrcEnd());
  1323. if (dbg)
  1324. {
  1325. OutputDebugStrF("CheckAfter: %s\n", DbgNodeToString(checkBinOpExpression).c_str());
  1326. }
  1327. if ((leftPrecedence > rightPrecedence) && (prevBinOpExpression != NULL))
  1328. {
  1329. // Backtrack
  1330. nextBinaryOperatorExpression = prevBinOpExpression;
  1331. binOpParents.pop_back();
  1332. break;
  1333. }
  1334. if (auto leftBinaryExpr = BfNodeDynCast<BfBinaryOperatorExpression>(checkBinOpExpression->mLeft))
  1335. {
  1336. deferredChecks.push_back(leftBinaryExpr);
  1337. }
  1338. }
  1339. checkBinOpExpression = nextBinaryOperatorExpression;
  1340. }
  1341. if (dbg)
  1342. OutputDebugStrF("NodeOut: %s\n", DbgNodeToString(resultExpr).c_str());
  1343. return resultExpr;
  1344. }
  1345. BfAstNode* BfReducer::ReplaceTokenStarter(BfAstNode* astNode, int idx, bool allowIn)
  1346. {
  1347. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(astNode))
  1348. {
  1349. if ((tokenNode->GetToken() == BfToken_As) ||
  1350. ((tokenNode->GetToken() == BfToken_In) && (!allowIn)))
  1351. {
  1352. if (idx == -1)
  1353. idx = mVisitorPos.mReadPos;
  1354. BF_ASSERT(mVisitorPos.Get(idx) == astNode);
  1355. auto identifierNode = mAlloc->Alloc<BfIdentifierNode>();
  1356. ReplaceNode(tokenNode, identifierNode);
  1357. mVisitorPos.Set(idx, identifierNode);
  1358. return identifierNode;
  1359. }
  1360. }
  1361. return astNode;
  1362. }
  1363. BfEnumCaseBindExpression* BfReducer::CreateEnumCaseBindExpression(BfTokenNode* bindToken)
  1364. {
  1365. auto bindExpr = mAlloc->Alloc<BfEnumCaseBindExpression>();
  1366. MEMBER_SET(bindExpr, mBindToken, bindToken);
  1367. mVisitorPos.MoveNext();
  1368. auto nextNode = mVisitorPos.GetNext();
  1369. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  1370. {
  1371. if (nextToken->GetToken() == BfToken_Dot)
  1372. {
  1373. auto memberReferenceExpr = mAlloc->Alloc<BfMemberReferenceExpression>();
  1374. MEMBER_SET(memberReferenceExpr, mDotToken, nextToken);
  1375. mVisitorPos.MoveNext();
  1376. auto memberName = ExpectIdentifierAfter(memberReferenceExpr);
  1377. if (memberName != NULL)
  1378. {
  1379. MEMBER_SET(memberReferenceExpr, mMemberName, memberName);
  1380. }
  1381. MEMBER_SET(bindExpr, mEnumMemberExpr, memberReferenceExpr);
  1382. }
  1383. }
  1384. if (bindExpr->mEnumMemberExpr == NULL)
  1385. {
  1386. auto typeRef = CreateTypeRefAfter(bindExpr);
  1387. if (typeRef != NULL)
  1388. {
  1389. if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(typeRef))
  1390. {
  1391. MEMBER_SET(bindExpr, mEnumMemberExpr, namedTypeRef->mNameNode);
  1392. }
  1393. else
  1394. {
  1395. auto memberRefExpr = mAlloc->Alloc<BfMemberReferenceExpression>();
  1396. if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(typeRef))
  1397. {
  1398. if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(qualifiedTypeRef->mRight))
  1399. {
  1400. MEMBER_SET(memberRefExpr, mTarget, qualifiedTypeRef->mLeft);
  1401. MEMBER_SET(memberRefExpr, mDotToken, qualifiedTypeRef->mDot);
  1402. MEMBER_SET(memberRefExpr, mMemberName, namedTypeRef->mNameNode);
  1403. }
  1404. }
  1405. else
  1406. {
  1407. MEMBER_SET(memberRefExpr, mTarget, typeRef);
  1408. }
  1409. MEMBER_SET(bindExpr, mEnumMemberExpr, memberRefExpr);
  1410. }
  1411. }
  1412. if (bindExpr->mEnumMemberExpr == NULL)
  1413. {
  1414. Fail("Expected enum case name", typeRef);
  1415. }
  1416. }
  1417. if (bindExpr->mEnumMemberExpr != NULL)
  1418. {
  1419. auto openToken = ExpectTokenAfter(bindExpr->mEnumMemberExpr, BfToken_LParen);
  1420. if (openToken != NULL)
  1421. {
  1422. auto tupleExpr = CreateTupleExpression(openToken, NULL);
  1423. MEMBER_SET(bindExpr, mBindNames, tupleExpr);
  1424. }
  1425. }
  1426. return bindExpr;
  1427. }
  1428. BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags createExprFlags)
  1429. {
  1430. if (node == NULL)
  1431. return NULL;
  1432. BP_ZONE("CreateExpression");
  1433. //
  1434. {
  1435. BP_ZONE("CreateExpression.CheckStack");
  1436. StackHelper stackHelper;
  1437. if (!stackHelper.CanStackExpand(64 * 1024))
  1438. {
  1439. BfExpression* result = NULL;
  1440. if (!stackHelper.Execute([&]()
  1441. {
  1442. result = CreateExpression(node, createExprFlags);
  1443. }))
  1444. {
  1445. Fail("Expression too complex to parse", node);
  1446. }
  1447. return result;
  1448. }
  1449. }
  1450. if (!AssertCurrentNode(node))
  1451. return NULL;
  1452. auto rhsCreateExprFlags = (CreateExprFlags)(createExprFlags & CreateExprFlags_BreakOnRChevron);
  1453. auto exprLeft = BfNodeDynCast<BfExpression>(node);
  1454. AssertCurrentNode(node);
  1455. if (auto interpolateExpr = BfNodeDynCastExact<BfStringInterpolationExpression>(node))
  1456. {
  1457. for (auto block : interpolateExpr->mExpressions)
  1458. {
  1459. HandleBlock(block, true);
  1460. }
  1461. return interpolateExpr;
  1462. }
  1463. if ((createExprFlags & (CreateExprFlags_AllowVariableDecl | CreateExprFlags_PermissiveVariableDecl)) != 0)
  1464. {
  1465. bool isLocalVariable = false;
  1466. auto nextNode = mVisitorPos.GetNext();
  1467. BfVariableDeclaration* continuingVariable = NULL;
  1468. int outEndNode = -1;
  1469. bool couldBeExpr = false;
  1470. bool isTuple = false;
  1471. if (IsTypeReference(node, BfToken_None, -1, &outEndNode, &couldBeExpr, NULL, &isTuple))
  1472. {
  1473. if ((createExprFlags & CreateExprFlags_PermissiveVariableDecl) != 0)
  1474. isLocalVariable = true;
  1475. else if (auto identifierNode = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.Get(outEndNode)))
  1476. {
  1477. if (auto equalsToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(outEndNode + 1)))
  1478. {
  1479. if (equalsToken->GetToken() == BfToken_AssignEquals)
  1480. isLocalVariable = true;
  1481. }
  1482. //if (!couldBeExpr)
  1483. {
  1484. auto endingTokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(outEndNode - 1));
  1485. // If the type ends with a * or a ? then it could be an expression
  1486. if (endingTokenNode == NULL)
  1487. {
  1488. isLocalVariable = true;
  1489. }
  1490. else
  1491. {
  1492. BfToken endingToken = endingTokenNode->GetToken();
  1493. if (endingToken == BfToken_RParen)
  1494. {
  1495. if (isTuple)
  1496. isLocalVariable = true;
  1497. }
  1498. else if ((endingToken != BfToken_Star) && (endingToken != BfToken_Question))
  1499. isLocalVariable = true;
  1500. }
  1501. }
  1502. }
  1503. if (auto typeNameToken = BfNodeDynCast<BfTokenNode>(node))
  1504. {
  1505. if ((typeNameToken->GetToken() == BfToken_Var) || (typeNameToken->GetToken() == BfToken_Let))
  1506. isLocalVariable = true;
  1507. }
  1508. }
  1509. if (nextNode == NULL)
  1510. {
  1511. // Treat ending identifier as just an identifier (could be block result)
  1512. isLocalVariable = false;
  1513. }
  1514. if ((isLocalVariable) || (continuingVariable != NULL))
  1515. {
  1516. auto variableDeclaration = mAlloc->Alloc<BfVariableDeclaration>();
  1517. BfTypeReference* typeRef = NULL;
  1518. if (continuingVariable != NULL)
  1519. {
  1520. typeRef = continuingVariable->mTypeRef;
  1521. variableDeclaration->mModSpecifier = continuingVariable->mModSpecifier;
  1522. ReplaceNode(node, variableDeclaration);
  1523. variableDeclaration->mPrecedingComma = (BfTokenNode*)node;
  1524. }
  1525. else
  1526. {
  1527. typeRef = CreateTypeRef(node);
  1528. if (typeRef == NULL)
  1529. return NULL;
  1530. ReplaceNode(typeRef, variableDeclaration);
  1531. }
  1532. variableDeclaration->mTypeRef = typeRef;
  1533. BfAstNode* variableNameNode = NULL;
  1534. nextNode = mVisitorPos.GetNext();
  1535. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  1536. {
  1537. if (tokenNode->GetToken() == BfToken_LParen)
  1538. {
  1539. mVisitorPos.mReadPos++;
  1540. variableNameNode = CreateTupleExpression(tokenNode);
  1541. }
  1542. }
  1543. if (variableNameNode == NULL)
  1544. variableNameNode = ExpectIdentifierAfter(variableDeclaration, "variable name");
  1545. if (variableNameNode == NULL)
  1546. return variableDeclaration;
  1547. auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  1548. variableDeclaration->mNameNode = variableNameNode;
  1549. MoveNode(variableNameNode, variableDeclaration);
  1550. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_AssignEquals))
  1551. {
  1552. MEMBER_SET(variableDeclaration, mEqualsNode, tokenNode);
  1553. mVisitorPos.MoveNext();
  1554. if (variableDeclaration->mInitializer == NULL)
  1555. variableDeclaration->mInitializer = CreateExpressionAfter(variableDeclaration);
  1556. if (variableDeclaration->mInitializer == NULL)
  1557. return variableDeclaration;
  1558. MoveNode(variableDeclaration->mInitializer, variableDeclaration);
  1559. }
  1560. exprLeft = variableDeclaration;
  1561. }
  1562. }
  1563. if (auto block = BfNodeDynCast<BfBlock>(node))
  1564. {
  1565. HandleBlock(block, true);
  1566. exprLeft = block;
  1567. }
  1568. if (auto identifierNode = BfNodeDynCast<BfIdentifierNode>(exprLeft))
  1569. {
  1570. identifierNode = CompactQualifiedName(identifierNode);
  1571. exprLeft = identifierNode;
  1572. if ((mCompatMode) && (exprLeft->ToString() == "defined"))
  1573. {
  1574. auto definedNodeExpr = mAlloc->Alloc<BfPreprocessorDefinedExpression>();
  1575. ReplaceNode(identifierNode, definedNodeExpr);
  1576. auto nextNode = mVisitorPos.GetNext();
  1577. bool hadParenToken = false;
  1578. if (auto parenToken = BfNodeDynCast<BfTokenNode>(nextNode))
  1579. {
  1580. if (parenToken->GetToken() == BfToken_LParen)
  1581. {
  1582. mVisitorPos.MoveNext();
  1583. MoveNode(parenToken, definedNodeExpr);
  1584. hadParenToken = true;
  1585. }
  1586. }
  1587. auto definedIdentifier = ExpectIdentifierAfter(definedNodeExpr);
  1588. MEMBER_SET_CHECKED(definedNodeExpr, mIdentifier, definedIdentifier);
  1589. if (hadParenToken)
  1590. {
  1591. auto parenToken = ExpectTokenAfter(definedNodeExpr, BfToken_RParen);
  1592. if (parenToken != NULL)
  1593. MoveNode(parenToken, definedNodeExpr);
  1594. }
  1595. exprLeft = definedNodeExpr;
  1596. }
  1597. int endNodeIdx = -1;
  1598. if ((IsTypeReference(exprLeft, BfToken_LBracket, -1, &endNodeIdx, NULL)))
  1599. {
  1600. if (IsTypeReference(exprLeft, BfToken_LBrace, -1, NULL, NULL))
  1601. {
  1602. BfSizedArrayCreateExpression* arrayCreateExpr = mAlloc->Alloc<BfSizedArrayCreateExpression>();
  1603. auto typeRef = CreateTypeRef(exprLeft);
  1604. if (typeRef != NULL)
  1605. {
  1606. ReplaceNode(typeRef, arrayCreateExpr);
  1607. auto arrayType = BfNodeDynCast<BfArrayTypeRef>(typeRef);
  1608. if (arrayType != NULL)
  1609. {
  1610. arrayCreateExpr->mTypeRef = arrayType;
  1611. auto nextNode = mVisitorPos.GetNext();
  1612. auto block = BfNodeDynCast<BfBlock>(nextNode);
  1613. if (block != NULL)
  1614. {
  1615. Fail("Brace initialization is not supported. Enclose initializer with parentheses.", block);
  1616. auto initializerExpr = CreateCollectionInitializerExpression(block);
  1617. MEMBER_SET(arrayCreateExpr, mInitializer, initializerExpr);
  1618. mVisitorPos.MoveNext();
  1619. }
  1620. exprLeft = arrayCreateExpr;
  1621. }
  1622. else
  1623. {
  1624. Fail("Sized array type expected", typeRef);
  1625. }
  1626. }
  1627. }
  1628. else if (IsTypeReference(exprLeft, BfToken_LParen, -1, NULL, NULL))
  1629. {
  1630. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(endNodeIdx - 1)))
  1631. {
  1632. if ((tokenNode->mToken == BfToken_Star) || (tokenNode->mToken == BfToken_Question)) // Is it something that can ONLY be a sized type reference?
  1633. {
  1634. BfSizedArrayCreateExpression* arrayCreateExpr = mAlloc->Alloc<BfSizedArrayCreateExpression>();
  1635. auto typeRef = CreateTypeRef(exprLeft);
  1636. if (typeRef != NULL)
  1637. {
  1638. ReplaceNode(typeRef, arrayCreateExpr);
  1639. auto arrayType = BfNodeDynCast<BfArrayTypeRef>(typeRef);
  1640. if (arrayType != NULL)
  1641. {
  1642. arrayCreateExpr->mTypeRef = arrayType;
  1643. auto nextNode = mVisitorPos.GetNext();
  1644. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  1645. {
  1646. mVisitorPos.MoveNext();
  1647. auto initializerExpr = CreateCollectionInitializerExpression(nextToken);
  1648. MEMBER_SET(arrayCreateExpr, mInitializer, initializerExpr);
  1649. }
  1650. exprLeft = arrayCreateExpr;
  1651. }
  1652. else
  1653. {
  1654. Fail("Sized array type expected", typeRef);
  1655. AddErrorNode(typeRef);
  1656. return NULL;
  1657. }
  1658. }
  1659. }
  1660. }
  1661. }
  1662. }
  1663. else if (endNodeIdx != -1)
  1664. {
  1665. if (auto blockNode = BfNodeDynCast<BfBlock>(mVisitorPos.Get(endNodeIdx)))
  1666. {
  1667. auto typeRef = CreateTypeRef(mVisitorPos.GetCurrent());
  1668. if (typeRef)
  1669. {
  1670. exprLeft = TryCreateInitializerExpression(typeRef);
  1671. }
  1672. }
  1673. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(endNodeIdx)))
  1674. {
  1675. if (tokenNode->mToken == BfToken_LParen)
  1676. {
  1677. int openCount = 1;
  1678. int checkIdx = endNodeIdx + 1;
  1679. while (true)
  1680. {
  1681. auto checkNode = mVisitorPos.Get(checkIdx);
  1682. if (checkNode == NULL)
  1683. break;
  1684. if (auto checkTokenNode = BfNodeDynCast<BfTokenNode>(checkNode))
  1685. {
  1686. if (checkTokenNode->mToken == BfToken_LParen)
  1687. openCount++;
  1688. if (checkTokenNode->mToken == BfToken_RParen)
  1689. {
  1690. openCount--;
  1691. if (openCount == 0)
  1692. break;
  1693. }
  1694. }
  1695. checkIdx++;
  1696. }
  1697. if (auto blockNode = BfNodeDynCast<BfBlock>(mVisitorPos.Get(checkIdx + 1)))
  1698. {
  1699. // If we have 'A() { ... }', that can either be an invocation with an initializer block or a
  1700. // create expression with an inline type declaration + initializer block
  1701. if (InitializerBlockHasInlineTypeDecl(blockNode))
  1702. {
  1703. exprLeft = CreateObjectCreateExpression(NULL, exprLeft);
  1704. if (auto initExpr = TryCreateInitializerExpression(exprLeft))
  1705. exprLeft = initExpr;
  1706. }
  1707. }
  1708. }
  1709. }
  1710. }
  1711. }
  1712. if (exprLeft == NULL)
  1713. {
  1714. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(node))
  1715. {
  1716. BfAstNode* notNode = NULL;
  1717. if (tokenNode->mToken == BfToken_Not)
  1718. {
  1719. auto nextNode = mVisitorPos.GetNext();
  1720. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  1721. {
  1722. if (nextTokenNode->mToken == BfToken_Case)
  1723. {
  1724. mVisitorPos.MoveNext();
  1725. notNode = tokenNode;
  1726. node = nextNode;
  1727. tokenNode = nextTokenNode;
  1728. }
  1729. }
  1730. }
  1731. BfToken token = tokenNode->GetToken();
  1732. auto nextNode = mVisitorPos.GetNext();
  1733. if ((nextNode != NULL) &&
  1734. ((token == BfToken_Checked) ||
  1735. (token == BfToken_Unchecked)))
  1736. {
  1737. mVisitorPos.MoveNext();
  1738. auto nextExpr = CreateExpression(nextNode);
  1739. if (nextExpr == NULL)
  1740. return NULL;
  1741. return nextExpr;
  1742. }
  1743. else if ((token == BfToken_New) ||
  1744. (token == BfToken_Scope) ||
  1745. (token == BfToken_Append))
  1746. {
  1747. auto allocNode = CreateAllocNode(tokenNode);
  1748. bool isDelegateBind = false;
  1749. bool isLambdaBind = false;
  1750. bool isBoxing = false;
  1751. auto nextNode = mVisitorPos.GetNext();
  1752. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  1753. {
  1754. int nextToken = nextTokenNode->GetToken();
  1755. isBoxing = nextToken == BfToken_Box;
  1756. isDelegateBind = nextToken == BfToken_FatArrow;
  1757. isLambdaBind = (nextToken == BfToken_LBracket);
  1758. // Either this is a lambda bind or a dynamic tuple allocation.
  1759. // We assume it's a lambda bind unless theres a "()" afterward
  1760. if (nextToken == BfToken_LParen)
  1761. {
  1762. int endNode = -1;
  1763. mVisitorPos.mReadPos++;
  1764. if (!IsTypeReference(nextTokenNode, BfToken_LParen, -1, &endNode))
  1765. {
  1766. isLambdaBind = true;
  1767. }
  1768. mVisitorPos.mReadPos--;
  1769. }
  1770. }
  1771. if (auto interpExpr = BfNodeDynCastExact<BfStringInterpolationExpression>(nextNode))
  1772. {
  1773. mVisitorPos.MoveNext();
  1774. auto nextInterpExpr = CreateExpression(nextNode);
  1775. BF_ASSERT(nextInterpExpr == interpExpr);
  1776. interpExpr->mAllocNode = allocNode;
  1777. interpExpr->mTriviaStart = allocNode->mTriviaStart;
  1778. interpExpr->mSrcStart = allocNode->mSrcStart;
  1779. exprLeft = interpExpr;
  1780. }
  1781. else if (isBoxing)
  1782. {
  1783. auto boxExpr = mAlloc->Alloc<BfBoxExpression>();
  1784. ReplaceNode(allocNode, boxExpr);
  1785. boxExpr->mAllocNode = allocNode;
  1786. tokenNode = ExpectTokenAfter(boxExpr, BfToken_Box);
  1787. MEMBER_SET(boxExpr, mBoxToken, tokenNode);
  1788. auto exprNode = CreateExpressionAfter(boxExpr);
  1789. if (exprNode != NULL)
  1790. {
  1791. MEMBER_SET(boxExpr, mExpression, exprNode);
  1792. }
  1793. return boxExpr;
  1794. }
  1795. else if (isLambdaBind)
  1796. exprLeft = CreateLambdaBindExpression(allocNode);
  1797. else if (isDelegateBind)
  1798. exprLeft = CreateDelegateBindExpression(allocNode);
  1799. else
  1800. {
  1801. exprLeft = CreateObjectCreateExpression(allocNode);
  1802. if (auto initExpr = TryCreateInitializerExpression(exprLeft))
  1803. exprLeft = initExpr;
  1804. }
  1805. if (token == BfToken_Append)
  1806. {
  1807. #ifdef BF_AST_HAS_PARENT_MEMBER
  1808. auto ctorDeclP = exprLeft->FindParentOfType<BfConstructorDeclaration>();
  1809. if (ctorDeclP != NULL)
  1810. ctorDeclP->mHasAppend = true;
  1811. #endif
  1812. #ifdef BF_AST_HAS_PARENT_MEMBER
  1813. BF_ASSERT(ctorDecl == ctorDeclP);
  1814. #endif
  1815. }
  1816. }
  1817. else if (token == BfToken_This)
  1818. {
  1819. auto thisExpr = mAlloc->Alloc<BfThisExpression>();
  1820. ReplaceNode(tokenNode, thisExpr);
  1821. thisExpr->SetTriviaStart(tokenNode->GetTriviaStart());
  1822. exprLeft = thisExpr;
  1823. }
  1824. else if (token == BfToken_Base)
  1825. {
  1826. auto baseExpr = mAlloc->Alloc<BfBaseExpression>();
  1827. ReplaceNode(tokenNode, baseExpr);
  1828. baseExpr->SetTriviaStart(tokenNode->GetTriviaStart());
  1829. exprLeft = baseExpr;
  1830. }
  1831. else if (token == BfToken_Null)
  1832. {
  1833. BfVariant nullVariant;
  1834. nullVariant.mTypeCode = BfTypeCode_NullPtr;
  1835. auto bfLiteralExpression = mAlloc->Alloc<BfLiteralExpression>();
  1836. bfLiteralExpression->mValue = nullVariant;
  1837. ReplaceNode(tokenNode, bfLiteralExpression);
  1838. bfLiteralExpression->SetTriviaStart(tokenNode->GetTriviaStart());
  1839. exprLeft = bfLiteralExpression;
  1840. }
  1841. else if ((token == BfToken_TypeOf) || (token == BfToken_SizeOf) ||
  1842. (token == BfToken_AlignOf) || (token == BfToken_StrideOf))
  1843. {
  1844. BfTypeAttrExpression* typeAttrExpr = NULL;
  1845. switch (tokenNode->GetToken())
  1846. {
  1847. case BfToken_TypeOf:
  1848. typeAttrExpr = mAlloc->Alloc<BfTypeOfExpression>();
  1849. break;
  1850. case BfToken_SizeOf:
  1851. typeAttrExpr = mAlloc->Alloc<BfSizeOfExpression>();
  1852. break;
  1853. case BfToken_AlignOf:
  1854. typeAttrExpr = mAlloc->Alloc<BfAlignOfExpression>();
  1855. break;
  1856. case BfToken_StrideOf:
  1857. typeAttrExpr = mAlloc->Alloc<BfStrideOfExpression>();
  1858. break;
  1859. default: break;
  1860. }
  1861. ReplaceNode(tokenNode, typeAttrExpr);
  1862. typeAttrExpr->mToken = tokenNode;
  1863. tokenNode = ExpectTokenAfter(typeAttrExpr, BfToken_LParen);
  1864. MEMBER_SET_CHECKED(typeAttrExpr, mOpenParen, tokenNode);
  1865. auto typeRef = CreateTypeRefAfter(typeAttrExpr);
  1866. MEMBER_SET_CHECKED(typeAttrExpr, mTypeRef, typeRef);
  1867. tokenNode = ExpectTokenAfter(typeAttrExpr, BfToken_RParen);
  1868. MEMBER_SET_CHECKED(typeAttrExpr, mCloseParen, tokenNode);
  1869. exprLeft = typeAttrExpr;
  1870. }
  1871. else if (token == BfToken_OffsetOf)
  1872. {
  1873. BfOffsetOfExpression* typeAttrExpr = mAlloc->Alloc<BfOffsetOfExpression>();
  1874. ReplaceNode(tokenNode, typeAttrExpr);
  1875. typeAttrExpr->mToken = tokenNode;
  1876. tokenNode = ExpectTokenAfter(typeAttrExpr, BfToken_LParen);
  1877. MEMBER_SET_CHECKED(typeAttrExpr, mOpenParen, tokenNode);
  1878. auto typeRef = CreateTypeRefAfter(typeAttrExpr);
  1879. MEMBER_SET_CHECKED(typeAttrExpr, mTypeRef, typeRef);
  1880. tokenNode = ExpectTokenAfter(typeAttrExpr, BfToken_Comma);
  1881. MEMBER_SET_CHECKED(typeAttrExpr, mCommaToken, tokenNode);
  1882. auto nameNode = ExpectIdentifierAfter(typeAttrExpr);
  1883. MEMBER_SET_CHECKED(typeAttrExpr, mMemberName, nameNode);
  1884. tokenNode = ExpectTokenAfter(typeAttrExpr, BfToken_RParen);
  1885. MEMBER_SET_CHECKED(typeAttrExpr, mCloseParen, tokenNode);
  1886. exprLeft = typeAttrExpr;
  1887. }
  1888. else if (token == BfToken_Default)
  1889. {
  1890. auto defaultExpr = mAlloc->Alloc<BfDefaultExpression>();
  1891. ReplaceNode(tokenNode, defaultExpr);
  1892. defaultExpr->mDefaultToken = tokenNode;
  1893. if ((tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext())) && (tokenNode->GetToken() == BfToken_LParen))
  1894. {
  1895. mVisitorPos.MoveNext();
  1896. //tokenNode = ExpectTokenAfter(defaultExpr, BfToken_LParen);
  1897. MEMBER_SET_CHECKED(defaultExpr, mOpenParen, tokenNode);
  1898. auto sizeRef = CreateTypeRefAfter(defaultExpr);
  1899. MEMBER_SET_CHECKED(defaultExpr, mTypeRef, sizeRef);
  1900. tokenNode = ExpectTokenAfter(defaultExpr, BfToken_RParen);
  1901. MEMBER_SET_CHECKED(defaultExpr, mCloseParen, tokenNode);
  1902. }
  1903. exprLeft = defaultExpr;
  1904. }
  1905. else if (token == BfToken_IsConst)
  1906. {
  1907. auto isConstExpr = mAlloc->Alloc<BfIsConstExpression>();
  1908. ReplaceNode(tokenNode, isConstExpr);
  1909. isConstExpr->mIsConstToken = tokenNode;
  1910. tokenNode = ExpectTokenAfter(isConstExpr, BfToken_LParen);
  1911. MEMBER_SET_CHECKED(isConstExpr, mOpenParen, tokenNode);
  1912. auto expr = CreateExpressionAfter(isConstExpr);
  1913. MEMBER_SET_CHECKED(isConstExpr, mExpression, expr);
  1914. tokenNode = ExpectTokenAfter(isConstExpr, BfToken_RParen);
  1915. MEMBER_SET_CHECKED(isConstExpr, mCloseParen, tokenNode);
  1916. exprLeft = isConstExpr;
  1917. }
  1918. else if (token == BfToken_Question)
  1919. {
  1920. auto uninitExpr = mAlloc->Alloc<BfUninitializedExpression>();
  1921. ReplaceNode(tokenNode, uninitExpr);
  1922. uninitExpr->mQuestionToken = tokenNode;
  1923. return uninitExpr;
  1924. //MEMBER_SET(variableDeclaration, mInitializer, uninitExpr);
  1925. }
  1926. else if (token == BfToken_Case)
  1927. {
  1928. auto caseExpr = mAlloc->Alloc<BfCaseExpression>();
  1929. if (notNode != NULL)
  1930. {
  1931. ReplaceNode(notNode, caseExpr);
  1932. caseExpr->mNotToken = notNode;
  1933. MEMBER_SET(caseExpr, mCaseToken, tokenNode);
  1934. }
  1935. else
  1936. {
  1937. ReplaceNode(tokenNode, caseExpr);
  1938. caseExpr->mCaseToken = tokenNode;
  1939. }
  1940. if (auto bindToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  1941. {
  1942. if ((bindToken->GetToken() == BfToken_Var) || (bindToken->GetToken() == BfToken_Let))
  1943. {
  1944. auto expr = CreateEnumCaseBindExpression(bindToken);
  1945. if (expr == NULL)
  1946. return caseExpr;
  1947. MEMBER_SET(caseExpr, mCaseExpression, expr);
  1948. }
  1949. }
  1950. if (caseExpr->mCaseExpression == NULL)
  1951. {
  1952. auto expr = CreateExpressionAfter(caseExpr, (CreateExprFlags)(CreateExprFlags_NoAssignment | CreateExprFlags_PermissiveVariableDecl));
  1953. if (expr == NULL)
  1954. return caseExpr;
  1955. MEMBER_SET(caseExpr, mCaseExpression, expr);
  1956. }
  1957. auto equalsNode = ExpectTokenAfter(caseExpr, BfToken_AssignEquals);
  1958. if (equalsNode == NULL)
  1959. return caseExpr;
  1960. MEMBER_SET(caseExpr, mEqualsNode, equalsNode);
  1961. auto expr = CreateExpressionAfter(caseExpr);
  1962. if (expr == NULL)
  1963. return caseExpr;
  1964. MEMBER_SET(caseExpr, mValueExpression, expr);
  1965. return caseExpr;
  1966. }
  1967. else if (token == BfToken_Dot) // Abbreviated dot syntax ".EnumVal"
  1968. {
  1969. bool handled = false;
  1970. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  1971. {
  1972. if (nextTokenNode->mToken == BfToken_This)
  1973. {
  1974. auto invocationExpr = CreateObjectCreateExpression(NULL, tokenNode);
  1975. if (invocationExpr == NULL)
  1976. return exprLeft;
  1977. exprLeft = invocationExpr;
  1978. handled = true;
  1979. }
  1980. }
  1981. if (auto blockNode = BfNodeDynCast<BfBlock>(mVisitorPos.GetNext()))
  1982. {
  1983. // Initializer ".{ x = 1, y = 2 }"
  1984. auto typeRef = CreateTypeRef(mVisitorPos.GetCurrent());
  1985. if (typeRef)
  1986. {
  1987. exprLeft = TryCreateInitializerExpression(typeRef);
  1988. }
  1989. }
  1990. else if (!handled)
  1991. {
  1992. auto memberReferenceExpr = mAlloc->Alloc<BfMemberReferenceExpression>();
  1993. ReplaceNode(tokenNode, memberReferenceExpr);
  1994. MEMBER_SET(memberReferenceExpr, mDotToken, tokenNode);
  1995. bool handled = false;
  1996. if (auto nextToken = BfNodeDynCastExact<BfTokenNode>(mVisitorPos.GetNext()))
  1997. {
  1998. if (nextToken->GetToken() == BfToken_LParen)
  1999. {
  2000. // It's an unnamed dot ctor
  2001. handled = true;
  2002. }
  2003. }
  2004. if (!handled)
  2005. {
  2006. auto memberName = ExpectIdentifierAfter(memberReferenceExpr);
  2007. if (memberName != NULL)
  2008. {
  2009. MEMBER_SET(memberReferenceExpr, mMemberName, memberName);
  2010. }
  2011. }
  2012. // We don't set exprLeft here because it's illegal to do ".EnumVal.SomethingElse". That wouldn't make
  2013. // sense because the abbreviated syntax relies on type inference and the ".SomethingElse" wouldn't be
  2014. // the right type (whatever it is), AND mostly importantly, it breaks autocomplete when we are typing
  2015. // "KEnum val = ." above a line that starts with a something like a method call "OtherThing.MethodCall()"
  2016. // The exception is if we're creating an enum val with a payload
  2017. //auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  2018. //if ((nextToken != NULL) && (nextToken->GetToken() == BfToken_LParen))
  2019. {
  2020. exprLeft = memberReferenceExpr;
  2021. }
  2022. /*else
  2023. {
  2024. return memberReferenceExpr;
  2025. }*/
  2026. }
  2027. }
  2028. else if (token == BfToken_LBracket)
  2029. {
  2030. if ((createExprFlags & CreateExprFlags_AllowAnonymousIndexer) != 0)
  2031. {
  2032. exprLeft = CreateIndexerExpression(NULL, tokenNode);
  2033. }
  2034. else
  2035. exprLeft = CreateAttributedExpression(tokenNode, false);
  2036. }
  2037. else if (token == BfToken_FatArrow)
  2038. {
  2039. auto delegateBindExpr = mAlloc->Alloc<BfDelegateBindExpression>();
  2040. ReplaceNode(tokenNode, delegateBindExpr);
  2041. MEMBER_SET_CHECKED(delegateBindExpr, mFatArrowToken, tokenNode);
  2042. auto expr = CreateExpressionAfter(delegateBindExpr);
  2043. MEMBER_SET_CHECKED(delegateBindExpr, mTarget, expr);
  2044. auto nextNode = mVisitorPos.GetNext();
  2045. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  2046. {
  2047. if (tokenNode->GetToken() == BfToken_LChevron)
  2048. {
  2049. mVisitorPos.MoveNext();
  2050. auto genericParamsDecl = CreateGenericArguments(tokenNode);
  2051. MEMBER_SET_CHECKED(delegateBindExpr, mGenericArgs, genericParamsDecl);
  2052. }
  2053. }
  2054. return delegateBindExpr;
  2055. }
  2056. }
  2057. }
  2058. if (exprLeft == NULL)
  2059. {
  2060. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(node))
  2061. {
  2062. BfUnaryOperatorExpression* unaryOpExpr = NULL;
  2063. auto nextNode = mVisitorPos.GetNext();
  2064. if ((tokenNode->GetToken() == BfToken_LParen) && (nextNode != NULL))
  2065. {
  2066. bool couldBeExpr = true;
  2067. // Peek ahead
  2068. int endNodeIdx = -1;
  2069. BfAstNode* endNode = NULL;
  2070. bool isTuple = false;
  2071. bool outerIsTypeRef = IsTypeReference(tokenNode, BfToken_FatArrow, -1, &endNodeIdx, &couldBeExpr, NULL, &isTuple);
  2072. if (outerIsTypeRef)
  2073. {
  2074. if (endNodeIdx != -1)
  2075. {
  2076. endNode = mVisitorPos.Get(endNodeIdx);
  2077. if (auto endToken = BfNodeDynCast<BfTokenNode>(endNode))
  2078. {
  2079. bool isLambda = false;
  2080. if (endToken->GetToken() == BfToken_FatArrow)
  2081. {
  2082. isLambda = true;
  2083. if (auto innerToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  2084. {
  2085. if (innerToken->mToken != BfToken_RParen)
  2086. {
  2087. // Specifically we're looking for a (function ...) cast, but any token besides a close here means it's not a lambda
  2088. isLambda = false;
  2089. }
  2090. }
  2091. }
  2092. if (isLambda)
  2093. return CreateLambdaBindExpression(NULL, tokenNode);
  2094. }
  2095. }
  2096. }
  2097. bool isCastExpr = false;
  2098. couldBeExpr = false;
  2099. isTuple = false;
  2100. if ((createExprFlags & CreateExprFlags_NoCast) == 0)
  2101. isCastExpr = IsTypeReference(node, BfToken_RParen, -1, &endNodeIdx, &couldBeExpr, NULL, &isTuple);
  2102. if (endNodeIdx != -1)
  2103. endNode = mVisitorPos.Get(endNodeIdx);
  2104. if (isCastExpr)
  2105. {
  2106. bool isValidTupleCast = false;
  2107. auto tokenNextNode = mVisitorPos.Get(mVisitorPos.mReadPos + 1);
  2108. if (auto startToken = BfNodeDynCast<BfTokenNode>(tokenNextNode))
  2109. {
  2110. if (startToken->GetToken() == BfToken_LParen)
  2111. {
  2112. if (endNode != NULL)
  2113. {
  2114. auto afterEndNode = mVisitorPos.Get(endNodeIdx + 1);
  2115. if (auto afterEndToken = BfNodeDynCast<BfTokenNode>(afterEndNode))
  2116. {
  2117. if (afterEndToken->GetToken() == BfToken_RParen)
  2118. {
  2119. isValidTupleCast = true;
  2120. endNode = afterEndToken; // Check this one now, instead...
  2121. }
  2122. }
  2123. }
  2124. if (!isValidTupleCast)
  2125. isCastExpr = false;
  2126. }
  2127. }
  2128. BfAstNode* beforeEndNode = mVisitorPos.Get(endNodeIdx - 1);
  2129. if (auto prevTokenNode = BfNodeDynCast<BfTokenNode>(beforeEndNode))
  2130. {
  2131. int prevToken = prevTokenNode->GetToken();
  2132. // Ending in a "*" or a ">" means it's definitely a type reference
  2133. if ((prevToken == BfToken_Star) || (prevToken == BfToken_RChevron) || (prevToken == BfToken_RDblChevron))
  2134. couldBeExpr = false;
  2135. }
  2136. // It's not a cast expression if a binary operator (like +) immediately follows
  2137. if (couldBeExpr)
  2138. {
  2139. auto endNextNode = mVisitorPos.Get(endNodeIdx + 1);
  2140. if (endNextNode == NULL)
  2141. {
  2142. isCastExpr = false;
  2143. }
  2144. else if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(endNextNode))
  2145. {
  2146. BfToken nextToken = nextTokenNode->GetToken();
  2147. //TODO: Hm. What other tokens make it into a cast expr?
  2148. auto binaryOp = BfTokenToBinaryOp(nextToken);
  2149. // When we have a binary operator token following, it COULD either be a "(double)-val" or it COULD be a "(val2)-val"
  2150. // But we can't tell until we determine whether the thing inside the paren is a type name or a value name, so we
  2151. // have special code in BfExprEvaluator that can fix those cases at evaluation time
  2152. if (((binaryOp != BfBinaryOp_None) /*&& (nextToken != BfToken_Star) && (nextToken != BfToken_Ampersand)*/) || // Star could be dereference, not multiply
  2153. (nextToken == BfToken_RParen) ||
  2154. (nextToken == BfToken_LBracket) ||
  2155. (nextToken == BfToken_Dot) ||
  2156. (nextToken == BfToken_DotDot) ||
  2157. (nextToken == BfToken_Comma) ||
  2158. (nextToken == BfToken_Colon) ||
  2159. (nextToken == BfToken_Question) ||
  2160. (nextToken == BfToken_Semicolon) ||
  2161. (nextToken == BfToken_AssignEquals) ||
  2162. (nextToken == BfToken_Case))
  2163. isCastExpr = false;
  2164. }
  2165. }
  2166. }
  2167. if (isCastExpr)
  2168. {
  2169. BfCastExpression* bfCastExpr = NULL;
  2170. if (isTuple)
  2171. {
  2172. // Create typeRef including the parens (tuple type)
  2173. auto castTypeRef = CreateTypeRef(tokenNode);
  2174. if (castTypeRef != NULL)
  2175. {
  2176. bfCastExpr = mAlloc->Alloc<BfCastExpression>();
  2177. ReplaceNode(castTypeRef, bfCastExpr);
  2178. bfCastExpr->mTypeRef = castTypeRef;
  2179. }
  2180. }
  2181. else
  2182. {
  2183. auto castTypeRef = CreateTypeRefAfter(tokenNode);
  2184. if (castTypeRef != NULL)
  2185. {
  2186. bfCastExpr = mAlloc->Alloc<BfCastExpression>();
  2187. ReplaceNode(tokenNode, bfCastExpr);
  2188. bfCastExpr->mOpenParen = tokenNode;
  2189. MEMBER_SET_CHECKED(bfCastExpr, mTypeRef, castTypeRef);
  2190. tokenNode = ExpectTokenAfter(bfCastExpr, BfToken_RParen);
  2191. MEMBER_SET_CHECKED(bfCastExpr, mCloseParen, tokenNode);
  2192. }
  2193. }
  2194. if (bfCastExpr == NULL)
  2195. isCastExpr = false;
  2196. else
  2197. {
  2198. auto expression = CreateExpressionAfter(bfCastExpr);
  2199. if (expression == NULL)
  2200. return bfCastExpr;
  2201. MEMBER_SET(bfCastExpr, mExpression, expression);
  2202. unaryOpExpr = bfCastExpr;
  2203. }
  2204. }
  2205. if (!isCastExpr)
  2206. {
  2207. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  2208. {
  2209. // Empty tuple?
  2210. if (nextToken->GetToken() == BfToken_RParen)
  2211. {
  2212. auto tupleExpr = mAlloc->Alloc<BfTupleExpression>();
  2213. ReplaceNode(tokenNode, tupleExpr);
  2214. tupleExpr->mOpenParen = tokenNode;
  2215. MEMBER_SET(tupleExpr, mCloseParen, nextToken);
  2216. mVisitorPos.MoveNext();
  2217. return tupleExpr;
  2218. }
  2219. }
  2220. // static int sItrIdx = 0;
  2221. // sItrIdx++;
  2222. // int itrIdx = sItrIdx;
  2223. // if (itrIdx == 197)
  2224. // {
  2225. // NOP;
  2226. // }
  2227. // BfParenthesizedExpression or BfTupleExpression
  2228. SetAndRestoreValue<bool> prevInParenExpr(mInParenExpr, true);
  2229. auto innerExpr = CreateExpressionAfter(tokenNode, CreateExprFlags_AllowVariableDecl);
  2230. if (innerExpr == NULL)
  2231. return NULL;
  2232. BfTokenNode* closeParenToken;
  2233. if (innerExpr->IsA<BfIdentifierNode>())
  2234. closeParenToken = ExpectTokenAfter(innerExpr, BfToken_RParen, BfToken_Comma, BfToken_Colon);
  2235. else
  2236. closeParenToken = ExpectTokenAfter(innerExpr, BfToken_RParen, BfToken_Comma);
  2237. if ((closeParenToken == NULL) || (closeParenToken->GetToken() == BfToken_RParen))
  2238. {
  2239. auto parenExpr = mAlloc->Alloc<BfParenthesizedExpression>();
  2240. parenExpr->mExpression = innerExpr;
  2241. ReplaceNode(node, parenExpr);
  2242. parenExpr->mOpenParen = tokenNode;
  2243. MoveNode(innerExpr, parenExpr);
  2244. if (closeParenToken == NULL)
  2245. return parenExpr;
  2246. MEMBER_SET(parenExpr, mCloseParen, closeParenToken);
  2247. exprLeft = parenExpr;
  2248. if ((createExprFlags & CreateExprFlags_ExitOnParenExpr) != 0)
  2249. return exprLeft;
  2250. }
  2251. else
  2252. {
  2253. mVisitorPos.mReadPos--; // Backtrack to before token
  2254. exprLeft = CreateTupleExpression(tokenNode, innerExpr);
  2255. }
  2256. }
  2257. }
  2258. else if ((tokenNode->GetToken() == BfToken_Comptype) || (tokenNode->GetToken() == BfToken_Decltype))
  2259. {
  2260. auto typeRef = CreateTypeRef(tokenNode, CreateTypeRefFlags_EarlyExit);
  2261. if (typeRef != NULL)
  2262. {
  2263. exprLeft = CreateMemberReferenceExpression(typeRef);
  2264. }
  2265. }
  2266. else if (tokenNode->GetToken() == BfToken_NameOf)
  2267. {
  2268. BfNameOfExpression* nameOfExpr = mAlloc->Alloc<BfNameOfExpression>();
  2269. ReplaceNode(tokenNode, nameOfExpr);
  2270. nameOfExpr->mToken = tokenNode;
  2271. tokenNode = ExpectTokenAfter(nameOfExpr, BfToken_LParen);
  2272. MEMBER_SET_CHECKED(nameOfExpr, mOpenParen, tokenNode);
  2273. mVisitorPos.MoveNext();
  2274. int outEndNode = -1;
  2275. bool isTypeRef = IsTypeReference(mVisitorPos.GetCurrent(), BfToken_RParen, -1, &outEndNode);
  2276. mVisitorPos.mReadPos--;
  2277. if ((isTypeRef) && (outEndNode > 0))
  2278. {
  2279. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(outEndNode - 1)))
  2280. {
  2281. if ((tokenNode->mToken == BfToken_RChevron) || (tokenNode->mToken == BfToken_RDblChevron))
  2282. {
  2283. // Can ONLY be a type reference
  2284. auto typeRef = CreateTypeRefAfter(nameOfExpr);
  2285. MEMBER_SET_CHECKED(nameOfExpr, mTarget, typeRef);
  2286. }
  2287. }
  2288. }
  2289. if (nameOfExpr->mTarget == NULL)
  2290. {
  2291. auto expr = CreateExpressionAfter(nameOfExpr);
  2292. MEMBER_SET_CHECKED(nameOfExpr, mTarget, expr);
  2293. }
  2294. tokenNode = ExpectTokenAfter(nameOfExpr, BfToken_RParen);
  2295. MEMBER_SET_CHECKED(nameOfExpr, mCloseParen, tokenNode);
  2296. exprLeft = nameOfExpr;
  2297. }
  2298. if (exprLeft == NULL)
  2299. {
  2300. BfUnaryOp unaryOp = BfTokenToUnaryOp(tokenNode->GetToken());
  2301. if (unaryOp != BfUnaryOp_None)
  2302. {
  2303. unaryOpExpr = mAlloc->Alloc<BfUnaryOperatorExpression>();
  2304. unaryOpExpr->mOp = unaryOp;
  2305. unaryOpExpr->mOpToken = tokenNode;
  2306. ReplaceNode(tokenNode, unaryOpExpr);
  2307. CreateExprFlags innerFlags = (CreateExprFlags)(rhsCreateExprFlags | CreateExprFlags_EarlyExit);
  2308. if (unaryOp == BfUnaryOp_Cascade)
  2309. innerFlags = (CreateExprFlags)(innerFlags | (createExprFlags & CreateExprFlags_AllowVariableDecl));
  2310. if (unaryOp == BfUnaryOp_PartialRangeThrough) // This allows for just a naked '...'
  2311. innerFlags = (CreateExprFlags)(innerFlags | CreateExprFlags_AllowEmpty);
  2312. // Don't attempt binary or unary operations- they will always be lower precedence
  2313. unaryOpExpr->mExpression = CreateExpressionAfter(unaryOpExpr, innerFlags);
  2314. if (unaryOpExpr->mExpression == NULL)
  2315. return unaryOpExpr;
  2316. MoveNode(unaryOpExpr->mExpression, unaryOpExpr);
  2317. }
  2318. if (unaryOpExpr != NULL)
  2319. {
  2320. exprLeft = unaryOpExpr;
  2321. if (auto binaryOpExpr = BfNodeDynCast<BfBinaryOperatorExpression>(unaryOpExpr->mExpression))
  2322. {
  2323. exprLeft = binaryOpExpr;
  2324. ApplyToFirstExpression(unaryOpExpr, binaryOpExpr);
  2325. }
  2326. if (auto condExpr = BfNodeDynCast<BfConditionalExpression>(unaryOpExpr->mExpression))
  2327. {
  2328. if (exprLeft == unaryOpExpr)
  2329. exprLeft = condExpr;
  2330. ApplyToFirstExpression(unaryOpExpr, condExpr);
  2331. }
  2332. if (auto assignmentExpr = BfNodeDynCast<BfAssignmentExpression>(unaryOpExpr->mExpression))
  2333. {
  2334. // Apply unary operator (likely a dereference) to LHS
  2335. assignmentExpr->RemoveSelf();
  2336. ReplaceNode(unaryOpExpr, assignmentExpr);
  2337. if (assignmentExpr->mLeft != NULL)
  2338. {
  2339. MEMBER_SET(unaryOpExpr, mExpression, assignmentExpr->mLeft);
  2340. unaryOpExpr->SetSrcEnd(assignmentExpr->mLeft->GetSrcEnd());
  2341. MEMBER_SET(assignmentExpr, mLeft, unaryOpExpr);
  2342. if (exprLeft == unaryOpExpr)
  2343. exprLeft = assignmentExpr;
  2344. }
  2345. }
  2346. if (auto dynCastExpr = BfNodeDynCast<BfDynamicCastExpression>(unaryOpExpr->mExpression))
  2347. {
  2348. // Apply unary operator (likely a dereference) to Expr
  2349. dynCastExpr->RemoveSelf();
  2350. ReplaceNode(unaryOpExpr, dynCastExpr);
  2351. if (dynCastExpr->mTarget != NULL)
  2352. {
  2353. MEMBER_SET(unaryOpExpr, mExpression, dynCastExpr->mTarget);
  2354. unaryOpExpr->SetSrcEnd(dynCastExpr->mTarget->GetSrcEnd());
  2355. MEMBER_SET(dynCastExpr, mTarget, unaryOpExpr);
  2356. if (exprLeft == unaryOpExpr)
  2357. exprLeft = dynCastExpr;
  2358. }
  2359. }
  2360. if (auto caseExpr = BfNodeDynCast<BfCaseExpression>(unaryOpExpr->mExpression))
  2361. {
  2362. // Apply unary operator (likely a dereference) to Expr
  2363. caseExpr->RemoveSelf();
  2364. ReplaceNode(unaryOpExpr, caseExpr);
  2365. if (caseExpr->mValueExpression != NULL)
  2366. {
  2367. MEMBER_SET(unaryOpExpr, mExpression, caseExpr->mValueExpression);
  2368. unaryOpExpr->SetSrcEnd(caseExpr->mValueExpression->GetSrcEnd());
  2369. MEMBER_SET(caseExpr, mValueExpression, unaryOpExpr);
  2370. if (exprLeft == unaryOpExpr)
  2371. exprLeft = caseExpr;
  2372. }
  2373. }
  2374. }
  2375. }
  2376. }
  2377. }
  2378. if (exprLeft == NULL)
  2379. {
  2380. if ((createExprFlags & CreateExprFlags_AllowEmpty) == 0)
  2381. Fail("Expected expression", node);
  2382. return NULL;
  2383. }
  2384. while (true)
  2385. {
  2386. auto nextNode = mVisitorPos.GetNext();
  2387. if (nextNode == NULL)
  2388. break;
  2389. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  2390. {
  2391. BfToken token = tokenNode->GetToken();
  2392. if (((createExprFlags & CreateExprFlags_BreakOnRChevron) != 0) &&
  2393. ((token == BfToken_RChevron) || (token == BfToken_RDblChevron)))
  2394. return exprLeft;
  2395. BfUnaryOp postUnaryOp = BfUnaryOp_None;
  2396. if (token == BfToken_DblPlus)
  2397. postUnaryOp = BfUnaryOp_PostIncrement;
  2398. if (token == BfToken_DblMinus)
  2399. postUnaryOp = BfUnaryOp_PostDecrement;
  2400. if (token == BfToken_DotDotDot)
  2401. {
  2402. //TODO: Detect if this is a BfUnaryOp_PartialRangeFrom
  2403. }
  2404. if (postUnaryOp != BfUnaryOp_None)
  2405. {
  2406. auto unaryOpExpr = mAlloc->Alloc<BfUnaryOperatorExpression>();
  2407. ReplaceNode(exprLeft, unaryOpExpr);
  2408. unaryOpExpr->mOp = postUnaryOp;
  2409. MEMBER_SET(unaryOpExpr, mOpToken, tokenNode);
  2410. MEMBER_SET(unaryOpExpr, mExpression, exprLeft);
  2411. exprLeft = unaryOpExpr;
  2412. mVisitorPos.MoveNext();
  2413. continue;
  2414. }
  2415. if (token == BfToken_As)
  2416. {
  2417. auto dynCastExpr = mAlloc->Alloc<BfDynamicCastExpression>();
  2418. ReplaceNode(exprLeft, dynCastExpr);
  2419. dynCastExpr->mTarget = exprLeft;
  2420. MEMBER_SET(dynCastExpr, mAsToken, tokenNode);
  2421. mVisitorPos.MoveNext();
  2422. auto typeRef = CreateTypeRefAfter(dynCastExpr);
  2423. if (typeRef == NULL)
  2424. return dynCastExpr;
  2425. MEMBER_SET(dynCastExpr, mTypeRef, typeRef);
  2426. return dynCastExpr;
  2427. }
  2428. if (token == BfToken_Is)
  2429. {
  2430. auto checkTypeExpr = mAlloc->Alloc<BfCheckTypeExpression>();
  2431. ReplaceNode(exprLeft, checkTypeExpr);
  2432. checkTypeExpr->mTarget = exprLeft;
  2433. MEMBER_SET(checkTypeExpr, mIsToken, tokenNode);
  2434. mVisitorPos.MoveNext();
  2435. auto typeRef = CreateTypeRefAfter(checkTypeExpr);
  2436. if (typeRef == NULL)
  2437. return checkTypeExpr;
  2438. MEMBER_SET(checkTypeExpr, mTypeRef, typeRef);
  2439. exprLeft = checkTypeExpr;
  2440. continue;
  2441. }
  2442. if (token == BfToken_Question)
  2443. {
  2444. if ((createExprFlags & CreateExprFlags_EarlyExit) != 0)
  2445. return exprLeft;
  2446. auto conditionExpr = mAlloc->Alloc<BfConditionalExpression>();
  2447. ReplaceNode(exprLeft, conditionExpr);
  2448. conditionExpr->mConditionExpression = exprLeft;
  2449. MEMBER_SET(conditionExpr, mQuestionToken, tokenNode);
  2450. mVisitorPos.MoveNext();
  2451. auto expr = CreateExpressionAfter(conditionExpr);
  2452. if (expr != NULL)
  2453. {
  2454. MEMBER_SET(conditionExpr, mTrueExpression, expr);
  2455. tokenNode = ExpectTokenAfter(conditionExpr, BfToken_Colon);
  2456. if (tokenNode != NULL)
  2457. {
  2458. MEMBER_SET(conditionExpr, mColonToken, tokenNode);
  2459. expr = CreateExpressionAfter(conditionExpr);
  2460. if (expr != NULL)
  2461. {
  2462. MEMBER_SET(conditionExpr, mFalseExpression, expr);
  2463. }
  2464. }
  2465. }
  2466. exprLeft = conditionExpr;
  2467. continue;
  2468. }
  2469. if (((token == BfToken_Case) || (token == BfToken_Not))
  2470. && ((createExprFlags & CreateStmtFlags_NoCaseExpr) == 0))
  2471. {
  2472. if ((createExprFlags & CreateExprFlags_EarlyExit) != 0)
  2473. return exprLeft;
  2474. // If we have a ".Member case <XXX>" expression, that is an invalid construct. We bail out here
  2475. // because it allows the ".Member" to autocomplete because we will treat it as a full expression instead
  2476. // of making it the target of an illegal expression
  2477. if (auto memberRefLeft = BfNodeDynCast<BfMemberReferenceExpression>(exprLeft))
  2478. {
  2479. if (memberRefLeft->mTarget == NULL)
  2480. return exprLeft;
  2481. }
  2482. auto caseExpr = mAlloc->Alloc<BfCaseExpression>();
  2483. ReplaceNode(exprLeft, caseExpr);
  2484. caseExpr->mValueExpression = exprLeft;
  2485. if (token == BfToken_Not)
  2486. {
  2487. MEMBER_SET(caseExpr, mNotToken, tokenNode);
  2488. mVisitorPos.MoveNext();
  2489. tokenNode = ExpectTokenAfter(caseExpr, BfToken_Case);
  2490. MEMBER_SET(caseExpr, mCaseToken, tokenNode);
  2491. }
  2492. else
  2493. {
  2494. MEMBER_SET(caseExpr, mCaseToken, tokenNode);
  2495. mVisitorPos.MoveNext();
  2496. }
  2497. exprLeft = caseExpr;
  2498. if (auto bindTokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  2499. {
  2500. BfToken bindToken = bindTokenNode->GetToken();
  2501. if ((bindToken == BfToken_Var) || (bindToken == BfToken_Let))
  2502. {
  2503. auto expr = CreateEnumCaseBindExpression(bindTokenNode);
  2504. if (expr == NULL)
  2505. continue;
  2506. MEMBER_SET(caseExpr, mCaseExpression, expr);
  2507. }
  2508. }
  2509. if (caseExpr->mCaseExpression == NULL)
  2510. {
  2511. auto expr = CreateExpressionAfter(caseExpr, (CreateExprFlags)(CreateExprFlags_NoAssignment | CreateExprFlags_PermissiveVariableDecl | CreateExprFlags_EarlyExit));
  2512. if (expr == NULL)
  2513. continue;
  2514. MEMBER_SET(caseExpr, mCaseExpression, expr);
  2515. }
  2516. continue;
  2517. }
  2518. if (token == BfToken_LChevron)
  2519. {
  2520. bool hadEndingToken = false;
  2521. // If this is a complex member reference (IE: GType<int>.sVal) then condense in into a BfMemberReference.
  2522. // We need to be conservative about typeRef names, so GType<int>.A<T>.B.C.D, we can only assume "GType<int>.A<T>" is a typeref
  2523. // and the ".B.C.D" part is exposed as a MemberReference that may or may not include inner types
  2524. int outNodeIdx = -1;
  2525. bool isGenericType = false;
  2526. bool isTypeRef = ((IsTypeReference(exprLeft, BfToken_None, -1, &outNodeIdx, NULL, &isGenericType)) &&
  2527. (outNodeIdx != -1));
  2528. BfAstNode* outNode = mVisitorPos.Get(outNodeIdx);
  2529. if ((!isTypeRef) && (outNodeIdx != -1))
  2530. {
  2531. if ((isGenericType) && (outNode == NULL))
  2532. {
  2533. for (int checkOutNodeIdx = outNodeIdx + 1; true; checkOutNodeIdx++)
  2534. {
  2535. BfAstNode* checkNode = mVisitorPos.Get(checkOutNodeIdx);
  2536. if (checkNode == NULL)
  2537. break;
  2538. outNode = checkNode;
  2539. }
  2540. isTypeRef = true;
  2541. }
  2542. else if (auto outTokenNode = BfNodeDynCast<BfTokenNode>(outNode))
  2543. {
  2544. BfToken outToken = outTokenNode->GetToken();
  2545. if ((outToken == BfToken_Semicolon) || (outToken == BfToken_RParen) || (outToken == BfToken_Comma) ||
  2546. (outToken == BfToken_Let) || (outToken == BfToken_Var) || (outToken == BfToken_Const))
  2547. {
  2548. auto prevNode = mVisitorPos.Get(outNodeIdx - 1);
  2549. if (auto prevToken = BfNodeDynCast<BfTokenNode>(prevNode))
  2550. {
  2551. // This handles such as "dlg = stack => obj.method<int>;"
  2552. if ((prevToken->GetToken() == BfToken_RChevron) || (prevToken->GetToken() == BfToken_RDblChevron))
  2553. hadEndingToken = true;
  2554. }
  2555. }
  2556. //TODO: We had BfToken_Semicolon here, but it broke legitimate cases of "a.b.c < d.e.f;" expressions
  2557. //if ((outToken == BfToken_Semicolon) || (isGenericType) || (outToken == BfToken_LParen) || (outToken == BfToken_Var) || (outToken == BfToken_Const))
  2558. {
  2559. // Was just 'true'
  2560. int newOutNodeIdx = -1;
  2561. //bool newIsTypeRef = IsTypeReference(exprLeft, outToken, -1, &newOutNodeIdx, NULL, &isGenericType);
  2562. bool newIsTypeRef = IsTypeReference(exprLeft, BfToken_None, outNodeIdx, &newOutNodeIdx, NULL, &isGenericType);
  2563. BfAstNode* newOutNode = mVisitorPos.Get(newOutNodeIdx);
  2564. if ((newIsTypeRef) && (newOutNode == outNode) && (isGenericType))
  2565. isTypeRef = true;
  2566. }
  2567. }
  2568. }
  2569. if (isTypeRef)
  2570. {
  2571. auto startIdentifier = exprLeft;
  2572. int curNodeEndIdx = outNodeIdx - 1;
  2573. BfAstNode* curNodeEnd = mVisitorPos.Get(curNodeEndIdx);
  2574. bool isDotName = false;
  2575. if (auto qualifiedIdentifierNode = BfNodeDynCast<BfMemberReferenceExpression>(startIdentifier))
  2576. {
  2577. // Don't try to convert dot-name to a qualified type
  2578. isDotName = qualifiedIdentifierNode->mTarget == NULL;
  2579. }
  2580. int chevronDepth = 0;
  2581. bool didSplit = false;
  2582. for (int checkIdx = curNodeEndIdx; checkIdx >= mVisitorPos.mReadPos; checkIdx--)
  2583. {
  2584. if (isDotName)
  2585. break;
  2586. auto checkNode = mVisitorPos.Get(checkIdx);
  2587. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(checkNode))
  2588. {
  2589. BfToken token = tokenNode->GetToken();
  2590. if (((token == BfToken_RChevron) || (token == BfToken_RDblChevron)) && (chevronDepth == 0))
  2591. {
  2592. auto nextCheckNode = mVisitorPos.Get(checkIdx + 1);
  2593. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(nextCheckNode))
  2594. {
  2595. if (nextTokenNode->GetToken() == BfToken_Dot)
  2596. {
  2597. TryIdentifierConvert(checkIdx + 2);
  2598. auto nextNextCheckNode = mVisitorPos.Get(checkIdx + 2);
  2599. if (auto identifierNode = BfNodeDynCast<BfIdentifierNode>(nextNextCheckNode))
  2600. {
  2601. // Remove dot temporarily so we create a typedef up to that dot
  2602. nextTokenNode->SetToken(BfToken_None);
  2603. auto typeRef = CreateTypeRef(startIdentifier);
  2604. if (typeRef == NULL)
  2605. return NULL;
  2606. nextTokenNode->SetToken(BfToken_Dot);
  2607. auto memberRefExpr = mAlloc->Alloc<BfMemberReferenceExpression>();
  2608. ReplaceNode(identifierNode, memberRefExpr);
  2609. MEMBER_SET(memberRefExpr, mDotToken, nextTokenNode);
  2610. MEMBER_SET(memberRefExpr, mTarget, typeRef);
  2611. MEMBER_SET(memberRefExpr, mMemberName, identifierNode);
  2612. memberRefExpr->mTriviaStart = typeRef->mTriviaStart;
  2613. exprLeft = memberRefExpr;
  2614. mVisitorPos.mReadPos = checkIdx + 2;
  2615. didSplit = true;
  2616. break;
  2617. }
  2618. else if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNextCheckNode))
  2619. {
  2620. if (tokenNode->GetToken() == BfToken_LBracket)
  2621. {
  2622. // Remove dot temporarily so we create a typedef up to that dot
  2623. nextTokenNode->SetToken(BfToken_None);
  2624. auto typeRef = CreateTypeRef(startIdentifier);
  2625. if (typeRef == NULL)
  2626. return NULL;
  2627. nextTokenNode->SetToken(BfToken_Dot);
  2628. mVisitorPos.mReadPos = checkIdx + 0;
  2629. exprLeft = CreateMemberReferenceExpression(typeRef);
  2630. didSplit = true;
  2631. }
  2632. }
  2633. }
  2634. else if (nextTokenNode->GetToken() == BfToken_LBracket)
  2635. {
  2636. int endNodeIdx = -1;
  2637. if (IsTypeReference(startIdentifier, BfToken_LParen, -1, &endNodeIdx))
  2638. {
  2639. if (endNodeIdx > checkIdx + 1)
  2640. {
  2641. auto typeRef = CreateTypeRef(startIdentifier);
  2642. auto arrayType = BfNodeDynCast<BfArrayTypeRef>(typeRef);
  2643. if (arrayType == NULL)
  2644. return NULL;
  2645. mVisitorPos.mReadPos = checkIdx + 0;
  2646. auto arrayCreateExpr = mAlloc->Alloc<BfSizedArrayCreateExpression>();
  2647. ReplaceNode(typeRef, arrayCreateExpr);
  2648. arrayCreateExpr->mTypeRef = arrayType;
  2649. mVisitorPos.mReadPos = endNodeIdx;
  2650. auto initializerExpr = CreateCollectionInitializerExpression(BfNodeDynCast<BfTokenNode>(mVisitorPos.GetCurrent()));
  2651. MEMBER_SET(arrayCreateExpr, mInitializer, initializerExpr);
  2652. exprLeft = arrayCreateExpr;
  2653. return arrayCreateExpr;
  2654. }
  2655. }
  2656. }
  2657. }
  2658. }
  2659. if (token == BfToken_RChevron)
  2660. chevronDepth++;
  2661. else if (token == BfToken_RDblChevron)
  2662. chevronDepth += 2;
  2663. else if (token == BfToken_LChevron)
  2664. chevronDepth--;
  2665. else if (token == BfToken_LDblChevron)
  2666. chevronDepth -= 2;
  2667. }
  2668. }
  2669. if (didSplit)
  2670. continue;
  2671. }
  2672. // Could be a struct generic initializer, or a generic method invocation
  2673. if (auto outToken = BfNodeDynCast<BfTokenNode>(outNode))
  2674. {
  2675. int endNodeIdx = -1;
  2676. if (((outToken->mToken == BfToken_LParen) && (IsTypeReference(exprLeft, BfToken_LParen, -1, &endNodeIdx))) ||
  2677. (outToken->mToken == BfToken_DotDotDot))
  2678. {
  2679. exprLeft = CreateInvocationExpression(exprLeft);
  2680. if (exprLeft == NULL)
  2681. return NULL;
  2682. continue;
  2683. }
  2684. }
  2685. if (hadEndingToken)
  2686. return exprLeft;
  2687. }
  2688. if (token == BfToken_Star)
  2689. {
  2690. auto nextNode = mVisitorPos.GetNext();
  2691. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  2692. {
  2693. if ((nextToken->mToken == BfToken_Star) || (nextToken->mToken == BfToken_LBracket))
  2694. {
  2695. //if (IsTypeReference(tokenNode, BfToken_LBracket))
  2696. {
  2697. /*auto typeRef = CreateTypeRef(tokenNode, true);
  2698. exprLeft = CreateObjectCreateExpression(typeRef);
  2699. return exprLeft;*/
  2700. }
  2701. }
  2702. }
  2703. }
  2704. BfBinaryOp binOp = BfTokenToBinaryOp(tokenNode->GetToken());
  2705. if (binOp != BfBinaryOp_None)
  2706. {
  2707. if ((createExprFlags & CreateExprFlags_EarlyExit) != 0)
  2708. return exprLeft;
  2709. mVisitorPos.MoveNext();
  2710. // We only need to check binary operator precedence at the "top level" binary operator
  2711. rhsCreateExprFlags = (CreateExprFlags)(rhsCreateExprFlags | CreateExprFlags_NoCheckBinOpPrecedence);
  2712. if (tokenNode->mToken == BfToken_DotDotDot)
  2713. rhsCreateExprFlags = (CreateExprFlags)(rhsCreateExprFlags | CreateExprFlags_AllowEmpty);
  2714. BfExpression* exprRight = CreateExpressionAfter(tokenNode, rhsCreateExprFlags);
  2715. if (exprRight == NULL)
  2716. {
  2717. if (tokenNode->mToken == BfToken_DotDotDot)
  2718. {
  2719. auto unaryOpExpression = mAlloc->Alloc<BfUnaryOperatorExpression>();
  2720. ReplaceNode(exprLeft, unaryOpExpression);
  2721. unaryOpExpression->mExpression = exprLeft;
  2722. unaryOpExpression->mOp = BfUnaryOp_PartialRangeFrom;
  2723. MEMBER_SET(unaryOpExpression, mOpToken, tokenNode);
  2724. return unaryOpExpression;
  2725. }
  2726. }
  2727. auto binOpExpression = mAlloc->Alloc<BfBinaryOperatorExpression>();
  2728. ReplaceNode(exprLeft, binOpExpression);
  2729. binOpExpression->mLeft = exprLeft;
  2730. binOpExpression->mOp = binOp;
  2731. MEMBER_SET(binOpExpression, mOpToken, tokenNode);
  2732. if (exprRight == NULL)
  2733. return binOpExpression;
  2734. MEMBER_SET(binOpExpression, mRight, exprRight);
  2735. if ((createExprFlags & CreateExprFlags_NoCheckBinOpPrecedence) != 0)
  2736. return binOpExpression;
  2737. return CheckBinaryOperatorPrecedence(binOpExpression);
  2738. }
  2739. auto assignmentOp = BfTokenToAssignmentOp(tokenNode->GetToken());
  2740. if (assignmentOp != BfAssignmentOp_None)
  2741. {
  2742. if ((createExprFlags & CreateExprFlags_EarlyExit) != 0)
  2743. return exprLeft;
  2744. if ((createExprFlags & CreateExprFlags_NoAssignment) != 0)
  2745. return exprLeft;
  2746. auto assignmentExpression = mAlloc->Alloc<BfAssignmentExpression>();
  2747. ReplaceNode(exprLeft, assignmentExpression);
  2748. mVisitorPos.MoveNext();
  2749. assignmentExpression->mOp = assignmentOp;
  2750. assignmentExpression->mLeft = exprLeft;
  2751. assignmentExpression->mOpToken = tokenNode;
  2752. MoveNode(assignmentExpression->mOpToken, assignmentExpression);
  2753. bool continueCascade = false;
  2754. if (auto memberExpr = BfNodeDynCast<BfMemberReferenceExpression>(exprLeft))
  2755. {
  2756. if ((memberExpr->mDotToken != NULL) && (memberExpr->mDotToken->GetToken() == BfToken_DotDot))
  2757. continueCascade = true;
  2758. }
  2759. CreateExprFlags flags = rhsCreateExprFlags;
  2760. if (continueCascade)
  2761. flags = (CreateExprFlags)(rhsCreateExprFlags | CreateExprFlags_BreakOnCascade);
  2762. auto exprRight = CreateExpressionAfter(assignmentExpression, flags);
  2763. if (exprRight == NULL)
  2764. {
  2765. FailAfter("Invalid expression", assignmentExpression);
  2766. return assignmentExpression;
  2767. }
  2768. assignmentExpression->mRight = exprRight;
  2769. MoveNode(assignmentExpression->mRight, assignmentExpression);
  2770. if (continueCascade)
  2771. {
  2772. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  2773. {
  2774. if (nextToken->GetToken() == BfToken_DotDot)
  2775. {
  2776. exprLeft = assignmentExpression;
  2777. continue;
  2778. }
  2779. }
  2780. }
  2781. return assignmentExpression;
  2782. }
  2783. BF_ASSERT(tokenNode->GetToken() == token);
  2784. if (token == BfToken_Dot)
  2785. {
  2786. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2)))
  2787. {
  2788. if (nextToken->mToken == BfToken_This)
  2789. {
  2790. int outNodeIdx = -1;
  2791. bool isGenericType;
  2792. bool isTypeRef = ((IsTypeReference(exprLeft, BfToken_This, -1, &outNodeIdx, NULL, &isGenericType)) &&
  2793. (outNodeIdx != -1));
  2794. if (isTypeRef)
  2795. {
  2796. auto invocationExpr = CreateObjectCreateExpression(NULL, exprLeft);
  2797. if (invocationExpr == NULL)
  2798. return exprLeft;
  2799. exprLeft = invocationExpr;
  2800. continue;
  2801. }
  2802. }
  2803. }
  2804. }
  2805. // Not a binary op, it's a 'close'
  2806. if (token == BfToken_Bang)
  2807. {
  2808. if ((createExprFlags & CreateExprFlags_ExitOnBang) != 0)
  2809. return exprLeft;
  2810. exprLeft = CreateInvocationExpression(exprLeft);
  2811. }
  2812. else if (token == BfToken_LParen)
  2813. {
  2814. exprLeft = CreateInvocationExpression(exprLeft, (CreateExprFlags)(createExprFlags & ~(CreateExprFlags_NoCast)));
  2815. if (auto initExpr = TryCreateInitializerExpression(exprLeft))
  2816. exprLeft = initExpr;
  2817. }
  2818. else if ((token == BfToken_LBracket) || (token == BfToken_QuestionLBracket))
  2819. {
  2820. exprLeft = CreateIndexerExpression(exprLeft);
  2821. }
  2822. else if ((token == BfToken_Dot) || (token == BfToken_DotDot) || (token == BfToken_QuestionDot) || (token == BfToken_Arrow))
  2823. {
  2824. if ((token == BfToken_DotDot) && ((createExprFlags & CreateExprFlags_BreakOnCascade) != 0))
  2825. return exprLeft;
  2826. if (auto memberExpr = BfNodeDynCastExact<BfMemberReferenceExpression>(exprLeft))
  2827. {
  2828. if (memberExpr->mTarget == NULL)
  2829. {
  2830. // A dot syntax like ".A.B" is never valid - to help with autocomplete we stop the expr parsing here
  2831. Fail("Unexpected '.' token", tokenNode);
  2832. return exprLeft;
  2833. }
  2834. }
  2835. exprLeft = CreateMemberReferenceExpression(exprLeft);
  2836. }
  2837. else
  2838. {
  2839. return exprLeft;
  2840. }
  2841. if (exprLeft == NULL)
  2842. return NULL;
  2843. }
  2844. else
  2845. break;
  2846. }
  2847. return exprLeft;
  2848. }
  2849. BfExpression* BfReducer::CreateExpressionAfter(BfAstNode* node, CreateExprFlags createExprFlags)
  2850. {
  2851. if (!AssertCurrentNode(node))
  2852. return NULL;
  2853. auto nextNode = mVisitorPos.GetNext();
  2854. bool isEmpty = false;
  2855. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  2856. {
  2857. if (tokenNode->GetToken() == BfToken_RParen)
  2858. isEmpty = true;
  2859. }
  2860. if ((nextNode == NULL) || (isEmpty))
  2861. {
  2862. FailAfter("Expression expected", node);
  2863. return NULL;
  2864. }
  2865. int startReadPos = mVisitorPos.mReadPos;
  2866. mVisitorPos.MoveNext();
  2867. auto result = CreateExpression(nextNode, createExprFlags);
  2868. if (result == NULL)
  2869. {
  2870. // Nope, didn't handle it
  2871. mVisitorPos.mReadPos = startReadPos;
  2872. }
  2873. return result;
  2874. }
  2875. BfForEachStatement* BfReducer::CreateForEachStatement(BfAstNode* node, bool hasTypeDecl)
  2876. {
  2877. auto forToken = BfNodeDynCast<BfTokenNode>(node);
  2878. auto parenToken = ExpectTokenAfter(forToken, BfToken_LParen);
  2879. if (parenToken == NULL)
  2880. return NULL;
  2881. auto forEachStatement = mAlloc->Alloc<BfForEachStatement>();
  2882. ReplaceNode(forToken, forEachStatement);
  2883. MEMBER_SET(forEachStatement, mForToken, forToken);
  2884. MEMBER_SET(forEachStatement, mOpenParen, parenToken);
  2885. if (hasTypeDecl)
  2886. {
  2887. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  2888. {
  2889. if (tokenNode->mToken == BfToken_ReadOnly)
  2890. {
  2891. MEMBER_SET_CHECKED(forEachStatement, mReadOnlyToken, tokenNode);
  2892. mVisitorPos.MoveNext();
  2893. }
  2894. }
  2895. auto typeRef = CreateTypeRefAfter(forEachStatement);
  2896. if (typeRef == NULL)
  2897. return forEachStatement;
  2898. MEMBER_SET_CHECKED(forEachStatement, mVariableTypeRef, typeRef);
  2899. }
  2900. if (auto nextNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  2901. {
  2902. if ((nextNode->mToken == BfToken_LParen) || (nextNode->mToken == BfToken_LessEquals))
  2903. {
  2904. mVisitorPos.MoveNext();
  2905. auto tupleNode = CreateTupleExpression(nextNode);
  2906. MEMBER_SET_CHECKED(forEachStatement, mVariableName, tupleNode);
  2907. }
  2908. }
  2909. if (forEachStatement->mVariableName == NULL)
  2910. {
  2911. auto name = ExpectIdentifierAfter(forEachStatement, "variable name");
  2912. MEMBER_SET_CHECKED(forEachStatement, mVariableName, name);
  2913. }
  2914. auto inToken = ExpectTokenAfter(forEachStatement, BfToken_In, BfToken_LChevron, BfToken_LessEquals);
  2915. MEMBER_SET_CHECKED(forEachStatement, mInToken, inToken);
  2916. auto expr = CreateExpressionAfter(forEachStatement);
  2917. MEMBER_SET_CHECKED(forEachStatement, mCollectionExpression, expr);
  2918. parenToken = ExpectTokenAfter(forEachStatement, BfToken_RParen);
  2919. MEMBER_SET_CHECKED(forEachStatement, mCloseParen, parenToken);
  2920. auto stmt = CreateStatementAfter(forEachStatement, CreateStmtFlags_FindTrailingSemicolon);
  2921. if (stmt == NULL)
  2922. return forEachStatement;
  2923. MEMBER_SET(forEachStatement, mEmbeddedStatement, stmt);
  2924. return forEachStatement;
  2925. }
  2926. BfStatement* BfReducer::CreateForStatement(BfAstNode* node)
  2927. {
  2928. int startReadIdx = mVisitorPos.mReadPos;
  2929. auto forToken = BfNodeDynCast<BfTokenNode>(node);
  2930. auto parenToken = ExpectTokenAfter(forToken, BfToken_LParen);
  2931. if (parenToken == NULL)
  2932. return NULL;
  2933. int outNodeIdx = -1;
  2934. auto nextNode = mVisitorPos.GetNext();
  2935. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  2936. {
  2937. // Handle 'for (let (key, value) in dict)'
  2938. if ((tokenNode->mToken == BfToken_Let) || (tokenNode->mToken == BfToken_Var))
  2939. {
  2940. if (auto afterLet = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2)))
  2941. {
  2942. if (afterLet->mToken == BfToken_LParen)
  2943. {
  2944. bool isTupleIn = true;
  2945. int parenDepth = 1;
  2946. for (int readPos = mVisitorPos.mReadPos + 3; true; readPos++)
  2947. {
  2948. auto checkNode = mVisitorPos.Get(readPos);
  2949. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(checkNode))
  2950. {
  2951. if (tokenNode->mToken == BfToken_RParen)
  2952. {
  2953. if (parenDepth != 1)
  2954. {
  2955. isTupleIn = false;
  2956. break;
  2957. }
  2958. parenDepth--;
  2959. }
  2960. else if (tokenNode->mToken == BfToken_In)
  2961. {
  2962. if (parenDepth != 0)
  2963. isTupleIn = false;
  2964. break;
  2965. }
  2966. else if (tokenNode->mToken == BfToken_Comma)
  2967. {
  2968. //
  2969. }
  2970. else
  2971. {
  2972. isTupleIn = false;
  2973. break;
  2974. }
  2975. }
  2976. else if (auto identifierNode = BfNodeDynCast<BfIdentifierNode>(checkNode))
  2977. {
  2978. //
  2979. }
  2980. else
  2981. {
  2982. isTupleIn = false;
  2983. break;
  2984. }
  2985. }
  2986. if (isTupleIn)
  2987. {
  2988. mVisitorPos.mReadPos = startReadIdx;
  2989. return CreateForEachStatement(node, true);
  2990. }
  2991. }
  2992. }
  2993. }
  2994. }
  2995. bool isTypeRef = false;
  2996. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  2997. {
  2998. if (nextNode->mToken == BfToken_ReadOnly)
  2999. {
  3000. mVisitorPos.mReadPos += 2;
  3001. isTypeRef = IsTypeReference(mVisitorPos.Get(mVisitorPos.mReadPos), BfToken_None, -1, &outNodeIdx);
  3002. mVisitorPos.mReadPos -= 2;
  3003. }
  3004. }
  3005. if (!isTypeRef)
  3006. {
  3007. mVisitorPos.mReadPos++;
  3008. isTypeRef = IsTypeReference(nextNode, BfToken_None, -1, &outNodeIdx);
  3009. mVisitorPos.mReadPos--;
  3010. }
  3011. BfAstNode* outNode = mVisitorPos.Get(outNodeIdx);
  3012. if (isTypeRef)
  3013. {
  3014. auto nextNode = mVisitorPos.Get(outNodeIdx + 1);
  3015. if ((outNode != NULL) && (nextNode != NULL))
  3016. {
  3017. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  3018. if (tokenNode != NULL)
  3019. {
  3020. int token = tokenNode->GetToken();
  3021. if ((token == BfToken_In) || (token == BfToken_LChevron) || (token == BfToken_LessEquals))
  3022. {
  3023. mVisitorPos.mReadPos = startReadIdx;
  3024. return CreateForEachStatement(node, true);
  3025. }
  3026. }
  3027. }
  3028. }
  3029. else
  3030. {
  3031. int checkNodeIdx = (outNodeIdx != -1) ? outNodeIdx : mVisitorPos.mReadPos + 1;
  3032. auto checkNode = mVisitorPos.Get(checkNodeIdx);
  3033. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(checkNode))
  3034. {
  3035. BfToken token = tokenNode->GetToken();
  3036. // Is this an 'anonymous' foreach?
  3037. if ((token != BfToken_Semicolon) && (token != BfToken_LChevron) &&
  3038. (token != BfToken_In) && (token != BfToken_AssignEquals))
  3039. {
  3040. mVisitorPos.mReadPos = startReadIdx;
  3041. auto forToken = BfNodeDynCast<BfTokenNode>(node);
  3042. auto parenToken = ExpectTokenAfter(forToken, BfToken_LParen);
  3043. if (parenToken == NULL)
  3044. return NULL;
  3045. auto forEachStatement = mAlloc->Alloc<BfForEachStatement>();
  3046. ReplaceNode(forToken, forEachStatement);
  3047. MEMBER_SET(forEachStatement, mForToken, forToken);
  3048. MEMBER_SET(forEachStatement, mOpenParen, parenToken);
  3049. auto expr = CreateExpressionAfter(forEachStatement);
  3050. MEMBER_SET_CHECKED(forEachStatement, mCollectionExpression, expr);
  3051. parenToken = ExpectTokenAfter(forEachStatement, BfToken_RParen);
  3052. MEMBER_SET_CHECKED(forEachStatement, mCloseParen, parenToken);
  3053. auto stmt = CreateStatementAfter(forEachStatement, CreateStmtFlags_FindTrailingSemicolon);
  3054. if (stmt == NULL)
  3055. return forEachStatement;
  3056. MEMBER_SET(forEachStatement, mEmbeddedStatement, stmt);
  3057. return forEachStatement;
  3058. }
  3059. }
  3060. }
  3061. auto nextNextNode = mVisitorPos.Get(mVisitorPos.mReadPos + 2);
  3062. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNextNode))
  3063. {
  3064. if ((tokenNode != NULL) && ((tokenNode->GetToken() == BfToken_LChevron) || (tokenNode->GetToken() == BfToken_In)))
  3065. {
  3066. Fail("Ranged for statement must declare new value variable, consider adding a type name, 'var', or 'let'", tokenNode);
  3067. mVisitorPos.mReadPos = startReadIdx;
  3068. return CreateForEachStatement(node, false);
  3069. }
  3070. }
  3071. BfAstNode* stmt;
  3072. auto forStatement = mAlloc->Alloc<BfForStatement>();
  3073. BfDeferredAstSizedArray<BfAstNode*> initializers(forStatement->mInitializers, mAlloc);
  3074. BfDeferredAstSizedArray<BfTokenNode*> initializerCommas(forStatement->mInitializerCommas, mAlloc);
  3075. BfDeferredAstSizedArray<BfAstNode*> iterators(forStatement->mIterators, mAlloc);
  3076. BfDeferredAstSizedArray<BfTokenNode*> iteratorCommas(forStatement->mIteratorCommas, mAlloc);
  3077. ReplaceNode(forToken, forStatement);
  3078. MEMBER_SET(forStatement, mForToken, forToken);
  3079. MEMBER_SET(forStatement, mOpenParen, parenToken);
  3080. // Initializers
  3081. for (int listIdx = 0; true; listIdx++)
  3082. {
  3083. auto nextNode = mVisitorPos.GetNext();
  3084. if ((listIdx > 0) || (!IsSemicolon(nextNode)))
  3085. {
  3086. auto stmt = CreateStatementAfter(forStatement);
  3087. if (stmt == NULL)
  3088. return forStatement;
  3089. if (!initializers.IsEmpty())
  3090. {
  3091. // Try to convert 'int i = 0, j = 0` into two variable declarations instead of a var decl and an assignment
  3092. if (auto prevExprStmt = BfNodeDynCast<BfExpressionStatement>(initializers.back()))
  3093. {
  3094. if (auto prevVarDecl = BfNodeDynCast<BfVariableDeclaration>(prevExprStmt->mExpression))
  3095. {
  3096. if (auto exprStmt = BfNodeDynCast<BfExpressionStatement>(stmt))
  3097. {
  3098. if (auto assignExpr = BfNodeDynCast<BfAssignmentExpression>(exprStmt->mExpression))
  3099. {
  3100. if (assignExpr->mOp != BfAssignmentOp_Assign)
  3101. continue;
  3102. if (auto identifierNode = BfNodeDynCast<BfIdentifierNode>(assignExpr->mLeft))
  3103. {
  3104. auto varDecl = mAlloc->Alloc<BfVariableDeclaration>();
  3105. ReplaceNode(assignExpr, varDecl);
  3106. varDecl->mTypeRef = prevVarDecl->mTypeRef;
  3107. varDecl->mNameNode = identifierNode;
  3108. varDecl->mEqualsNode = assignExpr->mOpToken;
  3109. varDecl->mInitializer = assignExpr->mRight;
  3110. varDecl->mModSpecifier = prevVarDecl->mModSpecifier;
  3111. exprStmt->mExpression = varDecl;
  3112. }
  3113. }
  3114. }
  3115. }
  3116. }
  3117. }
  3118. initializers.push_back(stmt);
  3119. MoveNode(stmt, forStatement);
  3120. }
  3121. nextNode = mVisitorPos.GetNext();
  3122. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  3123. if (tokenNode == NULL)
  3124. return forStatement;
  3125. if (tokenNode->GetToken() == BfToken_Semicolon)
  3126. {
  3127. MEMBER_SET(forStatement, mInitializerSemicolon, tokenNode);
  3128. mVisitorPos.MoveNext();
  3129. break;
  3130. }
  3131. else if (tokenNode->GetToken() == BfToken_Comma)
  3132. {
  3133. MoveNode(tokenNode, forStatement);
  3134. initializerCommas.push_back(tokenNode);
  3135. mVisitorPos.MoveNext();
  3136. }
  3137. else
  3138. {
  3139. Fail("Expected ',' or ';'", tokenNode);
  3140. return forStatement;
  3141. }
  3142. }
  3143. // Condition
  3144. nextNode = mVisitorPos.GetNext();
  3145. if (!IsSemicolon(nextNode))
  3146. {
  3147. bool doExpr = true;
  3148. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  3149. {
  3150. if (tokenNode->GetToken() == BfToken_RParen)
  3151. {
  3152. Fail("Expected expression or ';'", tokenNode);
  3153. doExpr = false;
  3154. }
  3155. }
  3156. if (doExpr)
  3157. {
  3158. auto expr = CreateExpressionAfter(forStatement);
  3159. if (expr == NULL)
  3160. return forStatement;
  3161. MEMBER_SET(forStatement, mCondition, expr);
  3162. }
  3163. }
  3164. auto tokenNode = ExpectTokenAfter(forStatement, BfToken_Semicolon);
  3165. if (tokenNode == NULL)
  3166. return forStatement;
  3167. MEMBER_SET(forStatement, mConditionSemicolon, tokenNode);
  3168. // Iterators
  3169. for (int listIdx = 0; true; listIdx++)
  3170. {
  3171. if (listIdx == 0)
  3172. {
  3173. auto nextNode = mVisitorPos.GetNext();
  3174. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  3175. {
  3176. if (tokenNode->GetToken() == BfToken_RParen)
  3177. {
  3178. MEMBER_SET(forStatement, mCloseParen, tokenNode);
  3179. mVisitorPos.MoveNext();
  3180. break;
  3181. }
  3182. }
  3183. }
  3184. auto stmt = CreateStatementAfter(forStatement);
  3185. if (stmt == NULL)
  3186. return forStatement;
  3187. iterators.push_back(stmt);
  3188. MoveNode(stmt, forStatement);
  3189. auto nextNode = mVisitorPos.GetNext();
  3190. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  3191. if (tokenNode == NULL)
  3192. return forStatement;
  3193. if (tokenNode->GetToken() == BfToken_RParen)
  3194. {
  3195. MEMBER_SET(forStatement, mCloseParen, tokenNode);
  3196. mVisitorPos.MoveNext();
  3197. break;
  3198. }
  3199. else if (tokenNode->GetToken() == BfToken_Comma)
  3200. {
  3201. MoveNode(tokenNode, forStatement);
  3202. iteratorCommas.push_back(tokenNode);
  3203. mVisitorPos.MoveNext();
  3204. }
  3205. else
  3206. {
  3207. Fail("Expected ',' or ')'", tokenNode);
  3208. return forStatement;
  3209. }
  3210. }
  3211. stmt = CreateStatementAfter(forStatement, CreateStmtFlags_FindTrailingSemicolon);
  3212. if (stmt == NULL)
  3213. return forStatement;
  3214. MEMBER_SET(forStatement, mEmbeddedStatement, stmt);
  3215. return forStatement;
  3216. }
  3217. BfUsingStatement* BfReducer::CreateUsingStatement(BfAstNode* node)
  3218. {
  3219. auto tokenNode = BfNodeDynCast<BfTokenNode>(node);
  3220. auto usingStatement = mAlloc->Alloc<BfUsingStatement>();
  3221. ReplaceNode(tokenNode, usingStatement);
  3222. MEMBER_SET(usingStatement, mUsingToken, tokenNode);
  3223. tokenNode = ExpectTokenAfter(usingStatement, BfToken_LParen);
  3224. if (tokenNode == NULL)
  3225. return NULL;
  3226. MEMBER_SET(usingStatement, mOpenParen, tokenNode);
  3227. auto nextNode = mVisitorPos.GetNext();
  3228. if (nextNode != NULL)
  3229. {
  3230. BfVariableDeclaration* varDecl = mAlloc->Alloc<BfVariableDeclaration>();
  3231. int outNodeIdx = -1;
  3232. auto nextNode = mVisitorPos.GetNext();
  3233. mVisitorPos.mReadPos++;
  3234. bool isTypeReference = IsTypeReference(nextNode, BfToken_None, -1, &outNodeIdx);
  3235. mVisitorPos.mReadPos--;
  3236. if (isTypeReference)
  3237. {
  3238. BfAstNode* outNode = mVisitorPos.Get(outNodeIdx);
  3239. BfAstNode* outNodeNext = mVisitorPos.Get(outNodeIdx + 1);
  3240. BfTokenNode* equalsNode = NULL;
  3241. if ((outNode != NULL) && (BfNodeIsA<BfIdentifierNode>(outNode)) && (BfNodeIsA<BfTokenNode>(outNodeNext)))
  3242. {
  3243. auto typeRef = CreateTypeRefAfter(usingStatement);
  3244. if (typeRef == NULL)
  3245. return usingStatement;
  3246. MEMBER_SET(varDecl, mTypeRef, typeRef);
  3247. usingStatement->SetSrcEnd(typeRef->GetSrcEnd());
  3248. auto nameNode = ExpectIdentifierAfter(usingStatement, "variable name");
  3249. if (nameNode == NULL)
  3250. return usingStatement;
  3251. MEMBER_SET(varDecl, mNameNode, nameNode);
  3252. usingStatement->SetSrcEnd(varDecl->GetSrcEnd());
  3253. auto equalsNode = ExpectTokenAfter(usingStatement, BfToken_AssignEquals);
  3254. if (equalsNode == NULL)
  3255. return usingStatement;
  3256. MEMBER_SET(varDecl, mEqualsNode, equalsNode);
  3257. usingStatement->SetSrcEnd(equalsNode->GetSrcEnd());
  3258. }
  3259. }
  3260. auto expr = CreateExpressionAfter(usingStatement);
  3261. if (expr == NULL)
  3262. return usingStatement;
  3263. MEMBER_SET(varDecl, mInitializer, expr);
  3264. MEMBER_SET(usingStatement, mVariableDeclaration, varDecl);
  3265. }
  3266. tokenNode = ExpectTokenAfter(usingStatement, BfToken_RParen);
  3267. if (tokenNode == NULL)
  3268. return usingStatement;
  3269. MEMBER_SET(usingStatement, mCloseParen, tokenNode);
  3270. auto stmt = CreateStatementAfter(usingStatement, CreateStmtFlags_FindTrailingSemicolon);
  3271. if (stmt == NULL)
  3272. return usingStatement;
  3273. MEMBER_SET(usingStatement, mEmbeddedStatement, stmt);
  3274. return usingStatement;
  3275. }
  3276. BfWhileStatement* BfReducer::CreateWhileStatement(BfAstNode* node)
  3277. {
  3278. auto tokenNode = BfNodeDynCast<BfTokenNode>(node);
  3279. auto whileStatement = mAlloc->Alloc<BfWhileStatement>();
  3280. ReplaceNode(tokenNode, whileStatement);
  3281. MEMBER_SET(whileStatement, mWhileToken, tokenNode);
  3282. tokenNode = ExpectTokenAfter(whileStatement, BfToken_LParen);
  3283. if (tokenNode == NULL)
  3284. return NULL;
  3285. MEMBER_SET(whileStatement, mOpenParen, tokenNode);
  3286. // Condition
  3287. auto nextNode = mVisitorPos.GetNext();
  3288. if (!IsSemicolon(nextNode))
  3289. {
  3290. auto expr = CreateExpressionAfter(whileStatement);
  3291. if (expr == NULL)
  3292. return whileStatement;
  3293. MEMBER_SET(whileStatement, mCondition, expr);
  3294. }
  3295. tokenNode = ExpectTokenAfter(whileStatement, BfToken_RParen);
  3296. if (tokenNode == NULL)
  3297. return whileStatement;
  3298. MEMBER_SET(whileStatement, mCloseParen, tokenNode);
  3299. auto stmt = CreateStatementAfter(whileStatement, CreateStmtFlags_FindTrailingSemicolon);
  3300. if (stmt == NULL)
  3301. return whileStatement;
  3302. MEMBER_SET(whileStatement, mEmbeddedStatement, stmt);
  3303. return whileStatement;
  3304. }
  3305. BfDoStatement* BfReducer::CreateDoStatement(BfAstNode* node)
  3306. {
  3307. auto tokenNode = BfNodeDynCast<BfTokenNode>(node);
  3308. auto doStatement = mAlloc->Alloc<BfDoStatement>();
  3309. ReplaceNode(tokenNode, doStatement);
  3310. MEMBER_SET(doStatement, mDoToken, tokenNode);
  3311. auto stmt = CreateStatementAfter(doStatement, CreateStmtFlags_FindTrailingSemicolon);
  3312. if (stmt != NULL)
  3313. {
  3314. MEMBER_SET(doStatement, mEmbeddedStatement, stmt);
  3315. }
  3316. return doStatement;
  3317. }
  3318. BfRepeatStatement* BfReducer::CreateRepeatStatement(BfAstNode* node)
  3319. {
  3320. auto tokenNode = BfNodeDynCast<BfTokenNode>(node);
  3321. auto repeatStatement = mAlloc->Alloc<BfRepeatStatement>();
  3322. ReplaceNode(tokenNode, repeatStatement);
  3323. MEMBER_SET(repeatStatement, mRepeatToken, tokenNode);
  3324. auto stmt = CreateStatementAfter(repeatStatement, CreateStmtFlags_FindTrailingSemicolon);
  3325. if (stmt != NULL)
  3326. {
  3327. MEMBER_SET(repeatStatement, mEmbeddedStatement, stmt);
  3328. }
  3329. tokenNode = ExpectTokenAfter(repeatStatement, BfToken_While);
  3330. if (tokenNode != NULL)
  3331. {
  3332. MEMBER_SET(repeatStatement, mWhileToken, tokenNode);
  3333. }
  3334. tokenNode = ExpectTokenAfter(repeatStatement, BfToken_LParen);
  3335. if (tokenNode != NULL)
  3336. {
  3337. MEMBER_SET(repeatStatement, mOpenParen, tokenNode);
  3338. }
  3339. // Condition
  3340. auto nextNode = mVisitorPos.GetNext();
  3341. if (!IsSemicolon(nextNode))
  3342. {
  3343. auto expr = CreateExpressionAfter(repeatStatement);
  3344. if (expr == NULL)
  3345. return repeatStatement;
  3346. MEMBER_SET(repeatStatement, mCondition, expr);
  3347. }
  3348. tokenNode = ExpectTokenAfter(repeatStatement, BfToken_RParen);
  3349. if (tokenNode != NULL)
  3350. {
  3351. MEMBER_SET(repeatStatement, mCloseParen, tokenNode);
  3352. }
  3353. return repeatStatement;
  3354. }
  3355. BfSwitchStatement* BfReducer::CreateSwitchStatement(BfTokenNode* tokenNode)
  3356. {
  3357. auto switchStatement = mAlloc->Alloc<BfSwitchStatement>();
  3358. BfDeferredAstSizedArray<BfSwitchCase*> switchCases(switchStatement->mSwitchCases, mAlloc);
  3359. ReplaceNode(tokenNode, switchStatement);
  3360. switchStatement->mSwitchToken = tokenNode;
  3361. tokenNode = ExpectTokenAfter(switchStatement, BfToken_LParen);
  3362. if (tokenNode != NULL)
  3363. {
  3364. MEMBER_SET(switchStatement, mOpenParen, tokenNode);
  3365. }
  3366. auto switchValue = CreateExpressionAfter(switchStatement);
  3367. if (switchValue != NULL)
  3368. {
  3369. MEMBER_SET(switchStatement, mSwitchValue, switchValue);
  3370. }
  3371. tokenNode = ExpectTokenAfter(switchStatement, BfToken_RParen);
  3372. if (tokenNode != NULL)
  3373. {
  3374. MEMBER_SET(switchStatement, mCloseParen, tokenNode);
  3375. }
  3376. auto block = ExpectBlockAfter(switchStatement);
  3377. if (block == NULL)
  3378. return switchStatement;
  3379. MoveNode(block, switchStatement);
  3380. switchStatement->mOpenBrace = block->mOpenBrace;
  3381. switchStatement->mCloseBrace = block->mCloseBrace;
  3382. bool hadEmptyCaseStatement = false;
  3383. BfSwitchCase* switchCase = NULL;
  3384. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
  3385. bool isDone = !mVisitorPos.MoveNext();
  3386. while (!isDone)
  3387. {
  3388. auto child = mVisitorPos.GetCurrent();
  3389. tokenNode = BfNodeDynCast<BfTokenNode>(child);
  3390. BfToken token = BfToken_None;
  3391. if (tokenNode != NULL)
  3392. token = tokenNode->GetToken();
  3393. if ((tokenNode == NULL) ||
  3394. ((token != BfToken_Case) && (token != BfToken_When) && (token != BfToken_Default)))
  3395. {
  3396. Fail("Expected 'case'", child);
  3397. AddErrorNode(child);
  3398. isDone = !mVisitorPos.MoveNext();
  3399. continue;
  3400. }
  3401. //TODO: This error was getting annoying... Put back?
  3402. // This check is here at the top, being processed for the previous switchCase because
  3403. // we don't throw an error on the last case in the switch
  3404. /*if (hadEmptyCaseStatement)
  3405. FailAfter("Expected case statement, 'fallthrough', or 'break'", switchCase);*/
  3406. bool isDefault = token == BfToken_Default;
  3407. switchCase = mAlloc->Alloc<BfSwitchCase>();
  3408. BfDeferredAstSizedArray<BfExpression*> caseExpressions(switchCase->mCaseExpressions, mAlloc);
  3409. BfDeferredAstSizedArray<BfTokenNode*> caseCommas(switchCase->mCaseCommas, mAlloc);
  3410. ReplaceNode(tokenNode, switchCase);
  3411. BfTokenNode* whenToken = NULL;
  3412. if (token == BfToken_When)
  3413. whenToken = tokenNode;
  3414. else
  3415. switchCase->mCaseToken = tokenNode;
  3416. for (int caseIdx = 0; true; caseIdx++)
  3417. {
  3418. if (!isDefault)
  3419. {
  3420. BfExpression* expr = NULL;
  3421. bool wasWhenSet = whenToken != NULL;
  3422. if (!wasWhenSet)
  3423. {
  3424. auto nextNode = mVisitorPos.GetNext();
  3425. whenToken = BfNodeDynCast<BfTokenNode>(nextNode);
  3426. if ((whenToken != NULL) && (whenToken->GetToken() == BfToken_When))
  3427. {
  3428. mVisitorPos.MoveNext();
  3429. }
  3430. else
  3431. whenToken = NULL;
  3432. }
  3433. if (whenToken != NULL)
  3434. {
  3435. auto whenExpr = mAlloc->Alloc<BfWhenExpression>();
  3436. whenExpr->mWhenToken = whenToken;
  3437. ReplaceNode(whenToken, whenExpr);
  3438. //mVisitorPos.MoveNext();
  3439. //auto exprAfter = wasWhenSet ? (BfAstNode*)switchCase : (BfAstNode*)whenExpr;
  3440. if (expr == NULL)
  3441. {
  3442. auto innerExpr = CreateExpressionAfter(whenToken);
  3443. if (innerExpr != NULL)
  3444. {
  3445. MEMBER_SET(whenExpr, mExpression, innerExpr);
  3446. }
  3447. expr = whenExpr;
  3448. }
  3449. }
  3450. if (expr == NULL)
  3451. {
  3452. if (auto bindToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  3453. {
  3454. if ((bindToken->GetToken() == BfToken_Var) || (bindToken->GetToken() == BfToken_Let))
  3455. {
  3456. expr = CreateEnumCaseBindExpression(bindToken);
  3457. }
  3458. }
  3459. }
  3460. if (expr == NULL)
  3461. expr = CreateExpressionAfter(switchCase);
  3462. if (expr == NULL)
  3463. {
  3464. ///
  3465. }
  3466. else
  3467. {
  3468. caseExpressions.push_back(expr);
  3469. MoveNode(expr, switchCase);
  3470. }
  3471. }
  3472. if ((whenToken == NULL) && (!isDefault))
  3473. tokenNode = ExpectTokenAfter(switchCase, BfToken_When, BfToken_Colon, BfToken_Comma);
  3474. else
  3475. tokenNode = ExpectTokenAfter(switchCase, BfToken_Colon);
  3476. if (tokenNode == NULL)
  3477. break;
  3478. if (tokenNode->GetToken() == BfToken_When)
  3479. {
  3480. whenToken = tokenNode;
  3481. continue;
  3482. }
  3483. if (tokenNode->GetToken() == BfToken_Colon)
  3484. {
  3485. MEMBER_SET(switchCase, mColonToken, tokenNode);
  3486. break;
  3487. }
  3488. if (isDefault)
  3489. {
  3490. Fail("Expected ':'", tokenNode);
  3491. break;
  3492. }
  3493. MoveNode(tokenNode, switchCase);
  3494. caseCommas.push_back(tokenNode);
  3495. BF_ASSERT(whenToken == NULL);
  3496. }
  3497. if (isDefault)
  3498. {
  3499. if (switchStatement->mDefaultCase != NULL)
  3500. {
  3501. Fail("Only one default case is allowed", switchCase);
  3502. // Add to normal switch cases just so we process it
  3503. switchCases.push_back(switchCase);
  3504. }
  3505. else
  3506. switchStatement->mDefaultCase = switchCase;
  3507. }
  3508. else
  3509. {
  3510. if (switchStatement->mDefaultCase != NULL)
  3511. {
  3512. Fail("Default case must be last case", switchStatement->mDefaultCase);
  3513. }
  3514. switchCases.push_back(switchCase);
  3515. }
  3516. hadEmptyCaseStatement = true;
  3517. auto codeBlock = mAlloc->Alloc<BfBlock>();
  3518. //codeBlock->mSource = switchCase->mSource;
  3519. MEMBER_SET(switchCase, mCodeBlock, codeBlock);
  3520. //switchCase->Add(codeBlock);
  3521. BfDeferredAstSizedArray<BfAstNode*> codeBlockChildArr(codeBlock->mChildArr, mAlloc);
  3522. SetAndRestoreValue<BfAstNode*> prevLastBlockNode(mLastBlockNode, NULL);
  3523. while (true)
  3524. {
  3525. auto nextNode = mVisitorPos.GetNext();
  3526. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  3527. if (tokenNode != NULL)
  3528. {
  3529. int token = tokenNode->GetToken();
  3530. if ((token == BfToken_Case) || (token == BfToken_Default) || (token == BfToken_When))
  3531. break; // Done! No fallthrough
  3532. }
  3533. nextNode = mVisitorPos.GetNext();
  3534. if (nextNode == NULL)
  3535. break;
  3536. hadEmptyCaseStatement = false;
  3537. mVisitorPos.MoveNext();
  3538. // We need to use CreateStmtFlags_NoCaseExpr because otherwise during typing a new statement at the end of one case, it
  3539. // could interpret the 'case' token for the next case as being part of a case expression in the first case
  3540. auto stmt = CreateStatement(nextNode, (CreateStmtFlags)(CreateStmtFlags_FindTrailingSemicolon | CreateStmtFlags_NoCaseExpr | CreateStmtFlags_AllowLocalFunction));
  3541. if (stmt == NULL)
  3542. {
  3543. AddErrorNode(nextNode);
  3544. }
  3545. else
  3546. {
  3547. MoveNode(stmt, codeBlock);
  3548. codeBlockChildArr.push_back(stmt);
  3549. }
  3550. mLastBlockNode = stmt;
  3551. }
  3552. MoveNode(switchCase, switchStatement);
  3553. if (!codeBlock->IsInitialized())
  3554. {
  3555. int srcPos = switchCase->GetSrcEnd();
  3556. codeBlock->Init(srcPos, srcPos, srcPos);
  3557. }
  3558. isDone = !mVisitorPos.MoveNext();
  3559. }
  3560. return switchStatement;
  3561. }
  3562. // Does everything but pull the trailing semicolon
  3563. BfAstNode* BfReducer::DoCreateStatement(BfAstNode* node, CreateStmtFlags createStmtFlags)
  3564. {
  3565. auto subCreateStmtFlags = (CreateStmtFlags)(createStmtFlags & (CreateStmtFlags_NoCaseExpr | CreateStmtFlags_FindTrailingSemicolon | CreateStmtFlags_AllowUnterminatedExpression));
  3566. if (node->IsA<BfBlock>())
  3567. {
  3568. auto block = (BfBlock*)node;
  3569. HandleBlock(block, (createStmtFlags & CreateStmtFlags_AllowUnterminatedExpression) != 0);
  3570. return block;
  3571. }
  3572. BfVariableDeclaration* continuingVariable = NULL;
  3573. BfTokenNode* refToken = NULL;
  3574. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(node))
  3575. {
  3576. int token = tokenNode->GetToken();
  3577. if ((token == BfToken_Ref) || (token == BfToken_Mut))
  3578. {
  3579. refToken = tokenNode;
  3580. }
  3581. else if (token == BfToken_Semicolon)
  3582. {
  3583. Fail("Empty statement not allowed", tokenNode);
  3584. auto emptyStatement = mAlloc->Alloc<BfEmptyStatement>();
  3585. ReplaceNode(tokenNode, emptyStatement);
  3586. emptyStatement->mTrailingSemicolon = tokenNode;
  3587. return emptyStatement;
  3588. }
  3589. else if (token == BfToken_Break)
  3590. {
  3591. auto breakStmt = mAlloc->Alloc<BfBreakStatement>();
  3592. ReplaceNode(tokenNode, breakStmt);
  3593. breakStmt->mBreakNode = tokenNode;
  3594. if (auto label = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext()))
  3595. {
  3596. MEMBER_SET(breakStmt, mLabel, label);
  3597. mVisitorPos.MoveNext();
  3598. }
  3599. else if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  3600. {
  3601. if (tokenNode->GetToken() == BfToken_Mixin)
  3602. {
  3603. MEMBER_SET(breakStmt, mLabel, tokenNode);
  3604. mVisitorPos.MoveNext();
  3605. }
  3606. }
  3607. return breakStmt;
  3608. }
  3609. else if (token == BfToken_Continue)
  3610. {
  3611. auto continueStmt = mAlloc->Alloc<BfContinueStatement>();
  3612. ReplaceNode(tokenNode, continueStmt);
  3613. continueStmt->mContinueNode = tokenNode;
  3614. if (auto label = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext()))
  3615. {
  3616. MEMBER_SET(continueStmt, mLabel, label);
  3617. mVisitorPos.MoveNext();
  3618. }
  3619. else if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  3620. {
  3621. if (tokenNode->GetToken() == BfToken_Mixin)
  3622. {
  3623. MEMBER_SET(continueStmt, mLabel, tokenNode);
  3624. mVisitorPos.MoveNext();
  3625. }
  3626. }
  3627. return continueStmt;
  3628. }
  3629. else if (token == BfToken_Fallthrough)
  3630. {
  3631. auto fallthroughStmt = mAlloc->Alloc<BfFallthroughStatement>();
  3632. ReplaceNode(tokenNode, fallthroughStmt);
  3633. fallthroughStmt->mFallthroughToken = tokenNode;
  3634. if (auto label = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext()))
  3635. {
  3636. MEMBER_SET(fallthroughStmt, mLabel, label);
  3637. mVisitorPos.MoveNext();
  3638. }
  3639. else if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  3640. {
  3641. if (tokenNode->GetToken() == BfToken_Mixin)
  3642. {
  3643. MEMBER_SET(fallthroughStmt, mLabel, tokenNode);
  3644. mVisitorPos.MoveNext();
  3645. }
  3646. }
  3647. return fallthroughStmt;
  3648. }
  3649. else if (token == BfToken_For)
  3650. {
  3651. return CreateForStatement(node);
  3652. }
  3653. else if (token == BfToken_Using)
  3654. {
  3655. return CreateUsingStatement(node);
  3656. }
  3657. else if (token == BfToken_While)
  3658. {
  3659. return CreateWhileStatement(node);
  3660. }
  3661. else if (token == BfToken_Do)
  3662. {
  3663. bool isRepeat = false;
  3664. auto checkNode = mVisitorPos.Get(mVisitorPos.mReadPos + 2);
  3665. auto checkToken = BfNodeDynCast<BfTokenNode>(checkNode);
  3666. if ((checkToken != NULL) && (checkToken->mToken == BfToken_While))
  3667. {
  3668. // Check to see if it's a 'do {} while (...);' or an indepent 'while' statement
  3669. int checkIdx = mVisitorPos.mReadPos + 3;
  3670. int openCount = 0;
  3671. while (true)
  3672. {
  3673. auto checkNode = mVisitorPos.Get(checkIdx);
  3674. if (checkNode == NULL)
  3675. break;
  3676. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(checkNode))
  3677. {
  3678. if (tokenNode->mToken == BfToken_LParen)
  3679. {
  3680. if ((openCount == 0) && (checkIdx != mVisitorPos.mReadPos + 3))
  3681. break;
  3682. openCount++;
  3683. }
  3684. else if (tokenNode->mToken == BfToken_RParen)
  3685. {
  3686. openCount--;
  3687. if (openCount < 0)
  3688. break;
  3689. }
  3690. else if (tokenNode->mToken == BfToken_Semicolon)
  3691. {
  3692. isRepeat = true;
  3693. break;
  3694. }
  3695. else if (openCount == 0)
  3696. break;
  3697. }
  3698. else
  3699. {
  3700. if (openCount == 0)
  3701. break;
  3702. }
  3703. checkIdx++;
  3704. }
  3705. }
  3706. if (isRepeat)
  3707. return CreateRepeatStatement(node);
  3708. else
  3709. return CreateDoStatement(node);
  3710. }
  3711. else if (token == BfToken_Repeat)
  3712. {
  3713. return CreateRepeatStatement(node);
  3714. }
  3715. else if (token == BfToken_Return)
  3716. {
  3717. auto returnStmt = mAlloc->Alloc<BfReturnStatement>();
  3718. ReplaceNode(node, returnStmt);
  3719. MEMBER_SET(returnStmt, mReturnToken, tokenNode);
  3720. auto nextNode = mVisitorPos.GetNext();
  3721. if (!IsSemicolon(nextNode))
  3722. {
  3723. auto expr = CreateExpressionAfter(returnStmt);
  3724. MEMBER_SET_CHECKED(returnStmt, mExpression, expr);
  3725. }
  3726. return returnStmt;
  3727. }
  3728. else if (token == BfToken_Delete)
  3729. {
  3730. auto deleteStmt = mAlloc->Alloc<BfDeleteStatement>();
  3731. ReplaceNode(node, deleteStmt);
  3732. MEMBER_SET(deleteStmt, mDeleteToken, tokenNode);
  3733. auto nextNode = mVisitorPos.GetNext();
  3734. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  3735. {
  3736. if (tokenNode->GetToken() == BfToken_Colon)
  3737. {
  3738. MEMBER_SET(deleteStmt, mTargetTypeToken, tokenNode);
  3739. mVisitorPos.MoveNext();
  3740. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  3741. {
  3742. if (tokenNode->mToken == BfToken_Append)
  3743. {
  3744. MEMBER_SET(deleteStmt, mAllocExpr, tokenNode);
  3745. mVisitorPos.MoveNext();
  3746. }
  3747. }
  3748. if (deleteStmt->mAllocExpr == NULL)
  3749. {
  3750. auto allocExpr = CreateExpressionAfter(deleteStmt, (CreateExprFlags)(CreateExprFlags_NoCast | CreateExprFlags_ExitOnParenExpr));
  3751. if (allocExpr != NULL)
  3752. {
  3753. MEMBER_SET(deleteStmt, mAllocExpr, allocExpr);
  3754. }
  3755. }
  3756. }
  3757. }
  3758. nextNode = mVisitorPos.GetNext();
  3759. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  3760. {
  3761. if (tokenNode->mToken == BfToken_LBracket)
  3762. {
  3763. mVisitorPos.MoveNext();
  3764. auto attrib = CreateAttributeDirective(tokenNode);
  3765. if (attrib == NULL)
  3766. return deleteStmt;
  3767. MEMBER_SET(deleteStmt, mAttributes, attrib);
  3768. }
  3769. }
  3770. auto expr = CreateExpressionAfter(deleteStmt);
  3771. MEMBER_SET_CHECKED(deleteStmt, mExpression, expr);
  3772. return deleteStmt;
  3773. }
  3774. else if (token == BfToken_Throw)
  3775. {
  3776. auto throwStmt = mAlloc->Alloc<BfThrowStatement>();
  3777. ReplaceNode(node, throwStmt);
  3778. MEMBER_SET(throwStmt, mThrowToken, tokenNode);
  3779. auto expr = CreateExpressionAfter(throwStmt);
  3780. MEMBER_SET_CHECKED(throwStmt, mExpression, expr);
  3781. return throwStmt;
  3782. }
  3783. else if (token == BfToken_If)
  3784. {
  3785. subCreateStmtFlags = (CreateStmtFlags)(createStmtFlags & (CreateStmtFlags_FindTrailingSemicolon));
  3786. auto ifStmt = mAlloc->Alloc<BfIfStatement>();
  3787. ReplaceNode(node, ifStmt);
  3788. MEMBER_SET(ifStmt, mIfToken, tokenNode);
  3789. tokenNode = ExpectTokenAfter(ifStmt, BfToken_LParen);
  3790. MEMBER_SET_CHECKED(ifStmt, mOpenParen, tokenNode);
  3791. auto condExpr = CreateExpressionAfter(ifStmt, CreateExprFlags_AllowVariableDecl);
  3792. MEMBER_SET_CHECKED(ifStmt, mCondition, condExpr);
  3793. tokenNode = ExpectTokenAfter(ifStmt, BfToken_RParen);
  3794. MEMBER_SET_CHECKED(ifStmt, mCloseParen, tokenNode);
  3795. auto trueStmt = CreateStatementAfter(ifStmt, subCreateStmtFlags);
  3796. MEMBER_SET_CHECKED(ifStmt, mTrueStatement, trueStmt);
  3797. auto nextNode = mVisitorPos.GetNext();
  3798. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  3799. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_Else))
  3800. {
  3801. MEMBER_SET(ifStmt, mElseToken, tokenNode);
  3802. mVisitorPos.MoveNext();
  3803. auto falseStmt = CreateStatementAfter(ifStmt, (CreateStmtFlags)(subCreateStmtFlags | CreateStmtFlags_CheckStack));
  3804. MEMBER_SET_CHECKED(ifStmt, mFalseStatement, falseStmt);
  3805. }
  3806. return ifStmt;
  3807. }
  3808. else if (token == BfToken_Switch)
  3809. {
  3810. return CreateSwitchStatement(tokenNode);
  3811. }
  3812. else if (token == BfToken_Defer)
  3813. {
  3814. auto deferStmt = mAlloc->Alloc<BfDeferStatement>();
  3815. ReplaceNode(tokenNode, deferStmt);
  3816. deferStmt->mDeferToken = tokenNode;
  3817. auto nextNode = mVisitorPos.GetNext();
  3818. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  3819. {
  3820. if (nextTokenNode->GetToken() == BfToken_Colon)
  3821. {
  3822. MEMBER_SET(deferStmt, mColonToken, nextTokenNode);
  3823. mVisitorPos.MoveNext();
  3824. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  3825. {
  3826. if ((nextToken->GetToken() == BfToken_Colon) || (nextToken->GetToken() == BfToken_Mixin))
  3827. {
  3828. MEMBER_SET(deferStmt, mScopeName, nextToken);
  3829. mVisitorPos.MoveNext();
  3830. }
  3831. }
  3832. else if (auto identifier = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext()))
  3833. {
  3834. MEMBER_SET(deferStmt, mScopeName, identifier);
  3835. mVisitorPos.MoveNext();
  3836. }
  3837. if (deferStmt->mScopeName == NULL)
  3838. {
  3839. FailAfter("Expected scope name", deferStmt);
  3840. }
  3841. }
  3842. else if (nextTokenNode->GetToken() == BfToken_ColonColon)
  3843. {
  3844. MEMBER_SET(deferStmt, mColonToken, nextTokenNode);
  3845. mVisitorPos.MoveNext();
  3846. }
  3847. else if (nextTokenNode->GetToken() == BfToken_LParen)
  3848. {
  3849. mPassInstance->Warn(0, "Syntax deprecated", nextTokenNode);
  3850. MEMBER_SET(deferStmt, mOpenParen, nextTokenNode);
  3851. mVisitorPos.MoveNext();
  3852. nextTokenNode = ExpectTokenAfter(deferStmt, BfToken_Scope);
  3853. MEMBER_SET_CHECKED(deferStmt, mScopeToken, nextTokenNode);
  3854. nextTokenNode = ExpectTokenAfter(deferStmt, BfToken_RParen);
  3855. MEMBER_SET_CHECKED(deferStmt, mCloseParen, nextTokenNode);
  3856. }
  3857. }
  3858. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  3859. {
  3860. if (nextTokenNode->GetToken() == BfToken_LBracket)
  3861. {
  3862. auto bindNode = mAlloc->Alloc<BfDeferBindNode>();
  3863. ReplaceNode(nextTokenNode, bindNode);
  3864. MEMBER_SET(bindNode, mOpenBracket, nextTokenNode);
  3865. mVisitorPos.MoveNext();
  3866. BfDeferredAstSizedArray<BfIdentifierNode*> params(bindNode->mParams, mAlloc);
  3867. BfDeferredAstSizedArray<BfTokenNode*> commas(bindNode->mCommas, mAlloc);
  3868. for (int paramIdx = 0; true; paramIdx++)
  3869. {
  3870. bool isRBracket = false;
  3871. auto nextNode = mVisitorPos.GetNext();
  3872. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  3873. isRBracket = tokenNode->GetToken() == BfToken_RBracket;
  3874. if (!isRBracket)
  3875. {
  3876. auto nameIdentifier = ExpectIdentifierAfter(bindNode, "parameter name");
  3877. if (nameIdentifier == NULL)
  3878. break;
  3879. MoveNode(nameIdentifier, bindNode);
  3880. params.push_back(nameIdentifier);
  3881. }
  3882. tokenNode = ExpectTokenAfter(bindNode, BfToken_Comma, BfToken_RBracket);
  3883. if (tokenNode == NULL)
  3884. return deferStmt;
  3885. if (tokenNode->GetToken() == BfToken_RBracket)
  3886. {
  3887. MEMBER_SET(bindNode, mCloseBracket, tokenNode);
  3888. break;
  3889. }
  3890. MoveNode(tokenNode, bindNode);
  3891. commas.push_back(tokenNode);
  3892. }
  3893. MEMBER_SET(deferStmt, mBind, bindNode);
  3894. }
  3895. }
  3896. BfAstNode* targetNode = CreateStatementAfter(deferStmt);
  3897. if (targetNode != NULL)
  3898. {
  3899. BfAstNode* innerTarget = targetNode;
  3900. if (auto exprStmt = BfNodeDynCast<BfExpressionStatement>(innerTarget))
  3901. innerTarget = exprStmt->mExpression;
  3902. if (deferStmt->mBind != NULL)
  3903. {
  3904. if (!innerTarget->IsA<BfBlock>())
  3905. {
  3906. Fail("Only blocks are allowed when defer binding is used", targetNode);
  3907. }
  3908. }
  3909. else
  3910. {
  3911. if ((!innerTarget->IsA<BfInvocationExpression>()) &&
  3912. (!innerTarget->IsA<BfBlock>()) &&
  3913. (!innerTarget->IsA<BfDeleteStatement>()))
  3914. {
  3915. Fail("Only invocation expressions, statement blocks, or deletes are allowed", targetNode);
  3916. }
  3917. }
  3918. MEMBER_SET(deferStmt, mTargetNode, targetNode);
  3919. }
  3920. return deferStmt;
  3921. }
  3922. else if (token == BfToken_Comma)
  3923. {
  3924. BfAstNode* prevVarDecl = mVisitorPos.Get(mVisitorPos.mWritePos - 1);
  3925. if (mLastBlockNode != NULL)
  3926. prevVarDecl = mLastBlockNode;
  3927. if (auto exprStmt = BfNodeDynCast<BfExpressionStatement>(prevVarDecl))
  3928. {
  3929. continuingVariable = BfNodeDynCast<BfVariableDeclaration>(exprStmt->mExpression);
  3930. }
  3931. }
  3932. else if ((token == BfToken_Const) || (token == BfToken_ReadOnly) || (token == BfToken_Static))
  3933. {
  3934. auto flags = (CreateStmtFlags)(CreateStmtFlags_FindTrailingSemicolon | CreateStmtFlags_ForceVariableDecl);
  3935. if (token == BfToken_Static)
  3936. flags = (CreateStmtFlags)(flags | CreateStmtFlags_AllowLocalFunction);
  3937. auto stmt = CreateStatementAfter(tokenNode, flags);
  3938. if (auto exprStmt = BfNodeDynCast<BfExpressionStatement>(stmt))
  3939. {
  3940. if (auto variableDecl = BfNodeDynCast<BfVariableDeclaration>(exprStmt->mExpression))
  3941. {
  3942. if (variableDecl->mModSpecifier != NULL)
  3943. {
  3944. Fail(StrFormat("'%s' already specified", BfTokenToString(variableDecl->mModSpecifier->GetToken())), variableDecl->mModSpecifier);
  3945. }
  3946. MEMBER_SET(variableDecl, mModSpecifier, tokenNode);
  3947. exprStmt->SetSrcStart(tokenNode->mSrcStart);
  3948. return stmt;
  3949. }
  3950. }
  3951. if (auto localMethod = BfNodeDynCast<BfLocalMethodDeclaration>(stmt))
  3952. {
  3953. if (localMethod->mMethodDeclaration->mStaticSpecifier != NULL)
  3954. {
  3955. Fail(StrFormat("'%s' already specified", BfTokenToString(localMethod->mMethodDeclaration->mStaticSpecifier->GetToken())), localMethod->mMethodDeclaration->mStaticSpecifier);
  3956. }
  3957. MEMBER_SET(localMethod->mMethodDeclaration, mStaticSpecifier, tokenNode);
  3958. localMethod->SetSrcStart(tokenNode->mSrcStart);
  3959. return localMethod;
  3960. }
  3961. Fail(StrFormat("Unexpected '%s' specifier", BfTokenToString(tokenNode->GetToken())), tokenNode);
  3962. return stmt;
  3963. }
  3964. else if (token == BfToken_Volatile)
  3965. {
  3966. Fail("Cannot create volatile local variables", tokenNode);
  3967. return NULL;
  3968. }
  3969. else if (token == BfToken_Asm)
  3970. {
  3971. return CreateInlineAsmStatement(node);
  3972. }
  3973. else if (token == BfToken_Mixin)
  3974. {
  3975. auto methodDecl = mAlloc->Alloc<BfMethodDeclaration>();
  3976. BfDeferredAstSizedArray<BfParameterDeclaration*> params(methodDecl->mParams, mAlloc);
  3977. BfDeferredAstSizedArray<BfTokenNode*> commas(methodDecl->mCommas, mAlloc);
  3978. ReplaceNode(tokenNode, methodDecl);
  3979. methodDecl->mDocumentation = FindDocumentation(methodDecl);
  3980. methodDecl->mMixinSpecifier = tokenNode;
  3981. auto nameNode = ExpectIdentifierAfter(methodDecl);
  3982. if (nameNode != NULL)
  3983. {
  3984. MEMBER_SET(methodDecl, mNameNode, nameNode);
  3985. ParseMethod(methodDecl, &params, &commas, true);
  3986. }
  3987. auto localMethodDecl = mAlloc->Alloc<BfLocalMethodDeclaration>();
  3988. ReplaceNode(methodDecl, localMethodDecl);
  3989. localMethodDecl->mMethodDeclaration = methodDecl;
  3990. return localMethodDecl;
  3991. }
  3992. else if (token == BfToken_LBracket)
  3993. {
  3994. return CreateAttributedStatement(tokenNode, createStmtFlags);
  3995. }
  3996. }
  3997. if (auto identifier = BfNodeDynCast<BfIdentifierNode>(node))
  3998. {
  3999. node = CompactQualifiedName(identifier);
  4000. }
  4001. bool isLocalVariable = false;
  4002. auto nextNode = mVisitorPos.GetNext();
  4003. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  4004. {
  4005. if (nextToken->GetToken() == BfToken_Colon)
  4006. {
  4007. auto nameIdentifier = BfNodeDynCast<BfIdentifierNode>(node);
  4008. if (nameIdentifier != NULL)
  4009. {
  4010. BfLabelNode* labelNode = mAlloc->Alloc<BfLabelNode>();
  4011. ReplaceNode(nameIdentifier, labelNode);
  4012. labelNode->mLabel = nameIdentifier;
  4013. mVisitorPos.MoveNext();
  4014. MEMBER_SET(labelNode, mColonToken, nextToken);
  4015. BfAstNode* stmt = NULL;
  4016. auto nextNode = mVisitorPos.GetNext();
  4017. if (nextNode != NULL)
  4018. {
  4019. mVisitorPos.MoveNext();
  4020. stmt = DoCreateStatement(nextNode);
  4021. if (auto labelableStmt = BfNodeDynCast<BfLabelableStatement>(stmt))
  4022. {
  4023. MEMBER_SET(labelableStmt, mLabelNode, labelNode);
  4024. return labelableStmt;
  4025. }
  4026. if (auto block = BfNodeDynCast<BfBlock>(stmt))
  4027. {
  4028. auto labeledBlock = mAlloc->Alloc<BfLabeledBlock>();
  4029. ReplaceNode(block, labeledBlock);
  4030. labeledBlock->mBlock = block;
  4031. MEMBER_SET(labeledBlock, mLabelNode, labelNode);
  4032. return labeledBlock;
  4033. }
  4034. }
  4035. Fail("Label must appear before a labelable statement (if, for, do, while, switch, block)", labelNode);
  4036. AddErrorNode(labelNode);
  4037. return stmt;
  4038. }
  4039. }
  4040. }
  4041. int typeRefEndNode = -1;
  4042. bool isTuple = false;
  4043. if (IsTypeReference(node, BfToken_None, -1, &typeRefEndNode, NULL, NULL, &isTuple))
  4044. isLocalVariable = true;
  4045. if ((isLocalVariable) && (isTuple))
  4046. {
  4047. if (typeRefEndNode != -1)
  4048. {
  4049. // When we're typing something like "(a, )" ... don't make that a type ref yet because it could be "(a, b) = " where
  4050. // we're typing a tuple value rather than a tuple tpye ref
  4051. auto checkNode = mVisitorPos.Get(typeRefEndNode);
  4052. if (checkNode == NULL)
  4053. isLocalVariable = false;
  4054. }
  4055. }
  4056. if (nextNode == NULL)
  4057. {
  4058. // Treat ending identifier as just an identifier (could be block result)
  4059. isLocalVariable = false;
  4060. }
  4061. if ((isLocalVariable) && (typeRefEndNode != -1) && (continuingVariable == NULL) && ((createStmtFlags & CreateStmtFlags_AllowLocalFunction) != 0))
  4062. {
  4063. BfTokenNode* nextToken = BfNodeDynCast<BfTokenNode>(node);
  4064. if ((nextToken == NULL) ||
  4065. ((nextToken->GetToken() != BfToken_Delegate) && (nextToken->GetToken() != BfToken_Function)))
  4066. {
  4067. auto afterTypeRefNode = mVisitorPos.Get(typeRefEndNode);
  4068. if (auto nameIdentifier = BfNodeDynCast<BfIdentifierNode>(afterTypeRefNode))
  4069. {
  4070. auto nextNextNode = mVisitorPos.Get(typeRefEndNode + 1);
  4071. if (auto afterNameToken = BfNodeDynCast<BfTokenNode>(nextNextNode))
  4072. {
  4073. bool isLocalMethod = (afterNameToken->GetToken() == BfToken_LParen) || (afterNameToken->GetToken() == BfToken_LChevron);
  4074. if (isLocalMethod)
  4075. {
  4076. int prevReadPos = mVisitorPos.mReadPos;
  4077. mVisitorPos.mReadPos = typeRefEndNode;
  4078. isLocalMethod = IsLocalMethod(nameIdentifier);
  4079. mVisitorPos.mReadPos = prevReadPos;
  4080. }
  4081. if (isLocalMethod)
  4082. {
  4083. auto typeRef = CreateTypeRef(node);
  4084. if (mVisitorPos.GetNext() != nameIdentifier)
  4085. isLocalMethod = false;
  4086. else
  4087. {
  4088. int prevReadPos = mVisitorPos.mReadPos;
  4089. mVisitorPos.MoveNext();
  4090. isLocalMethod = IsLocalMethod(nameIdentifier);
  4091. if (!isLocalMethod)
  4092. mVisitorPos.mReadPos = prevReadPos;
  4093. }
  4094. if (!isLocalMethod)
  4095. {
  4096. // TypeRef didn't match what we expected, just set it up as a variable declaration
  4097. auto variableDeclaration = mAlloc->Alloc<BfVariableDeclaration>();
  4098. ReplaceNode(typeRef, variableDeclaration);
  4099. variableDeclaration->mTypeRef = typeRef;
  4100. return variableDeclaration;
  4101. }
  4102. auto methodDecl = mAlloc->Alloc<BfMethodDeclaration>();
  4103. ReplaceNode(typeRef, methodDecl);
  4104. methodDecl->mDocumentation = FindDocumentation(methodDecl);
  4105. methodDecl->mReturnType = typeRef;
  4106. CheckMultiuseAttributeTypeRef(methodDecl->mReturnType);
  4107. BfDeferredAstSizedArray<BfParameterDeclaration*> params(methodDecl->mParams, mAlloc);
  4108. BfDeferredAstSizedArray<BfTokenNode*> commas(methodDecl->mCommas, mAlloc);
  4109. MEMBER_SET(methodDecl, mNameNode, nameIdentifier);
  4110. if (afterNameToken->GetToken() == BfToken_LChevron)
  4111. {
  4112. auto genericParams = CreateGenericParamsDeclaration(afterNameToken);
  4113. if (genericParams != NULL)
  4114. {
  4115. MEMBER_SET(methodDecl, mGenericParams, genericParams);
  4116. }
  4117. }
  4118. ParseMethod(methodDecl, &params, &commas, true);
  4119. auto localMethodDecl = mAlloc->Alloc<BfLocalMethodDeclaration>();
  4120. ReplaceNode(methodDecl, localMethodDecl);
  4121. localMethodDecl->mMethodDeclaration = methodDecl;
  4122. return localMethodDecl;
  4123. }
  4124. }
  4125. }
  4126. else if (afterTypeRefNode == NULL)
  4127. isLocalVariable = false;
  4128. else if (auto tokenNode = BfNodeDynCast<BfTokenNode>(afterTypeRefNode))
  4129. {
  4130. if (tokenNode->mToken != BfToken_LParen)
  4131. isLocalVariable = false; // May be tuple
  4132. }
  4133. }
  4134. }
  4135. if ((isLocalVariable) || (continuingVariable != NULL))
  4136. {
  4137. auto variableDeclaration = mAlloc->Alloc<BfVariableDeclaration>();
  4138. BfTypeReference* typeRef = NULL;
  4139. if (continuingVariable != NULL)
  4140. {
  4141. typeRef = continuingVariable->mTypeRef;
  4142. variableDeclaration->mModSpecifier = continuingVariable->mModSpecifier;
  4143. ReplaceNode(node, variableDeclaration);
  4144. variableDeclaration->mPrecedingComma = (BfTokenNode*)node;
  4145. }
  4146. else
  4147. {
  4148. typeRef = CreateTypeRef(node);
  4149. if (typeRef == NULL)
  4150. return NULL;
  4151. ReplaceNode(typeRef, variableDeclaration);
  4152. }
  4153. variableDeclaration->mTypeRef = typeRef;
  4154. BfAstNode* variableNameNode = NULL;
  4155. nextNode = mVisitorPos.GetNext();
  4156. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  4157. {
  4158. if (tokenNode->GetToken() == BfToken_LParen)
  4159. {
  4160. mVisitorPos.mReadPos++;
  4161. variableNameNode = CreateTupleExpression(tokenNode);
  4162. }
  4163. }
  4164. if (variableNameNode == NULL)
  4165. {
  4166. auto checkToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2));
  4167. if ((checkToken != NULL) && (checkToken->mToken == BfToken_Dot))
  4168. {
  4169. FailAfter("Expected variable name", variableDeclaration);
  4170. }
  4171. else
  4172. variableNameNode = ExpectIdentifierAfter(variableDeclaration, "variable name");
  4173. }
  4174. if (variableNameNode == NULL)
  4175. return variableDeclaration;
  4176. bool isValidFinish = false;
  4177. BfTokenNode* tokenNode;
  4178. if ((tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext())))
  4179. {
  4180. int token = tokenNode->GetToken();
  4181. if ((token == BfToken_AssignEquals) || (token == BfToken_Semicolon) || (token == BfToken_Comma))
  4182. isValidFinish = true;
  4183. }
  4184. /*if (!isValidFinish)
  4185. {
  4186. if (auto nextIdentifier = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext()))
  4187. {
  4188. if (auto nextNextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2)))
  4189. {
  4190. if ((nextNextToken->GetToken() == BfToken_LParen) || (nextNextToken->GetToken() == BfToken_LChevron))
  4191. {
  4192. // It's less destructive to not consume the identifier we see as the name, because it may not be. This handles the case
  4193. // where we're typing some stuff before a local method declaration. Kindof a corner case...
  4194. Fail("Unexpected type", typeRef);
  4195. mVisitorPos.mReadPos--;
  4196. return variableDeclaration;
  4197. }
  4198. }
  4199. }
  4200. }*/
  4201. // Is a local variable?
  4202. tokenNode = ExpectTokenAfter(variableNameNode, BfToken_AssignEquals, BfToken_Semicolon, BfToken_Comma);
  4203. variableDeclaration->mNameNode = variableNameNode;
  4204. MoveNode(variableNameNode, variableDeclaration);
  4205. if (tokenNode == NULL)
  4206. return variableDeclaration;
  4207. if (tokenNode->GetToken() == BfToken_AssignEquals)
  4208. {
  4209. MEMBER_SET(variableDeclaration, mEqualsNode, tokenNode);
  4210. if (variableDeclaration->mInitializer == NULL)
  4211. variableDeclaration->mInitializer = CreateExpressionAfter(variableDeclaration, (CreateExprFlags)(createStmtFlags & CreateStmtFlags_To_CreateExprFlags_Mask));
  4212. if (variableDeclaration->mInitializer == NULL)
  4213. return variableDeclaration;
  4214. MoveNode(variableDeclaration->mInitializer, variableDeclaration);
  4215. }
  4216. else
  4217. mVisitorPos.mReadPos--; // Backtrack to the semicolon or comma
  4218. return variableDeclaration;
  4219. }
  4220. if ((createStmtFlags & CreateStmtFlags_ForceVariableDecl) != 0)
  4221. {
  4222. Fail("Expected local variable declaration", node);
  4223. return NULL;
  4224. }
  4225. // Must be an expression. Always set CreateExprFlags_NoCaseExpr, to keep ending statements in a switch case to look like case expressions
  4226. CreateExprFlags exprFlags = (CreateExprFlags)(createStmtFlags & CreateStmtFlags_To_CreateExprFlags_Mask);
  4227. if ((createStmtFlags & CreateStmtFlags_AllowUnterminatedExpression) == 0)
  4228. exprFlags = (CreateExprFlags)(exprFlags | CreateExprFlags_NoCaseExpr);
  4229. auto expr = CreateExpression(node, exprFlags);
  4230. if (expr == NULL)
  4231. return NULL;
  4232. bool isOkUnary = false;
  4233. if (auto unaryOperatorExpr = BfNodeDynCast<BfUnaryOperatorExpression>(expr))
  4234. {
  4235. isOkUnary =
  4236. (unaryOperatorExpr->mOp == BfUnaryOp_Increment) ||
  4237. (unaryOperatorExpr->mOp == BfUnaryOp_PostIncrement) ||
  4238. (unaryOperatorExpr->mOp == BfUnaryOp_Decrement) ||
  4239. (unaryOperatorExpr->mOp == BfUnaryOp_PostDecrement);
  4240. if (unaryOperatorExpr->mOp == BfUnaryOp_Out)
  4241. {
  4242. unaryOperatorExpr->mOp = BfUnaryOp_Ref;
  4243. Fail("Cannot use 'out' in this context", unaryOperatorExpr);
  4244. }
  4245. }
  4246. if ((!mPrevStmtHadError) && (!mStmtHasError))
  4247. {
  4248. nextNode = mVisitorPos.GetNext();
  4249. if (nextNode != NULL)
  4250. {
  4251. if (!isOkUnary)
  4252. expr->VerifyIsStatement(mPassInstance);
  4253. }
  4254. }
  4255. return expr;
  4256. }
  4257. // This is conservative - it doesn't HAVE to return true, but in some cases may cause a parsing error if the nodes
  4258. // can be consumed as a statement rather than an expression. We must be more careful about not returning 'true'
  4259. // for something that can only be interpreted as a statement, however.
  4260. bool BfReducer::IsTerminatingExpression(BfAstNode* node)
  4261. {
  4262. int parenDepth = 0;
  4263. int chevronDepth = 0;
  4264. int readIdx = mVisitorPos.mReadPos;
  4265. bool prevWasValue = false;
  4266. BfTokenNode* prevTokenNode = NULL;
  4267. while (true)
  4268. {
  4269. auto node = mVisitorPos.Get(readIdx);
  4270. if (node == NULL)
  4271. break;
  4272. auto tokenNode = BfNodeDynCast<BfTokenNode>(node);
  4273. if (tokenNode != NULL)
  4274. {
  4275. switch (tokenNode->GetToken())
  4276. {
  4277. case BfToken_AssignEquals:
  4278. if (parenDepth == 0)
  4279. return false;
  4280. break;
  4281. case BfToken_LParen:
  4282. chevronDepth = 0;
  4283. parenDepth++;
  4284. break;
  4285. case BfToken_RParen:
  4286. chevronDepth = 0;
  4287. parenDepth--;
  4288. break;
  4289. case BfToken_LChevron:
  4290. chevronDepth++;
  4291. break;
  4292. case BfToken_RChevron:
  4293. // If we find a < and > that are not separated by parens, that's a generic, which must be a
  4294. // variable decl if it's not in parens
  4295. if ((parenDepth == 0) && (chevronDepth > 0))
  4296. return false;
  4297. chevronDepth--;
  4298. break;
  4299. case BfToken_RDblChevron:
  4300. chevronDepth--;
  4301. break;
  4302. case BfToken_Comma:
  4303. if (parenDepth == 0)
  4304. return false;
  4305. break;
  4306. case BfToken_As:
  4307. case BfToken_AllocType:
  4308. case BfToken_Append:
  4309. case BfToken_Default:
  4310. case BfToken_Is:
  4311. case BfToken_Scope:
  4312. case BfToken_New:
  4313. case BfToken_RetType:
  4314. case BfToken_Nullable:
  4315. case BfToken_SizeOf:
  4316. case BfToken_This:
  4317. case BfToken_TypeOf:
  4318. case BfToken_LessEquals:
  4319. case BfToken_GreaterEquals:
  4320. case BfToken_LBracket:
  4321. case BfToken_RBracket:
  4322. case BfToken_Colon:
  4323. case BfToken_Dot:
  4324. case BfToken_DotDot:
  4325. case BfToken_QuestionDot:
  4326. case BfToken_QuestionLBracket:
  4327. case BfToken_Plus:
  4328. case BfToken_Minus:
  4329. case BfToken_DblPlus:
  4330. case BfToken_DblMinus:
  4331. case BfToken_Star:
  4332. case BfToken_ForwardSlash:
  4333. case BfToken_Modulus:
  4334. case BfToken_Ampersand:
  4335. case BfToken_At:
  4336. case BfToken_DblAmpersand:
  4337. case BfToken_Bar:
  4338. case BfToken_DblBar:
  4339. case BfToken_Bang:
  4340. case BfToken_Carat:
  4341. case BfToken_Tilde:
  4342. case BfToken_Question:
  4343. case BfToken_DblQuestion:
  4344. case BfToken_Arrow:
  4345. case BfToken_FatArrow:
  4346. // Allow these
  4347. break;
  4348. case BfToken_Semicolon:
  4349. return false;
  4350. default:
  4351. // Disallow everything else
  4352. return false;
  4353. }
  4354. }
  4355. if ((node->IsExact<BfIdentifierNode>()) ||
  4356. (node->IsExact<BfQualifiedNameNode>()) ||
  4357. (node->IsExact<BfMemberReferenceExpression>()) ||
  4358. (node->IsExact<BfLiteralExpression>()))
  4359. {
  4360. if (prevWasValue)
  4361. {
  4362. // Two values in a row cannot be a valid expression
  4363. return false;
  4364. }
  4365. prevWasValue = true;
  4366. }
  4367. else
  4368. {
  4369. prevWasValue = false;
  4370. }
  4371. if (auto block = BfNodeDynCastExact<BfBlock>(node))
  4372. {
  4373. // Local method decl
  4374. if ((parenDepth == 0) && (prevTokenNode != NULL) && (prevTokenNode->GetToken() == BfToken_RParen))
  4375. return false;
  4376. }
  4377. prevTokenNode = tokenNode;
  4378. readIdx++;
  4379. }
  4380. int outEndNode = 0;
  4381. bool couldBeExpr = false;
  4382. if (IsTypeReference(node, BfToken_None, -1, &outEndNode, &couldBeExpr))
  4383. {
  4384. if (outEndNode == mVisitorPos.mTotalSize - 1)
  4385. {
  4386. if (auto name = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.Get(outEndNode)))
  4387. {
  4388. auto beforeNameToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(outEndNode - 1));
  4389. // We treat "a*b" as a multiply rather than a variable declaration
  4390. if ((beforeNameToken == NULL) || (beforeNameToken->GetToken() != BfToken_Star))
  4391. {
  4392. return false;
  4393. }
  4394. }
  4395. }
  4396. }
  4397. return true;
  4398. }
  4399. BfAstNode* BfReducer::CreateStatement(BfAstNode* node, CreateStmtFlags createStmtFlags)
  4400. {
  4401. if (!AssertCurrentNode(node))
  4402. return NULL;
  4403. if ((createStmtFlags & CreateStmtFlags_CheckStack) != 0)
  4404. {
  4405. BP_ZONE("CreateStatement.CheckStack");
  4406. StackHelper stackHelper;
  4407. if (!stackHelper.CanStackExpand(64 * 1024))
  4408. {
  4409. BfAstNode* result = NULL;
  4410. if (!stackHelper.Execute([&]()
  4411. {
  4412. result = CreateStatement(node, createStmtFlags);
  4413. }))
  4414. {
  4415. Fail("Statement too complex to parse", node);
  4416. }
  4417. return result;
  4418. }
  4419. }
  4420. if ((createStmtFlags & CreateStmtFlags_AllowUnterminatedExpression) != 0)
  4421. {
  4422. if (IsTerminatingExpression(node))
  4423. {
  4424. mPrevStmtHadError = false;
  4425. // Must be an expression. Always set CreateExprFlags_NoCaseExpr, to keep ending statements in a switch case to look like case expressions
  4426. auto expr = CreateExpression(node, (CreateExprFlags)((createStmtFlags & CreateStmtFlags_To_CreateExprFlags_Mask) | CreateExprFlags_NoCaseExpr));
  4427. if (expr != NULL)
  4428. {
  4429. auto nextNode = mVisitorPos.GetNext();
  4430. if (nextNode != NULL)
  4431. FailAfter("Semicolon expected", expr);
  4432. }
  4433. return expr;
  4434. }
  4435. }
  4436. mStmtHasError = false;
  4437. auto stmtNode = DoCreateStatement(node, createStmtFlags);
  4438. mPrevStmtHadError = mStmtHasError;
  4439. if (stmtNode == NULL)
  4440. return NULL;
  4441. auto origStmtNode = stmtNode;
  4442. if (stmtNode->IsA<BfBlock>())
  4443. return stmtNode;
  4444. auto nextNode = mVisitorPos.GetNext();
  4445. if (auto expr = BfNodeDynCast<BfExpression>(stmtNode))
  4446. {
  4447. if (((createStmtFlags & CreateStmtFlags_AllowUnterminatedExpression) != 0) && (nextNode == NULL))
  4448. return expr;
  4449. auto stmt = mAlloc->Alloc<BfExpressionStatement>();
  4450. ReplaceNode(expr, stmt);
  4451. stmt->mExpression = expr;
  4452. stmtNode = stmt;
  4453. }
  4454. if (auto stmt = BfNodeDynCast<BfStatement>(stmtNode))
  4455. {
  4456. if ((stmt->IsMissingSemicolon()) && ((createStmtFlags & CreateStmtFlags_FindTrailingSemicolon) != 0) && (!stmt->IsA<BfEmptyStatement>()))
  4457. {
  4458. if (!IsSemicolon(nextNode))
  4459. {
  4460. bool doWarn = false;
  4461. // Why did we have this BfIdentifierNode check? It failed to throw an error on just things like "{ a }"
  4462. if (origStmtNode->IsA<BfRepeatStatement>())
  4463. {
  4464. // These do require a semicolon
  4465. doWarn = true;
  4466. }
  4467. else if (/*(origStmtNode->IsA<BfIdentifierNode>()) || */(origStmtNode->IsA<BfCompoundStatement>()) || (origStmtNode->IsA<BfBlock>()))
  4468. return stmt;
  4469. if (origStmtNode->IsA<BfVariableDeclaration>())
  4470. {
  4471. // For compound variables
  4472. auto commaToken = BfNodeDynCast<BfTokenNode>(nextNode);
  4473. if ((commaToken != NULL) && (commaToken->GetToken() == BfToken_Comma))
  4474. return stmt;
  4475. }
  4476. if (((createStmtFlags & CreateStmtFlags_AllowUnterminatedExpression) != 0) && (origStmtNode->IsA<BfExpression>()) && (nextNode == NULL))
  4477. return stmt;
  4478. BfError* error;
  4479. if (doWarn)
  4480. error = mPassInstance->WarnAfterAt(0, "Semicolon expected", node->GetSourceData(), stmt->GetSrcEnd() - 1);
  4481. else
  4482. error = mPassInstance->FailAfterAt("Semicolon expected", node->GetSourceData(), stmt->GetSrcEnd() - 1);
  4483. if ((error != NULL) && (mSource != NULL))
  4484. error->mProject = mSource->mProject;
  4485. mPrevStmtHadError = true;
  4486. return stmt;
  4487. }
  4488. if ((!stmt->IsA<BfBlock>()) && (!stmt->IsA<BfIdentifierNode>()))
  4489. {
  4490. mVisitorPos.MoveNext();
  4491. MEMBER_SET(stmt, mTrailingSemicolon, (BfTokenNode*)nextNode);
  4492. }
  4493. }
  4494. }
  4495. return stmtNode;
  4496. }
  4497. BfAstNode* BfReducer::CreateStatementAfter(BfAstNode* node, CreateStmtFlags createStmtFlags)
  4498. {
  4499. if (!AssertCurrentNode(node))
  4500. return NULL;
  4501. auto nextNode = mVisitorPos.GetNext();
  4502. if (nextNode == NULL)
  4503. {
  4504. FailAfter("Expected statement", node);
  4505. return NULL;
  4506. }
  4507. mVisitorPos.MoveNext();
  4508. BfAstNode* stmt = CreateStatement(nextNode, createStmtFlags);
  4509. if (stmt == NULL)
  4510. {
  4511. // Nope, didn't handle it
  4512. mVisitorPos.mReadPos--;
  4513. }
  4514. return stmt;
  4515. }
  4516. bool BfReducer::IsExtendedTypeName(BfIdentifierNode* identifierNode)
  4517. {
  4518. auto nextNode = mVisitorPos.GetNext();
  4519. if (nextNode == NULL)
  4520. return false;
  4521. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  4522. if (tokenNode == NULL)
  4523. return false;
  4524. int token = tokenNode->GetToken();
  4525. return ((token == BfToken_Star) ||
  4526. (token == BfToken_Question) ||
  4527. (token == BfToken_Dot) ||
  4528. (token == BfToken_LChevron) ||
  4529. (token == BfToken_LBracket));
  4530. }
  4531. static String TypeToString(BfTypeReference* typeRef)
  4532. {
  4533. if (typeRef == NULL)
  4534. return "null";
  4535. if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(typeRef))
  4536. return "(" + TypeToString(qualifiedTypeRef->mLeft) + " . " + TypeToString(qualifiedTypeRef->mRight) + ")";
  4537. if (auto genericTypeInstanceRef = BfNodeDynCast<BfGenericInstanceTypeRef>(typeRef))
  4538. return TypeToString(genericTypeInstanceRef->mElementType) + "<...>";
  4539. return typeRef->ToString();
  4540. }
  4541. BfTypeReference* BfReducer::DoCreateNamedTypeRef(BfIdentifierNode* identifierNode)
  4542. {
  4543. if (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(identifierNode))
  4544. {
  4545. auto qualifiedTypeRef = mAlloc->Alloc<BfQualifiedTypeReference>();
  4546. ReplaceNode(identifierNode, qualifiedTypeRef);
  4547. MoveNode(qualifiedNameNode->mLeft, qualifiedTypeRef);
  4548. auto leftTypeRef = DoCreateNamedTypeRef(qualifiedNameNode->mLeft);
  4549. MEMBER_SET(qualifiedTypeRef, mLeft, leftTypeRef);
  4550. MEMBER_SET(qualifiedTypeRef, mDot, qualifiedNameNode->mDot);
  4551. MoveNode(qualifiedNameNode->mRight, qualifiedNameNode);
  4552. auto rightTypeRef = DoCreateNamedTypeRef(qualifiedNameNode->mRight);
  4553. MEMBER_SET(qualifiedTypeRef, mRight, rightTypeRef);
  4554. return qualifiedTypeRef;
  4555. }
  4556. else
  4557. {
  4558. auto namedTypeRef = mAlloc->Alloc<BfNamedTypeReference>();
  4559. namedTypeRef->mNameNode = identifierNode;
  4560. ReplaceNode(identifierNode, namedTypeRef);
  4561. namedTypeRef->SetTriviaStart(identifierNode->GetTriviaStart());
  4562. return namedTypeRef;
  4563. }
  4564. }
  4565. BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefFlags createTypeRefFlags, int endNode)
  4566. {
  4567. if (!AssertCurrentNode(firstNode))
  4568. return NULL;
  4569. bool parseArrayBracket = (createTypeRefFlags & CreateTypeRefFlags_NoParseArrayBrackets) == 0;
  4570. auto identifierNode = BfNodeDynCast<BfIdentifierNode>(firstNode);
  4571. if (identifierNode == NULL)
  4572. {
  4573. if (auto memberReferenceExpression = BfNodeDynCast<BfMemberReferenceExpression>(firstNode))
  4574. {
  4575. SetAndRestoreValue<bool> prevSkipCurrentNodeAssert(mSkipCurrentNodeAssert, true);
  4576. auto qualifiedTypeRef = mAlloc->Alloc<BfQualifiedTypeReference>();
  4577. ReplaceNode(firstNode, qualifiedTypeRef);
  4578. BF_ASSERT(memberReferenceExpression->mTarget != NULL);
  4579. if (memberReferenceExpression->mTarget != NULL)
  4580. {
  4581. MoveNode(memberReferenceExpression->mTarget, qualifiedTypeRef);
  4582. auto leftTypeRef = DoCreateTypeRef(memberReferenceExpression->mTarget);
  4583. if (leftTypeRef == NULL)
  4584. return NULL;
  4585. MEMBER_SET(qualifiedTypeRef, mLeft, leftTypeRef);
  4586. }
  4587. MEMBER_SET(qualifiedTypeRef, mDot, memberReferenceExpression->mDotToken);
  4588. if (memberReferenceExpression->mDotToken->mToken == BfToken_DotDot)
  4589. Fail("Invalid use of '..' in type reference", memberReferenceExpression->mDotToken);
  4590. if (memberReferenceExpression->mMemberName != NULL)
  4591. {
  4592. MoveNode(memberReferenceExpression->mMemberName, memberReferenceExpression);
  4593. auto rightTypeRef = DoCreateTypeRef(memberReferenceExpression->mMemberName);
  4594. if (rightTypeRef == NULL)
  4595. return NULL;
  4596. MEMBER_SET(qualifiedTypeRef, mRight, rightTypeRef);
  4597. }
  4598. firstNode = qualifiedTypeRef;
  4599. }
  4600. else if (auto typeRef = BfNodeDynCast<BfTypeReference>(firstNode))
  4601. {
  4602. // Already a typeRef
  4603. return typeRef;
  4604. }
  4605. else
  4606. {
  4607. bool isHandled = false;
  4608. auto tokenNode = BfNodeDynCast<BfTokenNode>(firstNode);
  4609. if (tokenNode != NULL)
  4610. {
  4611. BfToken token = tokenNode->GetToken();
  4612. if (token == BfToken_Dot)
  4613. {
  4614. auto dotTypeRef = mAlloc->Alloc<BfDotTypeReference>();
  4615. ReplaceNode(firstNode, dotTypeRef);
  4616. dotTypeRef->mDotToken = tokenNode;
  4617. firstNode = dotTypeRef;
  4618. isHandled = true;
  4619. }
  4620. else if (token == BfToken_DotDotDot)
  4621. {
  4622. auto dotTypeRef = mAlloc->Alloc<BfDotTypeReference>();
  4623. ReplaceNode(firstNode, dotTypeRef);
  4624. dotTypeRef->mDotToken = tokenNode;
  4625. firstNode = dotTypeRef;
  4626. isHandled = true;
  4627. return dotTypeRef;
  4628. }
  4629. else if ((token == BfToken_Star) && (mAllowTypeWildcard))
  4630. {
  4631. auto wildcardTypeRef = mAlloc->Alloc<BfWildcardTypeReference>();
  4632. ReplaceNode(firstNode, wildcardTypeRef);
  4633. wildcardTypeRef->mWildcardToken = tokenNode;
  4634. return wildcardTypeRef;
  4635. }
  4636. else if ((token == BfToken_Var) || (token == BfToken_Let))
  4637. {
  4638. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  4639. {
  4640. if ((nextToken->GetToken() == BfToken_Ref) || (nextToken->GetToken() == BfToken_Mut))
  4641. {
  4642. auto varTypeRef = mAlloc->Alloc<BfVarRefTypeReference>();
  4643. ReplaceNode(firstNode, varTypeRef);
  4644. varTypeRef->mVarToken = tokenNode;
  4645. MEMBER_SET(varTypeRef, mRefToken, nextToken);
  4646. mVisitorPos.MoveNext();
  4647. return varTypeRef;
  4648. }
  4649. }
  4650. if (token == BfToken_Var)
  4651. {
  4652. auto varTypeRef = mAlloc->Alloc<BfVarTypeReference>();
  4653. ReplaceNode(firstNode, varTypeRef);
  4654. varTypeRef->mVarToken = tokenNode;
  4655. return varTypeRef;
  4656. }
  4657. else
  4658. {
  4659. auto letTypeRef = mAlloc->Alloc<BfLetTypeReference>();
  4660. ReplaceNode(firstNode, letTypeRef);
  4661. letTypeRef->mLetToken = tokenNode;
  4662. return letTypeRef;
  4663. }
  4664. }
  4665. else if ((mCompatMode) && (token == BfToken_Minus))
  4666. {
  4667. auto constExpr = CreateExpression(tokenNode, CreateExprFlags_BreakOnRChevron);
  4668. auto constTypeRef = mAlloc->Alloc<BfConstExprTypeRef>();
  4669. ReplaceNode(firstNode, constTypeRef);
  4670. MEMBER_SET_CHECKED(constTypeRef, mConstExpr, constExpr);
  4671. return constTypeRef;
  4672. }
  4673. else if (token == BfToken_Const)
  4674. {
  4675. if (!mCompatMode)
  4676. {
  4677. //Fail("Invalid use of 'const', only fields and local variables can be declared as const", tokenNode);
  4678. //AddErrorNode(tokenNode);
  4679. auto constExpr = CreateExpressionAfter(tokenNode, CreateExprFlags_BreakOnRChevron);
  4680. auto constTypeRef = mAlloc->Alloc<BfConstExprTypeRef>();
  4681. ReplaceNode(firstNode, constTypeRef);
  4682. MEMBER_SET(constTypeRef, mConstToken, tokenNode);
  4683. MEMBER_SET_CHECKED(constTypeRef, mConstExpr, constExpr);
  4684. return constTypeRef;
  4685. }
  4686. else
  4687. {
  4688. auto elementType = CreateTypeRefAfter(tokenNode, createTypeRefFlags);
  4689. auto constTypeRef = mAlloc->Alloc<BfConstTypeRef>();
  4690. ReplaceNode(firstNode, constTypeRef);
  4691. MEMBER_SET(constTypeRef, mConstToken, tokenNode);
  4692. MEMBER_SET_CHECKED(constTypeRef, mElementType, elementType);
  4693. return constTypeRef;
  4694. }
  4695. }
  4696. else if (token == BfToken_Unsigned)
  4697. {
  4698. BF_ASSERT(mCompatMode);
  4699. auto elementType = CreateTypeRefAfter(tokenNode, createTypeRefFlags);
  4700. BfTypeReference* rootElementParent = NULL;
  4701. auto rootElement = elementType;
  4702. while (auto elementedType = BfNodeDynCast<BfElementedTypeRef>(rootElement))
  4703. {
  4704. rootElementParent = rootElement;
  4705. rootElement = elementedType->mElementType;
  4706. }
  4707. auto unsignedTypeRef = mAlloc->Alloc<BfUnsignedTypeRef>();
  4708. ReplaceNode(firstNode, unsignedTypeRef);
  4709. MEMBER_SET(unsignedTypeRef, mUnsignedToken, tokenNode);
  4710. if (rootElement == elementType)
  4711. {
  4712. MEMBER_SET_CHECKED(unsignedTypeRef, mElementType, elementType);
  4713. return unsignedTypeRef;
  4714. }
  4715. else
  4716. {
  4717. #ifdef BF_AST_HAS_PARENT_MEMBER
  4718. BF_ASSERT(rootElementParent == rootElement->mParent);
  4719. #endif
  4720. auto elementedType = BfNodeDynCast<BfElementedTypeRef>(rootElementParent);
  4721. MEMBER_SET_CHECKED(unsignedTypeRef, mElementType, rootElement);
  4722. MEMBER_SET_CHECKED(elementedType, mElementType, unsignedTypeRef);
  4723. elementType->SetSrcStart(unsignedTypeRef->GetSrcStart());
  4724. return elementType;
  4725. }
  4726. }
  4727. else if ((token == BfToken_AllocType) || (token == BfToken_Nullable) || (token == BfToken_RetType))
  4728. {
  4729. auto retTypeTypeRef = mAlloc->Alloc<BfModifiedTypeRef>();
  4730. ReplaceNode(firstNode, retTypeTypeRef);
  4731. MEMBER_SET(retTypeTypeRef, mRetTypeToken, tokenNode);
  4732. tokenNode = ExpectTokenAfter(retTypeTypeRef, BfToken_LParen);
  4733. MEMBER_SET_CHECKED(retTypeTypeRef, mOpenParen, tokenNode);
  4734. auto elementType = CreateTypeRefAfter(retTypeTypeRef, createTypeRefFlags);
  4735. MEMBER_SET_CHECKED(retTypeTypeRef, mElementType, elementType);
  4736. tokenNode = ExpectTokenAfter(retTypeTypeRef, BfToken_RParen);
  4737. MEMBER_SET_CHECKED(retTypeTypeRef, mCloseParen, tokenNode);
  4738. return retTypeTypeRef;
  4739. }
  4740. else if ((token == BfToken_Delegate) || (token == BfToken_Function))
  4741. {
  4742. auto delegateTypeRef = mAlloc->Alloc<BfDelegateTypeRef>();
  4743. ReplaceNode(firstNode, delegateTypeRef);
  4744. MEMBER_SET(delegateTypeRef, mTypeToken, tokenNode);
  4745. auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  4746. if ((nextToken != NULL) && (nextToken->mToken == BfToken_LBracket))
  4747. {
  4748. mVisitorPos.MoveNext();
  4749. auto attribs = CreateAttributeDirective(nextToken);
  4750. MEMBER_SET_CHECKED(delegateTypeRef, mAttributes, attribs);
  4751. }
  4752. auto returnType = CreateTypeRefAfter(delegateTypeRef);
  4753. MEMBER_SET_CHECKED(delegateTypeRef, mReturnType, returnType);
  4754. tokenNode = ExpectTokenAfter(delegateTypeRef, BfToken_LParen);
  4755. MEMBER_SET_CHECKED(delegateTypeRef, mOpenParen, tokenNode);
  4756. BfDeferredAstSizedArray<BfParameterDeclaration*> params(delegateTypeRef->mParams, mAlloc);
  4757. BfDeferredAstSizedArray<BfTokenNode*> commas(delegateTypeRef->mCommas, mAlloc);
  4758. auto closeNode = ParseMethodParams(delegateTypeRef, &params, &commas, BfToken_RParen, false);
  4759. if (closeNode == NULL)
  4760. {
  4761. if (!params.empty())
  4762. delegateTypeRef->AdjustSrcEnd(params.back());
  4763. if (!commas.empty())
  4764. delegateTypeRef->AdjustSrcEnd(commas.back());
  4765. }
  4766. MEMBER_SET_CHECKED(delegateTypeRef, mCloseParen, closeNode);
  4767. mVisitorPos.MoveNext();
  4768. for (auto paramDecl : params)
  4769. {
  4770. if ((paramDecl != NULL) && (paramDecl->mEqualsNode != NULL))
  4771. Fail(StrFormat("Initializers cannot be used in anonymous %s type references. Consider creating a named %s type.", BfTokenToString(token), BfTokenToString(token)), paramDecl->mEqualsNode);
  4772. }
  4773. isHandled = true;
  4774. firstNode = delegateTypeRef;
  4775. if ((createTypeRefFlags & CreateTypeRefFlags_EarlyExit) != 0)
  4776. return delegateTypeRef;
  4777. }
  4778. else if ((BfTokenIsTypeDecl(token)) || (token == BfToken_LBracket))
  4779. {
  4780. BfAttributeDirective* attributes = NULL;
  4781. if (token == BfToken_LBracket)
  4782. {
  4783. attributes = CreateAttributeDirective(tokenNode);
  4784. if (attributes == NULL)
  4785. return NULL;
  4786. mVisitorPos.MoveNext();
  4787. bool isValid = false;
  4788. auto nextNode = mVisitorPos.GetCurrent();
  4789. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  4790. if (tokenNode != NULL)
  4791. {
  4792. token = tokenNode->mToken;
  4793. if (BfTokenIsTypeDecl(token))
  4794. isValid = true;
  4795. }
  4796. if (!isValid)
  4797. {
  4798. AddErrorNode(attributes);
  4799. return NULL;
  4800. }
  4801. }
  4802. bool attribsApply = false;
  4803. if ((mTypeMemberNodeStart != NULL) && (mTypeMemberNodeStart->mSrcEnd == tokenNode->mTriviaStart))
  4804. attribsApply = true;
  4805. auto typeDeclNode = CreateTopLevelObject(tokenNode, attributes, attribsApply ? mTypeMemberNodeStart : NULL, true);
  4806. if (typeDeclNode == NULL)
  4807. {
  4808. if (attributes != NULL)
  4809. AddErrorNode(attributes);
  4810. return NULL;
  4811. }
  4812. auto typeDecl = BfNodeDynCast<BfTypeDeclaration>(typeDeclNode);
  4813. if (typeDecl == NULL)
  4814. {
  4815. if (attributes != NULL)
  4816. AddErrorNode(attributes);
  4817. AddErrorNode(typeDeclNode);
  4818. return NULL;
  4819. }
  4820. InitAnonymousType(typeDecl);
  4821. auto typeRef = mAlloc->Alloc<BfInlineTypeReference>();
  4822. ReplaceNode(typeDecl, typeRef);
  4823. typeRef->mTypeDeclaration = typeDecl;
  4824. return typeRef;
  4825. }
  4826. else if ((token == BfToken_Comptype) || (token == BfToken_Decltype))
  4827. {
  4828. auto declTypeRef = mAlloc->Alloc<BfExprModTypeRef>();
  4829. ReplaceNode(tokenNode, declTypeRef);
  4830. declTypeRef->mToken = tokenNode;
  4831. tokenNode = ExpectTokenAfter(declTypeRef, BfToken_LParen);
  4832. MEMBER_SET_CHECKED(declTypeRef, mOpenParen, tokenNode);
  4833. auto targetExpr = CreateExpressionAfter(declTypeRef);
  4834. MEMBER_SET_CHECKED(declTypeRef, mTarget, targetExpr);
  4835. tokenNode = ExpectTokenAfter(declTypeRef, BfToken_RParen);
  4836. MEMBER_SET_CHECKED(declTypeRef, mCloseParen, tokenNode);
  4837. isHandled = true;
  4838. firstNode = declTypeRef;
  4839. if ((createTypeRefFlags & CreateTypeRefFlags_EarlyExit) != 0)
  4840. return declTypeRef;
  4841. }
  4842. else if (token == BfToken_LParen)
  4843. {
  4844. auto tupleTypeRef = mAlloc->Alloc<BfTupleTypeRef>();
  4845. BfDeferredAstSizedArray<BfTypeReference*> fieldTypes(tupleTypeRef->mFieldTypes, mAlloc);
  4846. BfDeferredAstSizedArray<BfIdentifierNode*> fieldNames(tupleTypeRef->mFieldNames, mAlloc);
  4847. BfDeferredAstSizedArray<BfAstNode*> commas(tupleTypeRef->mCommas, mAlloc);
  4848. ReplaceNode(firstNode, tupleTypeRef);
  4849. tupleTypeRef->mOpenParen = tokenNode;
  4850. while (true)
  4851. {
  4852. auto tupleFieldType = CreateTypeRefAfter(tupleTypeRef);
  4853. if (tupleFieldType == NULL)
  4854. return tupleTypeRef;
  4855. fieldTypes.push_back(tupleFieldType);
  4856. MoveNode(tupleFieldType, tupleTypeRef);
  4857. auto nextNode = mVisitorPos.GetNext();
  4858. if (auto identifierNode = BfNodeDynCast<BfIdentifierNode>(nextNode))
  4859. {
  4860. while (fieldNames.size() < fieldTypes.size() - 1)
  4861. fieldNames.push_back(NULL);
  4862. MoveNode(identifierNode, tupleTypeRef);
  4863. fieldNames.push_back(identifierNode);
  4864. mVisitorPos.MoveNext();
  4865. }
  4866. auto tokenNode = ExpectTokenAfter(tupleTypeRef, BfToken_Comma, BfToken_RParen);
  4867. if (tokenNode == NULL)
  4868. return tupleTypeRef;
  4869. if (tokenNode->GetToken() == BfToken_RParen)
  4870. {
  4871. if ((fieldTypes.size() == 1) && ((createTypeRefFlags & CreateTypeRefFlags_AllowSingleMemberTuple) == 0))
  4872. {
  4873. Fail("Tuple types must contain more than one member", tokenNode);
  4874. }
  4875. MEMBER_SET(tupleTypeRef, mCloseParen, tokenNode);
  4876. //return tupleTypeRef;
  4877. firstNode = tupleTypeRef;
  4878. isHandled = true;
  4879. break;
  4880. }
  4881. MoveNode(tokenNode, tupleTypeRef);
  4882. commas.push_back(tokenNode);
  4883. }
  4884. }
  4885. }
  4886. else if (mCompatMode)
  4887. {
  4888. if (auto literalExpr = BfNodeDynCast<BfLiteralExpression>(firstNode))
  4889. {
  4890. auto constExpr = CreateExpression(literalExpr, CreateExprFlags_BreakOnRChevron);
  4891. auto constTypeRef = mAlloc->Alloc<BfConstExprTypeRef>();
  4892. ReplaceNode(firstNode, constTypeRef);
  4893. MEMBER_SET_CHECKED(constTypeRef, mConstExpr, constExpr);
  4894. return constTypeRef;
  4895. }
  4896. }
  4897. if (!isHandled)
  4898. {
  4899. Fail("Expected type", firstNode);
  4900. return NULL;
  4901. }
  4902. }
  4903. }
  4904. BfTypeReference* typeRef = BfNodeDynCast<BfTypeReference>(firstNode);
  4905. if (typeRef == NULL)
  4906. {
  4907. // if (identifierNode->Equals("tag"))
  4908. // {
  4909. // auto rightIdentifer = ExpectIdentifierAfter(identifierNode);
  4910. // if (rightIdentifer != NULL)
  4911. // {
  4912. // auto tagTypeRef = mAlloc->Alloc<BfTagTypeRef>();
  4913. // ReplaceNode(identifierNode, tagTypeRef);
  4914. // tagTypeRef->mTagNode = identifierNode;
  4915. // MEMBER_SET(tagTypeRef, mNameNode, rightIdentifer);
  4916. // return tagTypeRef;
  4917. // }
  4918. // }
  4919. typeRef = DoCreateNamedTypeRef(identifierNode);
  4920. }
  4921. while (true)
  4922. {
  4923. if ((endNode != -1) && (mVisitorPos.mReadPos + 1 >= endNode))
  4924. break;
  4925. auto nextNode = mVisitorPos.GetNext();
  4926. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  4927. if (tokenNode != NULL)
  4928. {
  4929. BfToken token = tokenNode->GetToken();
  4930. if (token == BfToken_Dot)
  4931. {
  4932. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2)))
  4933. {
  4934. if (nextToken->mToken == BfToken_This)
  4935. {
  4936. // Don't encode '.this' in type ref
  4937. break;
  4938. }
  4939. }
  4940. BfQualifiedTypeReference* qualifiedTypeRef = mAlloc->Alloc<BfQualifiedTypeReference>();
  4941. ReplaceNode(typeRef, qualifiedTypeRef);
  4942. qualifiedTypeRef->mLeft = typeRef;
  4943. MEMBER_SET(qualifiedTypeRef, mDot, tokenNode);
  4944. mVisitorPos.MoveNext();
  4945. while (true)
  4946. {
  4947. bool handled = false;
  4948. if (mAllowTypeWildcard)
  4949. {
  4950. auto nextNode = mVisitorPos.GetNext();
  4951. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  4952. {
  4953. if (nextTokenNode->mToken == BfToken_Star)
  4954. {
  4955. auto wildcardTypeRef = mAlloc->Alloc<BfWildcardTypeReference>();
  4956. ReplaceNode(nextTokenNode, wildcardTypeRef);
  4957. wildcardTypeRef->mWildcardToken = nextTokenNode;
  4958. typeRef = wildcardTypeRef;
  4959. handled = true;
  4960. mVisitorPos.MoveNext();
  4961. }
  4962. }
  4963. }
  4964. if (!handled)
  4965. {
  4966. auto rightIdentifer = ExpectIdentifierAfter(qualifiedTypeRef);
  4967. if (rightIdentifer == NULL)
  4968. return qualifiedTypeRef;
  4969. auto namedTypeRef = mAlloc->Alloc<BfNamedTypeReference>();
  4970. namedTypeRef->mNameNode = rightIdentifer;
  4971. ReplaceNode(rightIdentifer, namedTypeRef);
  4972. namedTypeRef->SetTriviaStart(rightIdentifer->GetTriviaStart());
  4973. typeRef = namedTypeRef;
  4974. }
  4975. MEMBER_SET(qualifiedTypeRef, mRight, typeRef);
  4976. nextNode = mVisitorPos.GetNext();
  4977. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  4978. {
  4979. if (tokenNode->GetToken() == BfToken_Dot)
  4980. {
  4981. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2)))
  4982. {
  4983. if (nextToken->mToken == BfToken_This)
  4984. {
  4985. // Don't encode '.this' in type ref
  4986. break;
  4987. }
  4988. }
  4989. BfQualifiedTypeReference* outerQualifiedTypeRef = mAlloc->Alloc<BfQualifiedTypeReference>();
  4990. ReplaceNode(qualifiedTypeRef, outerQualifiedTypeRef);
  4991. outerQualifiedTypeRef->mLeft = qualifiedTypeRef;
  4992. MEMBER_SET(outerQualifiedTypeRef, mDot, tokenNode);
  4993. qualifiedTypeRef = outerQualifiedTypeRef;
  4994. mVisitorPos.MoveNext();
  4995. }
  4996. else
  4997. break;
  4998. }
  4999. else
  5000. {
  5001. break;
  5002. }
  5003. }
  5004. typeRef = qualifiedTypeRef;
  5005. }
  5006. else if (token == BfToken_Star)
  5007. {
  5008. auto ptrType = mAlloc->Alloc<BfPointerTypeRef>();
  5009. ReplaceNode(typeRef, ptrType);
  5010. ptrType->mElementType = typeRef;
  5011. MEMBER_SET(ptrType, mStarNode, tokenNode);
  5012. typeRef = ptrType;
  5013. mVisitorPos.MoveNext();
  5014. }
  5015. else if ((token == BfToken_Question) || (token == BfToken_QuestionLBracket))
  5016. {
  5017. if (token == BfToken_QuestionLBracket)
  5018. tokenNode = BreakQuestionLBracket(tokenNode);
  5019. else
  5020. mVisitorPos.MoveNext();
  5021. auto nullableType = mAlloc->Alloc<BfNullableTypeRef>();
  5022. ReplaceNode(typeRef, nullableType);
  5023. nullableType->mElementType = typeRef;
  5024. MEMBER_SET(nullableType, mQuestionToken, tokenNode);
  5025. typeRef = nullableType;
  5026. }
  5027. else if (token == BfToken_LBracket)
  5028. {
  5029. if (!parseArrayBracket)
  5030. return typeRef;
  5031. auto arrayType = mAlloc->Alloc<BfArrayTypeRef>();
  5032. auto newArrayType = arrayType;
  5033. ReplaceNode(typeRef, arrayType);
  5034. arrayType->mOpenBracket = tokenNode;
  5035. MoveNode(tokenNode, arrayType);
  5036. arrayType->mDimensions = 1;
  5037. arrayType->mElementType = typeRef;
  5038. mVisitorPos.MoveNext();
  5039. while (true)
  5040. {
  5041. auto prevArrayType = BfNodeDynCast<BfArrayTypeRef>(arrayType->mElementType);
  5042. if (prevArrayType == NULL)
  5043. break;
  5044. std::swap(prevArrayType->mOpenBracket, arrayType->mOpenBracket);
  5045. std::swap(prevArrayType->mParams, arrayType->mParams);
  5046. std::swap(prevArrayType->mCloseBracket, arrayType->mCloseBracket);
  5047. std::swap(prevArrayType->mDimensions, arrayType->mDimensions);
  5048. prevArrayType->SetSrcEnd(arrayType->GetSrcEnd());
  5049. arrayType = prevArrayType;
  5050. }
  5051. BF_ASSERT(arrayType->mParams.mVals == NULL);
  5052. arrayType->mParams.mSize = 0;
  5053. BfDeferredAstSizedArray<BfAstNode*> params(arrayType->mParams, mAlloc);
  5054. bool hasFailed = false;
  5055. bool isSized = false;
  5056. while (true)
  5057. {
  5058. nextNode = mVisitorPos.GetNext();
  5059. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  5060. if (tokenNode != NULL)
  5061. {
  5062. if (tokenNode->GetToken() == BfToken_Comma)
  5063. {
  5064. MoveNode(tokenNode, arrayType);
  5065. mVisitorPos.MoveNext();
  5066. arrayType->mDimensions++;
  5067. params.push_back(tokenNode);
  5068. }
  5069. else if (tokenNode->GetToken() == BfToken_RBracket)
  5070. {
  5071. MoveNode(tokenNode, arrayType);
  5072. mVisitorPos.MoveNext();
  5073. arrayType->mCloseBracket = tokenNode;
  5074. break;
  5075. }
  5076. else
  5077. tokenNode = NULL;
  5078. }
  5079. if (tokenNode == NULL)
  5080. {
  5081. if ((!params.IsEmpty()) && (!BfNodeIsExact<BfTokenNode>(params.back())))
  5082. {
  5083. FailAfter("Expected ','", params.back());
  5084. hasFailed = true;
  5085. break;
  5086. }
  5087. BfExpression* sizeExpr = CreateExpressionAfter(arrayType);
  5088. if (sizeExpr == NULL)
  5089. {
  5090. hasFailed = true;
  5091. break;
  5092. }
  5093. MoveNode(sizeExpr, arrayType);
  5094. params.push_back(sizeExpr);
  5095. }
  5096. }
  5097. newArrayType->SetSrcEnd(arrayType->GetSrcEnd());
  5098. if (hasFailed)
  5099. return newArrayType;
  5100. typeRef = newArrayType;
  5101. }
  5102. else if (token == BfToken_LChevron)
  5103. {
  5104. if (auto elementGeneric = BfNodeDynCastExact<BfGenericInstanceTypeRef>(typeRef))
  5105. {
  5106. // Already a generic
  5107. return typeRef;
  5108. }
  5109. auto genericInstance = mAlloc->Alloc<BfGenericInstanceTypeRef>();
  5110. BfDeferredSizedArray<BfAstNode*> genericArguments(genericInstance->mGenericArguments, mAlloc);
  5111. BfDeferredAstSizedArray<BfAstNode*> commas(genericInstance->mCommas, mAlloc);
  5112. ReplaceNode(typeRef, genericInstance);
  5113. genericInstance->mOpenChevron = tokenNode;
  5114. MoveNode(tokenNode, genericInstance);
  5115. genericInstance->mElementType = typeRef;
  5116. mVisitorPos.MoveNext();
  5117. bool isBoundName = false;
  5118. bool isUnboundName = false;
  5119. while (true)
  5120. {
  5121. auto nextNode = mVisitorPos.GetNext();
  5122. auto genericIdentifier = BfNodeDynCast<BfIdentifierNode>(nextNode);
  5123. bool doAddType = genericIdentifier != NULL;
  5124. bool addAsExpr = false;
  5125. if (BfNodeDynCast<BfLiteralExpression>(nextNode) != NULL)
  5126. {
  5127. doAddType = true;
  5128. addAsExpr = true;
  5129. }
  5130. else if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  5131. {
  5132. if (tokenNode->mToken == BfToken_Minus)
  5133. {
  5134. doAddType = true;
  5135. addAsExpr = true;
  5136. }
  5137. }
  5138. if (genericIdentifier == NULL)
  5139. {
  5140. auto nextNode = mVisitorPos.GetNext();
  5141. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  5142. BfToken token = BfToken_None;
  5143. if (tokenNode != NULL)
  5144. token = tokenNode->GetToken();
  5145. if ((tokenNode != NULL) &&
  5146. ((token == BfToken_Const) ||
  5147. (token == BfToken_Ref) ||
  5148. (token == BfToken_Mut) ||
  5149. (token == BfToken_LParen) ||
  5150. (token == BfToken_Delegate) ||
  5151. (token == BfToken_Function) ||
  5152. (token == BfToken_Comptype) ||
  5153. (token == BfToken_Decltype) ||
  5154. ((token == BfToken_Star) && (mAllowTypeWildcard))))
  5155. doAddType = true;
  5156. }
  5157. if ((!doAddType) && (isBoundName))
  5158. {
  5159. FailAfter("Expected type", genericInstance);
  5160. }
  5161. if ((doAddType) && (!isUnboundName))
  5162. {
  5163. BfAstNode* genericArgumentTypeRef = NULL;
  5164. if (addAsExpr)
  5165. {
  5166. genericArgumentTypeRef = CreateExpressionAfter(genericInstance, CreateExprFlags_BreakOnRChevron);
  5167. }
  5168. else
  5169. genericArgumentTypeRef = CreateTypeRefAfter(genericInstance);
  5170. if (genericArgumentTypeRef == NULL)
  5171. return NULL;
  5172. MoveNode(genericArgumentTypeRef, genericInstance);
  5173. genericArguments.push_back(genericArgumentTypeRef);
  5174. isBoundName = true;
  5175. }
  5176. else
  5177. isUnboundName = true;
  5178. nextNode = mVisitorPos.GetNext();
  5179. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  5180. if (tokenNode == NULL)
  5181. {
  5182. FailAfter("Expected ',' or '>'", genericInstance);
  5183. return genericInstance;
  5184. }
  5185. token = tokenNode->GetToken();
  5186. if (token == BfToken_RDblChevron)
  5187. {
  5188. tokenNode = BreakDoubleChevron(tokenNode);
  5189. token = tokenNode->GetToken();
  5190. }
  5191. else
  5192. {
  5193. mVisitorPos.MoveNext();
  5194. }
  5195. if (token == BfToken_RChevron)
  5196. {
  5197. MoveNode(tokenNode, genericInstance);
  5198. genericInstance->mCloseChevron = tokenNode;
  5199. break;
  5200. }
  5201. if (token != BfToken_Comma)
  5202. {
  5203. Fail("Either ',' or '>' expected", tokenNode);
  5204. mVisitorPos.mReadPos--;
  5205. //AddErrorNode(tokenNode);
  5206. return genericInstance;
  5207. }
  5208. MoveNode(tokenNode, genericInstance);
  5209. commas.push_back(tokenNode);
  5210. }
  5211. typeRef = genericInstance;
  5212. }
  5213. else
  5214. break;
  5215. }
  5216. else
  5217. break;
  5218. }
  5219. return typeRef;
  5220. }
  5221. BfTypeReference* BfReducer::CreateTypeRef(BfAstNode* firstNode, CreateTypeRefFlags createTypeRefFlags)
  5222. {
  5223. int endNode = -1;
  5224. if ((createTypeRefFlags & CreateTypeRefFlags_SafeGenericParse) != 0)
  5225. {
  5226. createTypeRefFlags = (CreateTypeRefFlags)(createTypeRefFlags & ~CreateTypeRefFlags_SafeGenericParse);
  5227. int outEndNode = -1;
  5228. int retryNode = -1;
  5229. bool isTypeRef = IsTypeReference(firstNode, BfToken_None, -1, &retryNode, &outEndNode, NULL, NULL, NULL);
  5230. if ((!isTypeRef) && (retryNode != -1))
  5231. endNode = retryNode;
  5232. }
  5233. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(firstNode))
  5234. {
  5235. BfToken token = tokenNode->GetToken();
  5236. if ((token == BfToken_Ref) || (token == BfToken_Mut))
  5237. {
  5238. auto nextNode = mVisitorPos.GetNext();
  5239. mVisitorPos.MoveNext();
  5240. auto typeRef = DoCreateTypeRef(nextNode, createTypeRefFlags);
  5241. if (typeRef == NULL)
  5242. {
  5243. mVisitorPos.mReadPos--;
  5244. AddErrorNode(tokenNode);
  5245. return NULL;
  5246. }
  5247. return CreateRefTypeRef(typeRef, tokenNode);
  5248. }
  5249. }
  5250. return DoCreateTypeRef(firstNode, createTypeRefFlags, endNode);
  5251. }
  5252. BfTypeReference* BfReducer::CreateTypeRefAfter(BfAstNode* astNode, CreateTypeRefFlags createTypeRefFlags)
  5253. {
  5254. if (!AssertCurrentNode(astNode))
  5255. return NULL;
  5256. auto nextNode = mVisitorPos.GetNext();
  5257. if (nextNode == NULL)
  5258. {
  5259. FailAfter("Expected type", astNode);
  5260. return NULL;
  5261. }
  5262. mVisitorPos.MoveNext();
  5263. int startPos = mVisitorPos.mReadPos;
  5264. BfTypeReference* typeRef = CreateTypeRef(nextNode, createTypeRefFlags);
  5265. if (typeRef == NULL)
  5266. {
  5267. if (mLastErrorSrcEnd > startPos)
  5268. {
  5269. // We added an error node and made progress
  5270. for (int checkIdx = mVisitorPos.mReadPos - 1; checkIdx >= startPos - 1; checkIdx--)
  5271. {
  5272. auto checkNode = mVisitorPos.Get(checkIdx);
  5273. if (checkNode->mSrcEnd <= mLastErrorSrcEnd)
  5274. break;
  5275. mVisitorPos.mReadPos = checkIdx;
  5276. }
  5277. }
  5278. else
  5279. {
  5280. BF_ASSERT(mVisitorPos.mReadPos == startPos);
  5281. mVisitorPos.mReadPos = startPos - 1;
  5282. }
  5283. }
  5284. return typeRef;
  5285. }
  5286. BfTypeReference* BfReducer::CreateRefTypeRef(BfTypeReference* elementType, BfTokenNode* refTokenNode)
  5287. {
  5288. BfToken refToken = refTokenNode->GetToken();
  5289. BF_ASSERT((refToken == BfToken_Ref) || (refToken == BfToken_Mut) || (refToken == BfToken_In) || (refToken == BfToken_Out));
  5290. if (elementType->IsA<BfRefTypeRef>())
  5291. {
  5292. Fail("Multiple ref levels are not allowed", refTokenNode);
  5293. AddErrorNode(refTokenNode);
  5294. return elementType;
  5295. }
  5296. if (elementType->IsA<BfConstTypeRef>())
  5297. {
  5298. Fail("Refs to const values are not allowed", refTokenNode);
  5299. AddErrorNode(refTokenNode);
  5300. return elementType;
  5301. }
  5302. auto refTypeRef = mAlloc->Alloc<BfRefTypeRef>();
  5303. MEMBER_SET(refTypeRef, mRefToken, refTokenNode);
  5304. ReplaceNode(elementType, refTypeRef);
  5305. refTypeRef->mElementType = elementType;
  5306. return refTypeRef;
  5307. }
  5308. BfIdentifierNode* BfReducer::CompactQualifiedName(BfAstNode* leftNode, bool allowGlobalLookup)
  5309. {
  5310. if (!AssertCurrentNode(leftNode))
  5311. return NULL;
  5312. if ((leftNode == NULL) || (!leftNode->IsA<BfIdentifierNode>()))
  5313. return NULL;
  5314. auto prevNode = mVisitorPos.Get(mVisitorPos.mWritePos - 1);
  5315. auto leftIdentifier = (BfIdentifierNode*)leftNode;
  5316. while (true)
  5317. {
  5318. bool isGlobalLookup = false;
  5319. auto nextToken = mVisitorPos.Get(mVisitorPos.mReadPos + 1);
  5320. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextToken);
  5321. if ((tokenNode != NULL) && (tokenNode->mToken == BfToken_ColonColon) && (leftNode->IsExact<BfIdentifierNode>()) && (leftNode->Equals("global")) && (allowGlobalLookup))
  5322. {
  5323. isGlobalLookup = true;
  5324. }
  5325. else if ((tokenNode == NULL) || ((tokenNode->GetToken() != BfToken_Dot) /*&& (tokenNode->GetToken() != BfToken_QuestionDot)*/))
  5326. return leftIdentifier;
  5327. auto nextNextToken = mVisitorPos.Get(mVisitorPos.mReadPos + 2);
  5328. auto rightIdentifier = BfNodeDynCast<BfIdentifierNode>(nextNextToken);
  5329. if (rightIdentifier == NULL)
  5330. {
  5331. if (auto rightToken = BfNodeDynCast<BfTokenNode>(nextNextToken))
  5332. {
  5333. if (rightToken->mToken == BfToken_This)
  5334. {
  5335. return leftIdentifier;
  5336. }
  5337. if (BfTokenIsKeyword(rightToken->mToken))
  5338. {
  5339. rightIdentifier = mAlloc->Alloc<BfIdentifierNode>();
  5340. ReplaceNode(rightToken, rightIdentifier);
  5341. }
  5342. }
  5343. if (rightIdentifier == NULL)
  5344. return leftIdentifier;
  5345. }
  5346. if (isGlobalLookup)
  5347. {
  5348. // For 'global::', we put 'global' on the left and the rest on the right which is different from normal
  5349. mVisitorPos.MoveNext(); // past .
  5350. mVisitorPos.MoveNext(); // past right
  5351. auto rightSide = CompactQualifiedName(rightIdentifier, false);
  5352. auto qualifiedNameNode = mAlloc->Alloc<BfQualifiedNameNode>();
  5353. ReplaceNode(leftIdentifier, qualifiedNameNode);
  5354. qualifiedNameNode->mLeft = leftIdentifier;
  5355. MEMBER_SET(qualifiedNameNode, mDot, tokenNode);
  5356. MEMBER_SET(qualifiedNameNode, mRight, rightSide);
  5357. return qualifiedNameNode;
  5358. }
  5359. // If the previous dotted span failed (IE: had chevrons) then don't insert qualified names in the middle of it
  5360. auto prevNodeToken = BfNodeDynCast<BfTokenNode>(prevNode);
  5361. if ((prevNodeToken != NULL) &&
  5362. ((prevNodeToken->GetToken() == BfToken_Dot) ||
  5363. (prevNodeToken->GetToken() == BfToken_QuestionDot) ||
  5364. (prevNodeToken->GetToken() == BfToken_Arrow)))
  5365. return leftIdentifier;
  5366. mVisitorPos.MoveNext(); // past .
  5367. mVisitorPos.MoveNext(); // past right
  5368. auto qualifiedNameNode = mAlloc->Alloc<BfQualifiedNameNode>();
  5369. ReplaceNode(leftIdentifier, qualifiedNameNode);
  5370. qualifiedNameNode->mLeft = leftIdentifier;
  5371. MEMBER_SET(qualifiedNameNode, mDot, tokenNode);
  5372. MEMBER_SET(qualifiedNameNode, mRight, rightIdentifier);
  5373. leftIdentifier = qualifiedNameNode;
  5374. prevNode = NULL;
  5375. }
  5376. return leftIdentifier;
  5377. }
  5378. void BfReducer::TryIdentifierConvert(int readPos)
  5379. {
  5380. auto node = mVisitorPos.Get(readPos);
  5381. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(node))
  5382. {
  5383. if (BfTokenIsKeyword(tokenNode->mToken))
  5384. {
  5385. auto identifierNode = mAlloc->Alloc<BfIdentifierNode>();
  5386. ReplaceNode(tokenNode, identifierNode);
  5387. mVisitorPos.Set(readPos, identifierNode);
  5388. }
  5389. }
  5390. }
  5391. void BfReducer::CreateQualifiedNames(BfAstNode* node)
  5392. {
  5393. auto block = BfNodeDynCast<BfBlock>(node);
  5394. if (block == NULL)
  5395. return;
  5396. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
  5397. bool isDone = !mVisitorPos.MoveNext();
  5398. while (!isDone)
  5399. {
  5400. auto child = mVisitorPos.GetCurrent();
  5401. BfAstNode* newNode = CompactQualifiedName(child);
  5402. if (newNode == NULL)
  5403. newNode = child;
  5404. CreateQualifiedNames(child);
  5405. isDone = !mVisitorPos.MoveNext();
  5406. if (newNode != NULL)
  5407. mVisitorPos.Write(newNode);
  5408. }
  5409. mVisitorPos.Trim();
  5410. }
  5411. BfAttributeDirective* BfReducer::CreateAttributeDirective(BfTokenNode* startToken)
  5412. {
  5413. BfAttributeDirective* attributeDirective = mAlloc->Alloc<BfAttributeDirective>();
  5414. BfDeferredAstSizedArray<BfExpression*> arguments(attributeDirective->mArguments, mAlloc);
  5415. BfDeferredAstSizedArray<BfTokenNode*> commas(attributeDirective->mCommas, mAlloc);
  5416. ReplaceNode(startToken, attributeDirective);
  5417. attributeDirective->mAttrOpenToken = startToken;
  5418. bool isHandled = false;
  5419. auto nextNode = mVisitorPos.GetNext();
  5420. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  5421. if (tokenNode != NULL)
  5422. {
  5423. if (tokenNode->GetToken() == BfToken_Return)
  5424. {
  5425. auto attributeTargetSpecifier = mAlloc->Alloc<BfAttributeTargetSpecifier>();
  5426. ReplaceNode(tokenNode, attributeTargetSpecifier);
  5427. MEMBER_SET(attributeDirective, mAttributeTargetSpecifier, attributeTargetSpecifier);
  5428. attributeTargetSpecifier->mTargetToken = tokenNode;
  5429. mVisitorPos.MoveNext();
  5430. tokenNode = ExpectTokenAfter(attributeDirective, BfToken_Colon);
  5431. if (tokenNode != NULL)
  5432. MEMBER_SET(attributeTargetSpecifier, mColonToken, tokenNode);
  5433. attributeDirective->SetSrcEnd(attributeDirective->mAttributeTargetSpecifier->GetSrcEnd());
  5434. }
  5435. else if ((tokenNode->mToken == BfToken_Ampersand) || (tokenNode->mToken == BfToken_AssignEquals) || (tokenNode->mToken == BfToken_Question))
  5436. {
  5437. MEMBER_SET(attributeDirective, mAttributeTargetSpecifier, tokenNode);
  5438. mVisitorPos.MoveNext();
  5439. isHandled = true;
  5440. nextNode = mVisitorPos.GetNext();
  5441. BfExpression* nameNode = NULL;
  5442. if (auto identiferNode = BfNodeDynCast<BfIdentifierNode>(nextNode))
  5443. nameNode = identiferNode;
  5444. else if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  5445. {
  5446. if (nextToken->mToken == BfToken_This)
  5447. {
  5448. auto thisExpr = mAlloc->Alloc<BfThisExpression>();
  5449. ReplaceNode(nextToken, thisExpr);
  5450. nameNode = thisExpr;
  5451. }
  5452. }
  5453. if (nameNode != NULL)
  5454. {
  5455. attributeDirective->SetSrcEnd(nameNode->GetSrcEnd());
  5456. arguments.push_back(nameNode);
  5457. mVisitorPos.MoveNext();
  5458. nextNode = mVisitorPos.GetNext();
  5459. }
  5460. }
  5461. }
  5462. if (!isHandled)
  5463. {
  5464. int prevReadPos = mVisitorPos.mReadPos;
  5465. auto typeRef = CreateTypeRefAfter(attributeDirective);
  5466. if (typeRef == NULL)
  5467. {
  5468. if (mVisitorPos.mReadPos != prevReadPos)
  5469. {
  5470. AddErrorNode(attributeDirective);
  5471. auto curNode = mVisitorPos.GetCurrent();
  5472. if ((mSource != NULL) && (!mSource->HasPendingError(curNode)))
  5473. mSource->AddErrorNode(curNode);
  5474. return NULL;
  5475. }
  5476. auto nextNode = mVisitorPos.GetNext();
  5477. if (BfTokenNode* endToken = BfNodeDynCast<BfTokenNode>(nextNode))
  5478. {
  5479. if (endToken->GetToken() == BfToken_RBracket)
  5480. {
  5481. mVisitorPos.MoveNext();
  5482. MEMBER_SET(attributeDirective, mCtorCloseParen, endToken);
  5483. return attributeDirective;
  5484. }
  5485. }
  5486. return attributeDirective;
  5487. }
  5488. MEMBER_SET(attributeDirective, mAttributeTypeRef, typeRef);
  5489. }
  5490. tokenNode = ExpectTokenAfter(attributeDirective, BfToken_LParen, BfToken_RBracket, BfToken_Comma);
  5491. if (tokenNode == NULL)
  5492. return attributeDirective;
  5493. if (tokenNode->GetToken() == BfToken_LParen)
  5494. {
  5495. MEMBER_SET(attributeDirective, mCtorOpenParen, tokenNode);
  5496. tokenNode = ReadArguments(attributeDirective, attributeDirective, &arguments, &commas, BfToken_RParen, false);
  5497. if (tokenNode == NULL)
  5498. {
  5499. auto nextNode = mVisitorPos.GetNext();
  5500. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  5501. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_RBracket))
  5502. {
  5503. mVisitorPos.MoveNext();
  5504. goto Do_RBracket;
  5505. }
  5506. return attributeDirective;
  5507. }
  5508. MEMBER_SET(attributeDirective, mCtorCloseParen, tokenNode);
  5509. tokenNode = ExpectTokenAfter(attributeDirective, BfToken_RBracket, BfToken_Comma);
  5510. if (tokenNode == NULL)
  5511. return attributeDirective;
  5512. }
  5513. Do_RBracket:
  5514. if (tokenNode->GetToken() == BfToken_RBracket)
  5515. {
  5516. MEMBER_SET(attributeDirective, mAttrCloseToken, tokenNode);
  5517. auto nextNode = mVisitorPos.GetNext();
  5518. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  5519. if ((tokenNode == NULL) || (tokenNode->GetToken() != BfToken_LBracket))
  5520. return attributeDirective;
  5521. mVisitorPos.MoveNext();
  5522. }
  5523. // Has another one- chain it
  5524. auto nextAttribute = CreateAttributeDirective(tokenNode);
  5525. if (nextAttribute != NULL)
  5526. {
  5527. MEMBER_SET(attributeDirective, mNextAttribute, nextAttribute);
  5528. }
  5529. return attributeDirective;
  5530. }
  5531. BfStatement* BfReducer::CreateAttributedStatement(BfTokenNode* tokenNode, CreateStmtFlags createStmtFlags)
  5532. {
  5533. auto attrib = CreateAttributeDirective(tokenNode);
  5534. if (attrib == NULL)
  5535. return NULL;
  5536. BfAstNode* stmt = CreateStatementAfter(attrib, createStmtFlags);
  5537. if (stmt != NULL)
  5538. {
  5539. if (auto localMethodDecl = BfNodeDynCastExact<BfLocalMethodDeclaration>(stmt))
  5540. {
  5541. BF_ASSERT(localMethodDecl->mMethodDeclaration->mAttributes == NULL);
  5542. localMethodDecl->mSrcStart = attrib->mSrcStart;
  5543. MEMBER_SET(localMethodDecl->mMethodDeclaration, mAttributes, attrib);
  5544. return localMethodDecl;
  5545. }
  5546. bool isValid = true;
  5547. auto checkNode = stmt;
  5548. if (auto exprStatement = BfNodeDynCast<BfExpressionStatement>(checkNode))
  5549. checkNode = exprStatement->mExpression;
  5550. if ((checkNode->IsA<BfObjectCreateExpression>()) ||
  5551. (checkNode->IsA<BfInvocationExpression>()) ||
  5552. (checkNode->IsA<BfVariableDeclaration>()) ||
  5553. (checkNode->IsA<BfStringInterpolationExpression>()) ||
  5554. (checkNode->IsA<BfBlock>()))
  5555. {
  5556. if (auto varDecl = BfNodeDynCast<BfVariableDeclaration>(checkNode))
  5557. {
  5558. if (CheckInlineTypeRefAttribute(varDecl->mTypeRef, attrib))
  5559. return BfNodeDynCast<BfStatement>(stmt);
  5560. }
  5561. BfAttributedStatement* attribStmt = mAlloc->Alloc<BfAttributedStatement>();
  5562. ReplaceNode(attrib, attribStmt);
  5563. attribStmt->mAttributes = attrib;
  5564. MEMBER_SET(attribStmt, mStatement, stmt);
  5565. return attribStmt;
  5566. }
  5567. }
  5568. Fail("Prefixed attributes can only be used on allocations, invocations, blocks, or variable declarations", attrib);
  5569. BfAttributedStatement* attribStmt = mAlloc->Alloc<BfAttributedStatement>();
  5570. ReplaceNode(attrib, attribStmt);
  5571. attribStmt->mAttributes = attrib;
  5572. if (stmt != NULL)
  5573. MEMBER_SET(attribStmt, mStatement, stmt);
  5574. return attribStmt;
  5575. }
  5576. BfExpression* BfReducer::CreateAttributedExpression(BfTokenNode* tokenNode, bool onlyAllowIdentifier)
  5577. {
  5578. auto attrib = CreateAttributeDirective(tokenNode);
  5579. if (attrib == NULL)
  5580. return NULL;
  5581. if (!onlyAllowIdentifier)
  5582. {
  5583. BfExpression* expr = CreateExpressionAfter(attrib, CreateExprFlags_EarlyExit);
  5584. if (expr != NULL)
  5585. {
  5586. if (auto identifier = BfNodeDynCast<BfIdentifierNode>(expr))
  5587. {
  5588. auto attrIdentifier = mAlloc->Alloc<BfAttributedIdentifierNode>();
  5589. ReplaceNode(attrib, attrIdentifier);
  5590. attrIdentifier->mAttributes = attrib;
  5591. MEMBER_SET(attrIdentifier, mIdentifier, identifier);
  5592. return attrIdentifier;
  5593. }
  5594. if ((expr->IsA<BfObjectCreateExpression>()) ||
  5595. (expr->IsA<BfInvocationExpression>()) ||
  5596. (expr->IsA<BfVariableDeclaration>()) ||
  5597. (expr->IsA<BfStringInterpolationExpression>()) ||
  5598. (expr->IsA<BfBlock>()))
  5599. {
  5600. BfAttributedExpression* attribExpr = mAlloc->Alloc<BfAttributedExpression>();
  5601. ReplaceNode(attrib, attribExpr);
  5602. attribExpr->mAttributes = attrib;
  5603. MEMBER_SET(attribExpr, mExpression, expr);
  5604. return attribExpr;
  5605. }
  5606. }
  5607. Fail("Prefixed attributes can only be used on allocations, invocations, blocks, or variable declarations", attrib);
  5608. BfAttributedExpression* attribExpr = mAlloc->Alloc<BfAttributedExpression>();
  5609. ReplaceNode(attrib, attribExpr);
  5610. attribExpr->mAttributes = attrib;
  5611. if (expr != NULL)
  5612. MEMBER_SET(attribExpr, mExpression, expr);
  5613. return attribExpr;
  5614. }
  5615. auto attrIdentifier = mAlloc->Alloc<BfAttributedIdentifierNode>();
  5616. ReplaceNode(attrib, attrIdentifier);
  5617. attrIdentifier->mAttributes = attrib;
  5618. auto identifier = ExpectIdentifierAfter(attrib);
  5619. if (identifier != NULL)
  5620. {
  5621. MEMBER_SET(attrIdentifier, mIdentifier, identifier);
  5622. }
  5623. return attrIdentifier;
  5624. }
  5625. BfTokenNode* BfReducer::ReadArguments(BfAstNode* parentNode, BfAstNode* afterNode, SizedArrayImpl<BfExpression*>* arguments, SizedArrayImpl<BfTokenNode*>* commas, BfToken endToken, bool allowSkippedArgs, CreateExprFlags createExprFlags)
  5626. {
  5627. for (int paramIdx = 0; true; paramIdx++)
  5628. {
  5629. auto nextNode = mVisitorPos.GetNext();
  5630. if ((nextNode == NULL) && (endToken == BfToken_None))
  5631. return NULL;
  5632. BfTokenNode* tokenNode = BfNodeDynCastExact<BfTokenNode>(nextNode);
  5633. if (tokenNode != NULL)
  5634. {
  5635. if (tokenNode->GetToken() == endToken)
  5636. {
  5637. MoveNode(tokenNode, parentNode);
  5638. mVisitorPos.MoveNext();
  5639. return tokenNode;
  5640. }
  5641. if (paramIdx > 0)
  5642. {
  5643. if (tokenNode->GetToken() != BfToken_Comma)
  5644. {
  5645. Fail("Expected comma", tokenNode);
  5646. return NULL;
  5647. }
  5648. commas->push_back(tokenNode);
  5649. MoveNode(tokenNode, parentNode);
  5650. mVisitorPos.MoveNext();
  5651. }
  5652. }
  5653. else
  5654. {
  5655. if (paramIdx > 0)
  5656. {
  5657. FailAfter("Expected comma", afterNode);
  5658. return NULL;
  5659. }
  5660. }
  5661. BfExpression* argumentExpr = NULL;
  5662. if (allowSkippedArgs)
  5663. {
  5664. auto nextNode = mVisitorPos.GetNext();
  5665. if ((nextNode == NULL) && (endToken == BfToken_None))
  5666. return NULL;
  5667. if (auto nextToken = BfNodeDynCastExact<BfTokenNode>(nextNode))
  5668. {
  5669. if (nextToken->GetToken() == endToken)
  5670. continue;
  5671. if (nextToken->GetToken() == BfToken_Comma)
  5672. {
  5673. arguments->push_back(NULL);
  5674. continue;
  5675. }
  5676. }
  5677. if (auto identifierNode = BfNodeDynCastExact<BfIdentifierNode>(nextNode))
  5678. {
  5679. if (auto nextNextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2)))
  5680. {
  5681. if (nextNextToken->mToken == BfToken_Colon)
  5682. {
  5683. auto namedExpr = mAlloc->Alloc<BfNamedExpression>();
  5684. ReplaceNode(identifierNode, namedExpr);
  5685. MEMBER_SET(namedExpr, mNameNode, identifierNode);
  5686. MEMBER_SET(namedExpr, mColonToken, nextNextToken)
  5687. mVisitorPos.MoveNext();
  5688. mVisitorPos.MoveNext();
  5689. auto innerExpr = CreateExpressionAfter(namedExpr, CreateExprFlags_AllowVariableDecl);
  5690. if (innerExpr != NULL)
  5691. {
  5692. MEMBER_SET(namedExpr, mExpression, innerExpr);
  5693. }
  5694. argumentExpr = namedExpr;
  5695. }
  5696. }
  5697. }
  5698. }
  5699. if (argumentExpr == NULL)
  5700. argumentExpr = CreateExpressionAfter(afterNode, CreateExprFlags_AllowVariableDecl);
  5701. if ((argumentExpr != NULL) || (endToken != BfToken_None))
  5702. arguments->push_back(argumentExpr);
  5703. if (argumentExpr == NULL)
  5704. {
  5705. auto nextNode = mVisitorPos.GetNext();
  5706. if (auto tokenNode = BfNodeDynCastExact<BfTokenNode>(nextNode))
  5707. {
  5708. // Try to continue with param list even after an error
  5709. if ((tokenNode->GetToken() == BfToken_Comma) || (tokenNode->GetToken() == endToken))
  5710. continue;
  5711. }
  5712. return NULL;
  5713. }
  5714. MoveNode(argumentExpr, parentNode);
  5715. afterNode = parentNode;
  5716. }
  5717. }
  5718. BfIdentifierNode* BfReducer::ExtractExplicitInterfaceRef(BfAstNode* memberDeclaration, BfIdentifierNode* nameIdentifier, BfTypeReference** outExplicitInterface, BfTokenNode** outExplicitInterfaceDotToken)
  5719. {
  5720. int dotTokenIdx = -1;
  5721. if (auto qualifiedName = BfNodeDynCast<BfQualifiedNameNode>(nameIdentifier))
  5722. {
  5723. MoveNode(qualifiedName, memberDeclaration);
  5724. MoveNode(qualifiedName->mDot, memberDeclaration);
  5725. *outExplicitInterfaceDotToken = qualifiedName->mDot;
  5726. auto explicitInterfaceRef = CreateTypeRef(qualifiedName->mLeft);
  5727. BF_ASSERT(explicitInterfaceRef != NULL);
  5728. MoveNode(explicitInterfaceRef, memberDeclaration);
  5729. *outExplicitInterface = explicitInterfaceRef;
  5730. return qualifiedName->mRight;
  5731. }
  5732. else if (IsTypeReference(nameIdentifier, BfToken_Dot, -1, &dotTokenIdx))
  5733. {
  5734. BfAstNode* dotToken = mVisitorPos.Get(dotTokenIdx);
  5735. MoveNode(dotToken, memberDeclaration);
  5736. *outExplicitInterfaceDotToken = (BfTokenNode*)dotToken;
  5737. auto explicitInterfaceRef = CreateTypeRef(nameIdentifier);
  5738. BF_ASSERT(explicitInterfaceRef != NULL);
  5739. MoveNode(explicitInterfaceRef, memberDeclaration);
  5740. *outExplicitInterface = explicitInterfaceRef;
  5741. return ExpectIdentifierAfter(memberDeclaration);
  5742. }
  5743. return nameIdentifier;
  5744. }
  5745. BfFieldDtorDeclaration* BfReducer::CreateFieldDtorDeclaration(BfAstNode* srcNode)
  5746. {
  5747. BfFieldDtorDeclaration* firstFieldDtor = NULL;
  5748. BfFieldDtorDeclaration* prevFieldDtor = NULL;
  5749. auto nextNode = mVisitorPos.GetNext();
  5750. while (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  5751. {
  5752. if (nextToken->GetToken() != BfToken_Tilde)
  5753. break;
  5754. auto fieldDtor = mAlloc->Alloc<BfFieldDtorDeclaration>();
  5755. ReplaceNode(nextToken, fieldDtor);
  5756. fieldDtor->mTildeToken = nextToken;
  5757. //int prevReadPos = mVisitorPos.mReadPos;
  5758. mVisitorPos.MoveNext();
  5759. if (prevFieldDtor != NULL)
  5760. {
  5761. MEMBER_SET(prevFieldDtor, mNextFieldDtor, fieldDtor);
  5762. }
  5763. else
  5764. {
  5765. firstFieldDtor = fieldDtor;
  5766. MoveNode(fieldDtor, srcNode);
  5767. }
  5768. auto statement = CreateStatementAfter(srcNode);
  5769. if (statement == NULL)
  5770. {
  5771. //mVisitorPos.mReadPos = prevReadPos;
  5772. break;
  5773. }
  5774. MEMBER_SET(fieldDtor, mBody, statement);
  5775. fieldDtor->SetSrcEnd(statement->GetSrcEnd());
  5776. prevFieldDtor = fieldDtor;
  5777. srcNode->SetSrcEnd(fieldDtor->GetSrcEnd());
  5778. nextNode = mVisitorPos.GetNext();
  5779. // We used to NOT have this break here. Why were we allowing multiple ~'s when a block statement would have made more sense?
  5780. break; // Wh
  5781. }
  5782. return firstFieldDtor;
  5783. }
  5784. BfFieldDeclaration* BfReducer::CreateFieldDeclaration(BfTokenNode* tokenNode, BfTypeReference* typeRef, BfIdentifierNode* nameIdentifier, BfFieldDeclaration* prevFieldDeclaration)
  5785. {
  5786. auto fieldDeclaration = mAlloc->Alloc<BfFieldDeclaration>();
  5787. if (prevFieldDeclaration != NULL)
  5788. {
  5789. ReplaceNode(tokenNode, fieldDeclaration);
  5790. MEMBER_SET(fieldDeclaration, mPrecedingComma, tokenNode);
  5791. MEMBER_SET(fieldDeclaration, mNameNode, nameIdentifier);
  5792. fieldDeclaration->mDocumentation = prevFieldDeclaration->mDocumentation;
  5793. fieldDeclaration->mAttributes = prevFieldDeclaration->mAttributes;
  5794. fieldDeclaration->mProtectionSpecifier = prevFieldDeclaration->mProtectionSpecifier;
  5795. fieldDeclaration->mStaticSpecifier = prevFieldDeclaration->mStaticSpecifier;
  5796. fieldDeclaration->mTypeRef = prevFieldDeclaration->mTypeRef;
  5797. fieldDeclaration->mConstSpecifier = prevFieldDeclaration->mConstSpecifier;
  5798. fieldDeclaration->mReadOnlySpecifier = prevFieldDeclaration->mReadOnlySpecifier;
  5799. fieldDeclaration->mVolatileSpecifier = prevFieldDeclaration->mVolatileSpecifier;
  5800. fieldDeclaration->mNewSpecifier = prevFieldDeclaration->mNewSpecifier;
  5801. fieldDeclaration->mExternSpecifier = prevFieldDeclaration->mExternSpecifier;
  5802. tokenNode = ExpectTokenAfter(fieldDeclaration, BfToken_Semicolon, BfToken_AssignEquals, BfToken_Comma, BfToken_Tilde);
  5803. if (tokenNode == NULL)
  5804. return fieldDeclaration;
  5805. mVisitorPos.mReadPos--; // Go back to token
  5806. }
  5807. else
  5808. {
  5809. ReplaceNode(typeRef, fieldDeclaration);
  5810. fieldDeclaration->mTypeRef = typeRef;
  5811. fieldDeclaration->mInitializer = NULL;
  5812. if (nameIdentifier != NULL)
  5813. {
  5814. fieldDeclaration->mNameNode = nameIdentifier;
  5815. MoveNode(fieldDeclaration->mNameNode, fieldDeclaration);
  5816. }
  5817. }
  5818. CheckMultiuseAttributeTypeRef(fieldDeclaration->mTypeRef);
  5819. BfToken token = tokenNode->GetToken();
  5820. if (token == BfToken_AssignEquals)
  5821. {
  5822. MEMBER_SET(fieldDeclaration, mEqualsNode, tokenNode);
  5823. MoveNode(tokenNode, fieldDeclaration);
  5824. mVisitorPos.MoveNext();
  5825. mIsFieldInitializer = true;
  5826. fieldDeclaration->mInitializer = CreateExpressionAfter(fieldDeclaration);
  5827. mIsFieldInitializer = false;
  5828. if (fieldDeclaration->mInitializer != NULL)
  5829. {
  5830. MoveNode(fieldDeclaration->mInitializer, fieldDeclaration);
  5831. auto nextToken = ExpectTokenAfter(fieldDeclaration, BfToken_Semicolon, BfToken_Comma, BfToken_Tilde);
  5832. if (nextToken != NULL)
  5833. mVisitorPos.mReadPos--; // Backtrack, someone else eats these
  5834. }
  5835. }
  5836. else if (token == BfToken_Comma)
  5837. {
  5838. //
  5839. }
  5840. else if (token == BfToken_Tilde)
  5841. {
  5842. //
  5843. }
  5844. else if (token != BfToken_Semicolon)
  5845. {
  5846. //MEMBER_SET(fieldDeclaration, mEqualsNode, tokenNode);
  5847. FailAfter("';', '=', or '~' expected", nameIdentifier);
  5848. return fieldDeclaration;
  5849. }
  5850. bool hasSemicolon = false;
  5851. auto fieldDtor = CreateFieldDtorDeclaration(fieldDeclaration);
  5852. if (fieldDtor != NULL)
  5853. {
  5854. fieldDeclaration->mFieldDtor = fieldDtor;
  5855. if (fieldDtor->mBody != NULL)
  5856. hasSemicolon = !fieldDtor->mBody->IsMissingSemicolon();
  5857. }
  5858. if ((!hasSemicolon) && (ExpectTokenAfter(fieldDeclaration, BfToken_Semicolon, BfToken_Comma) != NULL))
  5859. {
  5860. // This gets taken later
  5861. mVisitorPos.mReadPos--;
  5862. }
  5863. fieldDeclaration->mDocumentation = FindDocumentation(mTypeMemberNodeStart, fieldDeclaration, true);
  5864. return fieldDeclaration;
  5865. }
  5866. BfAstNode* BfReducer::ReadTypeMember(BfTokenNode* tokenNode, bool declStarted, int depth, BfAstNode* deferredHeadNode)
  5867. {
  5868. BfToken token = tokenNode->GetToken();
  5869. if (token == BfToken_Semicolon)
  5870. return tokenNode;
  5871. if (token == BfToken_LBracket)
  5872. {
  5873. auto attributes = CreateAttributeDirective(tokenNode);
  5874. if (attributes == NULL)
  5875. return NULL;
  5876. auto nextNode = mVisitorPos.GetNext();
  5877. if (nextNode == NULL)
  5878. {
  5879. FailAfter("Expected member", attributes);
  5880. return NULL;
  5881. }
  5882. SetAndRestoreValue<BfAstNode*> prevTypeMemberNodeStart(mTypeMemberNodeStart, attributes, !declStarted);
  5883. mVisitorPos.MoveNext();
  5884. auto memberNode = ReadTypeMember(nextNode, true, depth, (deferredHeadNode != NULL) ? deferredHeadNode : attributes);
  5885. if (memberNode == NULL)
  5886. return NULL;
  5887. if (auto enumCaseDecl = BfNodeDynCast<BfEnumCaseDeclaration>(memberNode))
  5888. {
  5889. if (!enumCaseDecl->mEntries.IsEmpty())
  5890. {
  5891. enumCaseDecl->mSrcStart = attributes->mSrcStart;
  5892. enumCaseDecl->mEntries[0]->mAttributes = attributes;
  5893. enumCaseDecl->mEntries[0]->mSrcStart = attributes->mSrcStart;
  5894. return enumCaseDecl;
  5895. }
  5896. }
  5897. auto member = BfNodeDynCast<BfMemberDeclaration>(memberNode);
  5898. if (member == NULL)
  5899. {
  5900. if (auto innerType = BfNodeDynCast<BfTypeDeclaration>(memberNode))
  5901. {
  5902. ReplaceNode(attributes, innerType);
  5903. innerType->mAttributes = attributes;
  5904. return innerType;
  5905. }
  5906. Fail("Invalid target for attributes", memberNode);
  5907. return memberNode;
  5908. }
  5909. memberNode->mTriviaStart = attributes->mTriviaStart;
  5910. memberNode->mSrcStart = attributes->mSrcStart;
  5911. if (auto fieldDecl = BfNodeDynCast<BfFieldDeclaration>(member))
  5912. {
  5913. if (CheckInlineTypeRefAttribute(fieldDecl->mTypeRef, attributes))
  5914. {
  5915. return member;
  5916. }
  5917. }
  5918. if (auto methodDecl = BfNodeDynCast<BfMethodDeclaration>(member))
  5919. {
  5920. if (CheckInlineTypeRefAttribute(methodDecl->mReturnType, attributes))
  5921. {
  5922. return member;
  5923. }
  5924. }
  5925. ReplaceNode(attributes, member);
  5926. member->mAttributes = attributes;
  5927. return member;
  5928. }
  5929. if (token == BfToken_Operator)
  5930. {
  5931. auto operatorDecl = mAlloc->Alloc<BfOperatorDeclaration>();
  5932. BfDeferredAstSizedArray<BfParameterDeclaration*> params(operatorDecl->mParams, mAlloc);
  5933. BfDeferredAstSizedArray<BfTokenNode*> commas(operatorDecl->mCommas, mAlloc);
  5934. ReplaceNode(tokenNode, operatorDecl);
  5935. operatorDecl->mOperatorToken = tokenNode;
  5936. auto typeRef = CreateTypeRefAfter(operatorDecl);
  5937. if (typeRef == NULL)
  5938. return operatorDecl;
  5939. MEMBER_SET_CHECKED(operatorDecl, mReturnType, typeRef);
  5940. CheckMultiuseAttributeTypeRef(operatorDecl->mReturnType);
  5941. operatorDecl->mIsConvOperator = true;
  5942. ParseMethod(operatorDecl, &params, &commas);
  5943. return operatorDecl;
  5944. }
  5945. if (token == BfToken_This)
  5946. {
  5947. auto ctorDecl = mAlloc->Alloc<BfConstructorDeclaration>();
  5948. BfDeferredAstSizedArray<BfParameterDeclaration*> params(ctorDecl->mParams, mAlloc);
  5949. BfDeferredAstSizedArray<BfTokenNode*> commas(ctorDecl->mCommas, mAlloc);
  5950. ctorDecl->mReturnType = NULL;
  5951. ReplaceNode(tokenNode, ctorDecl);
  5952. MEMBER_SET(ctorDecl, mThisToken, tokenNode);
  5953. if (auto block = BfNodeDynCast<BfBlock>(mVisitorPos.GetNext()))
  5954. {
  5955. mVisitorPos.MoveNext();
  5956. MEMBER_SET(ctorDecl, mBody, block);
  5957. if (IsNodeRelevant(ctorDecl))
  5958. {
  5959. SetAndRestoreValue<BfMethodDeclaration*> prevMethodDeclaration(mCurMethodDecl, ctorDecl);
  5960. HandleBlock(block);
  5961. }
  5962. }
  5963. else
  5964. ParseMethod(ctorDecl, &params, &commas);
  5965. return ctorDecl;
  5966. }
  5967. if (token == BfToken_Tilde)
  5968. {
  5969. auto thisToken = ExpectTokenAfter(tokenNode, BfToken_This);
  5970. if (thisToken == NULL)
  5971. {
  5972. auto nextNode = mVisitorPos.GetNext();
  5973. auto nameIdentifier = BfNodeDynCast<BfIdentifierNode>(nextNode);
  5974. if (nameIdentifier != NULL)
  5975. {
  5976. // Eat DTOR name
  5977. AddErrorNode(nameIdentifier);
  5978. //nameIdentifier->RemoveSelf();
  5979. }
  5980. else
  5981. {
  5982. //AddErrorNode(tokenNode);
  5983. //return NULL;
  5984. }
  5985. AddErrorNode(tokenNode);
  5986. return NULL;
  5987. }
  5988. auto dtorDecl = mAlloc->Alloc<BfDestructorDeclaration>();
  5989. BfDeferredAstSizedArray<BfParameterDeclaration*> params(dtorDecl->mParams, mAlloc);
  5990. BfDeferredAstSizedArray<BfTokenNode*> commas(dtorDecl->mCommas, mAlloc);
  5991. dtorDecl->mReturnType = NULL;
  5992. ReplaceNode(tokenNode, dtorDecl);
  5993. dtorDecl->mTildeToken = tokenNode;
  5994. if (thisToken != NULL)
  5995. {
  5996. MEMBER_SET(dtorDecl, mThisToken, thisToken);
  5997. }
  5998. ParseMethod(dtorDecl, &params, &commas);
  5999. return dtorDecl;
  6000. }
  6001. if (token == BfToken_Mixin)
  6002. {
  6003. auto methodDecl = mAlloc->Alloc<BfMethodDeclaration>();
  6004. BfDeferredAstSizedArray<BfParameterDeclaration*> params(methodDecl->mParams, mAlloc);
  6005. BfDeferredAstSizedArray<BfTokenNode*> commas(methodDecl->mCommas, mAlloc);
  6006. ReplaceNode(tokenNode, methodDecl);
  6007. methodDecl->mDocumentation = FindDocumentation(methodDecl);
  6008. methodDecl->mMixinSpecifier = tokenNode;
  6009. //mVisitorPos.MoveNext();
  6010. auto nameNode = ExpectIdentifierAfter(methodDecl);
  6011. if (nameNode != NULL)
  6012. {
  6013. MEMBER_SET(methodDecl, mNameNode, nameNode);
  6014. auto nextNode = mVisitorPos.GetNext();
  6015. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  6016. {
  6017. if (tokenNode->GetToken() == BfToken_LChevron)
  6018. {
  6019. auto genericParams = CreateGenericParamsDeclaration(tokenNode);
  6020. if (genericParams != NULL)
  6021. {
  6022. MEMBER_SET(methodDecl, mGenericParams, genericParams);
  6023. }
  6024. }
  6025. }
  6026. ParseMethod(methodDecl, &params, &commas);
  6027. }
  6028. return methodDecl;
  6029. }
  6030. if (token == BfToken_Case)
  6031. {
  6032. auto enumCaseDecl = mAlloc->Alloc<BfEnumCaseDeclaration>();
  6033. BfDeferredAstSizedArray<BfFieldDeclaration*> entries(enumCaseDecl->mEntries, mAlloc);
  6034. BfDeferredAstSizedArray<BfTokenNode*> commas(enumCaseDecl->mCommas, mAlloc);
  6035. ReplaceNode(tokenNode, enumCaseDecl);
  6036. enumCaseDecl->mCaseToken = tokenNode;
  6037. while (true)
  6038. {
  6039. auto caseName = ExpectIdentifierAfter(enumCaseDecl);
  6040. if (caseName == NULL)
  6041. break;
  6042. auto enumEntry = mAlloc->Alloc<BfEnumEntryDeclaration>();
  6043. ReplaceNode(caseName, enumEntry);
  6044. enumEntry->mNameNode = caseName;
  6045. entries.push_back(enumEntry);
  6046. tokenNode = ExpectTokenAfter(enumEntry, BfToken_Comma, BfToken_AssignEquals, BfToken_LParen, BfToken_Semicolon);
  6047. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_LParen))
  6048. {
  6049. auto typeRef = CreateTypeRef(tokenNode, CreateTypeRefFlags_AllowSingleMemberTuple);
  6050. tokenNode = NULL;
  6051. auto tupleType = BfNodeDynCast<BfTupleTypeRef>(typeRef);
  6052. if (tupleType != NULL)
  6053. {
  6054. MEMBER_SET(enumEntry, mTypeRef, tupleType);
  6055. tokenNode = ExpectTokenAfter(enumEntry, BfToken_Comma, BfToken_AssignEquals, BfToken_Semicolon);
  6056. }
  6057. }
  6058. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_AssignEquals))
  6059. {
  6060. MEMBER_SET(enumEntry, mEqualsNode, tokenNode);
  6061. tokenNode = NULL;
  6062. auto initializer = CreateExpressionAfter(enumEntry);
  6063. if (initializer != NULL)
  6064. {
  6065. MEMBER_SET(enumEntry, mInitializer, initializer);
  6066. tokenNode = ExpectTokenAfter(enumEntry, BfToken_Comma, BfToken_Semicolon);
  6067. }
  6068. }
  6069. MoveNode(enumEntry, enumCaseDecl);
  6070. if (tokenNode == NULL)
  6071. return enumCaseDecl;
  6072. if (tokenNode->GetToken() == BfToken_Semicolon)
  6073. {
  6074. mVisitorPos.mReadPos--;
  6075. return enumCaseDecl;
  6076. }
  6077. MoveNode(tokenNode, enumCaseDecl);
  6078. commas.push_back(tokenNode);
  6079. }
  6080. return enumCaseDecl;
  6081. }
  6082. auto nextNode = mVisitorPos.GetNext();
  6083. if (nextNode == NULL)
  6084. FailAfter("Type expected", tokenNode);
  6085. if ((token == BfToken_Struct) || (token == BfToken_Enum) || (token == BfToken_Class) || (token == BfToken_Delegate) ||
  6086. (token == BfToken_Function) || (token == BfToken_Interface) || (token == BfToken_Extension) || (token == BfToken_TypeAlias))
  6087. {
  6088. mVisitorPos.mReadPos -= depth;
  6089. BfAstNode* startNode = mVisitorPos.GetCurrent();
  6090. auto startToken = BfNodeDynCast<BfTokenNode>(startNode);
  6091. auto topLevelObject = CreateTopLevelObject(startToken, NULL, deferredHeadNode);
  6092. auto typeDecl = BfNodeDynCast<BfTypeDeclaration>(topLevelObject);
  6093. if (typeDecl == NULL)
  6094. {
  6095. AddErrorNode(tokenNode);
  6096. return NULL;
  6097. }
  6098. return typeDecl;
  6099. }
  6100. if (token == BfToken_Comma)
  6101. {
  6102. auto prevNode = mVisitorPos.Get(mVisitorPos.mWritePos - 1);
  6103. auto prevFieldDecl = BfNodeDynCast<BfFieldDeclaration>(prevNode);
  6104. if (prevFieldDecl != NULL)
  6105. {
  6106. auto nameIdentifier = ExpectIdentifierAfter(tokenNode);
  6107. if (nameIdentifier == NULL)
  6108. {
  6109. AddErrorNode(tokenNode);
  6110. return NULL;
  6111. }
  6112. return CreateFieldDeclaration(tokenNode, prevFieldDecl->mTypeRef, nameIdentifier, prevFieldDecl);
  6113. }
  6114. }
  6115. switch (token)
  6116. {
  6117. case BfToken_Sealed:
  6118. case BfToken_Static:
  6119. case BfToken_Const:
  6120. case BfToken_Mut:
  6121. case BfToken_Public:
  6122. case BfToken_Protected:
  6123. case BfToken_Private:
  6124. case BfToken_Internal:
  6125. case BfToken_Virtual:
  6126. case BfToken_Override:
  6127. case BfToken_Abstract:
  6128. case BfToken_Concrete:
  6129. case BfToken_Append:
  6130. case BfToken_Extern:
  6131. case BfToken_New:
  6132. case BfToken_Implicit:
  6133. case BfToken_Explicit:
  6134. case BfToken_ReadOnly:
  6135. case BfToken_Inline:
  6136. case BfToken_Using:
  6137. case BfToken_Volatile:
  6138. break;
  6139. default:
  6140. AddErrorNode(tokenNode);
  6141. Fail("Unexpected token", tokenNode);
  6142. return NULL;
  6143. break;
  6144. }
  6145. int startNodeIdx = gAssertCurrentNodeIdx;
  6146. BfAstNode* typeMember = NULL;
  6147. nextNode = mVisitorPos.GetNext();
  6148. if (nextNode != NULL)
  6149. {
  6150. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  6151. {
  6152. if ((nextTokenNode->mToken == BfToken_LBracket) && (depth > 0))
  6153. {
  6154. // We can't apply this to a custom attribute
  6155. AddErrorNode(tokenNode);
  6156. Fail("Unexpected token", tokenNode);
  6157. return NULL;
  6158. }
  6159. }
  6160. mVisitorPos.MoveNext();
  6161. typeMember = ReadTypeMember(nextNode, true, depth + 1);
  6162. }
  6163. auto memberDecl = BfNodeDynCast<BfMemberDeclaration>(typeMember);
  6164. if (memberDecl == NULL) // May be an embedded type
  6165. {
  6166. if (auto typeDecl = BfNodeDynCast<BfTypeDeclaration>(typeMember))
  6167. return typeMember;
  6168. }
  6169. if (typeMember == NULL)
  6170. {
  6171. auto propertyDeclaration = mAlloc->Alloc<BfPropertyDeclaration>();
  6172. ReplaceNode(tokenNode, propertyDeclaration);
  6173. propertyDeclaration->mDocumentation = FindDocumentation(propertyDeclaration);
  6174. typeMember = memberDecl = propertyDeclaration;
  6175. }
  6176. if (memberDecl == NULL)
  6177. return NULL;
  6178. if (token == BfToken_Static)
  6179. {
  6180. if (memberDecl->mStaticSpecifier != NULL)
  6181. {
  6182. AddErrorNode(memberDecl->mStaticSpecifier);
  6183. Fail("Static already specified", memberDecl->mStaticSpecifier);
  6184. }
  6185. MEMBER_SET(memberDecl, mStaticSpecifier, tokenNode);
  6186. auto fieldDecl = BfNodeDynCast<BfFieldDeclaration>(memberDecl);
  6187. if (fieldDecl != NULL)
  6188. {
  6189. if ((fieldDecl->mStaticSpecifier != NULL) && (fieldDecl->mConstSpecifier != NULL) && (fieldDecl->mConstSpecifier->mToken == BfToken_Const))
  6190. Fail("Cannot use 'static' and 'const' together", fieldDecl);
  6191. }
  6192. return memberDecl;
  6193. }
  6194. if ((token == BfToken_Public) ||
  6195. (token == BfToken_Protected) ||
  6196. (token == BfToken_Private) ||
  6197. (token == BfToken_Internal))
  6198. {
  6199. if (auto fieldDecl = BfNodeDynCast<BfFieldDeclaration>(memberDecl))
  6200. {
  6201. if (auto usingSpecifier = BfNodeDynCastExact<BfUsingSpecifierNode>(fieldDecl->mConstSpecifier))
  6202. {
  6203. SetProtection(memberDecl, usingSpecifier->mProtection, tokenNode);
  6204. usingSpecifier->mTriviaStart = tokenNode->mTriviaStart;
  6205. return memberDecl;
  6206. }
  6207. }
  6208. SetProtection(memberDecl, memberDecl->mProtectionSpecifier, tokenNode);
  6209. return memberDecl;
  6210. }
  6211. if (auto methodDecl = BfNodeDynCast<BfMethodDeclaration>(memberDecl))
  6212. {
  6213. if ((token == BfToken_Virtual) ||
  6214. (token == BfToken_Override) ||
  6215. (token == BfToken_Abstract) ||
  6216. (token == BfToken_Concrete))
  6217. {
  6218. if (methodDecl->mVirtualSpecifier != NULL)
  6219. {
  6220. AddErrorNode(methodDecl->mVirtualSpecifier);
  6221. if (methodDecl->mVirtualSpecifier->GetToken() == tokenNode->GetToken())
  6222. Fail(StrFormat("Already specified '%s'", BfTokenToString(tokenNode->GetToken())), methodDecl->mVirtualSpecifier);
  6223. else
  6224. Fail(StrFormat("Cannot specify both '%s' and '%s'", BfTokenToString(methodDecl->mVirtualSpecifier->GetToken()), BfTokenToString(tokenNode->GetToken())), methodDecl->mVirtualSpecifier);
  6225. }
  6226. MEMBER_SET(methodDecl, mVirtualSpecifier, tokenNode);
  6227. return memberDecl;
  6228. }
  6229. if (token == BfToken_Extern)
  6230. {
  6231. if (methodDecl->mExternSpecifier != NULL)
  6232. {
  6233. AddErrorNode(methodDecl->mExternSpecifier);
  6234. Fail("Extern already specified", methodDecl->mExternSpecifier);
  6235. }
  6236. MEMBER_SET(methodDecl, mExternSpecifier, tokenNode);
  6237. return memberDecl;
  6238. }
  6239. if (token == BfToken_New)
  6240. {
  6241. if (methodDecl->mNewSpecifier != NULL)
  6242. {
  6243. AddErrorNode(methodDecl->mNewSpecifier);
  6244. Fail("New already specified", methodDecl->mNewSpecifier);
  6245. }
  6246. MEMBER_SET(methodDecl, mNewSpecifier, tokenNode);
  6247. return memberDecl;
  6248. }
  6249. if (token == BfToken_Mut)
  6250. {
  6251. if (methodDecl->mMutSpecifier != NULL)
  6252. {
  6253. AddErrorNode(methodDecl->mMutSpecifier);
  6254. Fail("Mut already specified", methodDecl->mMutSpecifier);
  6255. }
  6256. MEMBER_SET(methodDecl, mMutSpecifier, tokenNode);
  6257. return memberDecl;
  6258. }
  6259. if (token == BfToken_ReadOnly)
  6260. {
  6261. if (methodDecl->mReadOnlySpecifier == NULL)
  6262. {
  6263. MEMBER_SET(methodDecl, mReadOnlySpecifier, tokenNode);
  6264. }
  6265. return memberDecl;
  6266. }
  6267. }
  6268. if (auto operatorDecl = BfNodeDynCast<BfOperatorDeclaration>(memberDecl))
  6269. {
  6270. if ((token == BfToken_Implicit) ||
  6271. (token == BfToken_Explicit))
  6272. {
  6273. if (operatorDecl->mExplicitToken != NULL)
  6274. {
  6275. AddErrorNode(operatorDecl->mExplicitToken);
  6276. Fail(StrFormat("'%s' already specified", BfTokenToString(operatorDecl->mExplicitToken->GetToken())), operatorDecl->mExplicitToken);
  6277. }
  6278. MEMBER_SET(operatorDecl, mExplicitToken, tokenNode);
  6279. return memberDecl;
  6280. }
  6281. }
  6282. if (auto propDecl = BfNodeDynCast<BfPropertyDeclaration>(memberDecl))
  6283. {
  6284. if ((token == BfToken_Virtual) ||
  6285. (token == BfToken_Override) ||
  6286. (token == BfToken_Abstract) ||
  6287. (token == BfToken_Concrete))
  6288. {
  6289. if (propDecl->mVirtualSpecifier != NULL)
  6290. {
  6291. AddErrorNode(propDecl->mVirtualSpecifier);
  6292. if (propDecl->mVirtualSpecifier->GetToken() == token)
  6293. Fail(StrFormat("Already specified '%s'", BfTokenToString(token)), propDecl->mVirtualSpecifier);
  6294. else
  6295. Fail(StrFormat("Cannot specify both '%s' and '%s'", BfTokenToString(propDecl->mVirtualSpecifier->GetToken()), BfTokenToString(token)), propDecl->mVirtualSpecifier);
  6296. }
  6297. MEMBER_SET(propDecl, mVirtualSpecifier, tokenNode);
  6298. return memberDecl;
  6299. }
  6300. }
  6301. if (auto fieldDecl = BfNodeDynCast<BfFieldDeclaration>(memberDecl))
  6302. {
  6303. if (token == BfToken_Override)
  6304. {
  6305. // Must be typing an 'override' over a field declaration
  6306. auto propDecl = mAlloc->Alloc<BfPropertyDeclaration>();
  6307. propDecl->mVirtualSpecifier = tokenNode;
  6308. typeMember = memberDecl = propDecl;
  6309. }
  6310. bool handled = false;
  6311. if (token == BfToken_Const)
  6312. {
  6313. if ((fieldDecl->mConstSpecifier != NULL) && (fieldDecl->mConstSpecifier->mToken == BfToken_Using))
  6314. {
  6315. Fail("Const cannot be used with 'using' specified", tokenNode);
  6316. }
  6317. else if (fieldDecl->mConstSpecifier != NULL)
  6318. {
  6319. Fail("Const already specified", tokenNode);
  6320. }
  6321. MEMBER_SET(fieldDecl, mConstSpecifier, tokenNode);
  6322. handled = true;
  6323. }
  6324. if (token == BfToken_Using)
  6325. {
  6326. if ((fieldDecl->mConstSpecifier != NULL) && (fieldDecl->mConstSpecifier->mToken == BfToken_Const))
  6327. {
  6328. Fail("Const cannot be used with 'using' specified", tokenNode);
  6329. }
  6330. else if (fieldDecl->mConstSpecifier != NULL)
  6331. {
  6332. Fail("Using already specified", tokenNode);
  6333. }
  6334. auto usingSpecifier = mAlloc->Alloc<BfUsingSpecifierNode>();
  6335. ReplaceNode(tokenNode, usingSpecifier);
  6336. MEMBER_SET(usingSpecifier, mUsingToken, tokenNode);
  6337. MEMBER_SET(fieldDecl, mConstSpecifier, usingSpecifier);
  6338. handled = true;
  6339. }
  6340. if (token == BfToken_ReadOnly)
  6341. {
  6342. if (fieldDecl->mReadOnlySpecifier == NULL)
  6343. {
  6344. MEMBER_SET(fieldDecl, mReadOnlySpecifier, tokenNode);
  6345. }
  6346. handled = true;
  6347. }
  6348. if (token == BfToken_Inline)
  6349. {
  6350. MEMBER_SET(fieldDecl, mReadOnlySpecifier, tokenNode);
  6351. handled = true;
  6352. }
  6353. if (token == BfToken_Volatile)
  6354. {
  6355. MEMBER_SET(fieldDecl, mVolatileSpecifier, tokenNode);
  6356. handled = true;
  6357. }
  6358. if (token == BfToken_Extern)
  6359. {
  6360. if ((fieldDecl->mExternSpecifier != NULL) && (fieldDecl->mExternSpecifier->mToken == BfToken_Append))
  6361. {
  6362. Fail("Extern cannot be used with 'append' specified", tokenNode);
  6363. }
  6364. else if (fieldDecl->mExternSpecifier != NULL)
  6365. {
  6366. Fail("Extern already specified", tokenNode);
  6367. }
  6368. MEMBER_SET(fieldDecl, mExternSpecifier, tokenNode);
  6369. handled = true;
  6370. }
  6371. if (token == BfToken_Append)
  6372. {
  6373. if ((fieldDecl->mExternSpecifier != NULL) && (fieldDecl->mExternSpecifier->mToken == BfToken_Extern))
  6374. {
  6375. Fail("Append cannot be used with 'extern' specified", tokenNode);
  6376. }
  6377. else if (fieldDecl->mExternSpecifier != NULL)
  6378. {
  6379. Fail("Append already specified", tokenNode);
  6380. }
  6381. MEMBER_SET(fieldDecl, mExternSpecifier, tokenNode);
  6382. handled = true;
  6383. }
  6384. if (token == BfToken_New)
  6385. {
  6386. if (fieldDecl->mNewSpecifier != NULL)
  6387. {
  6388. Fail("New already specified", tokenNode);
  6389. }
  6390. MEMBER_SET(fieldDecl, mNewSpecifier, tokenNode);
  6391. handled = true;
  6392. }
  6393. if ((fieldDecl->mStaticSpecifier != NULL) && (fieldDecl->mConstSpecifier != NULL) && (fieldDecl->mConstSpecifier->mToken == BfToken_Const))
  6394. Fail("Cannot use 'static' and 'const' together", fieldDecl);
  6395. if ((fieldDecl->mReadOnlySpecifier != NULL) && (fieldDecl->mConstSpecifier != NULL) && (fieldDecl->mConstSpecifier->mToken == BfToken_Const))
  6396. Fail("Cannot use 'readonly' and 'const' together", fieldDecl);
  6397. if ((fieldDecl->mVolatileSpecifier != NULL) && (fieldDecl->mConstSpecifier != NULL) && (fieldDecl->mConstSpecifier->mToken == BfToken_Const))
  6398. Fail("Cannot use 'volatile' and 'const' together", fieldDecl);
  6399. if (handled)
  6400. return fieldDecl;
  6401. }
  6402. // Eat node
  6403. if (memberDecl != NULL)
  6404. ReplaceNode(tokenNode, memberDecl);
  6405. Fail("Invalid token", tokenNode);
  6406. return memberDecl;
  6407. }
  6408. void BfReducer::ReadPropertyBlock(BfPropertyDeclaration* propertyDeclaration, BfBlock* block)
  6409. {
  6410. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
  6411. BfDeferredAstSizedArray<BfPropertyMethodDeclaration*> methods(propertyDeclaration->mMethods, mAlloc);
  6412. bool hadGet = false;
  6413. bool hadSet = false;
  6414. while (true)
  6415. {
  6416. BfAstNode* protectionSpecifier = NULL;
  6417. BfAttributeDirective* attributes = NULL;
  6418. auto child = mVisitorPos.GetNext();
  6419. if (child == NULL)
  6420. break;
  6421. String accessorName;
  6422. BfTokenNode* mutSpecifier = NULL;
  6423. BfTokenNode* refSpecifier = NULL;
  6424. while (true)
  6425. {
  6426. auto tokenNode = BfNodeDynCast<BfTokenNode>(child);
  6427. if (tokenNode == NULL)
  6428. break;
  6429. BfToken token = tokenNode->GetToken();
  6430. if (token == BfToken_LBracket)
  6431. {
  6432. mVisitorPos.MoveNext();
  6433. attributes = CreateAttributeDirective(tokenNode);
  6434. child = mVisitorPos.GetNext();
  6435. }
  6436. tokenNode = BfNodeDynCast<BfTokenNode>(child);
  6437. if (tokenNode == NULL)
  6438. break;
  6439. token = tokenNode->GetToken();
  6440. if ((token == BfToken_Private) ||
  6441. (token == BfToken_Protected) ||
  6442. (token == BfToken_Public) ||
  6443. (token == BfToken_Internal))
  6444. {
  6445. SetProtection(NULL, protectionSpecifier, tokenNode);
  6446. mVisitorPos.MoveNext();
  6447. child = mVisitorPos.GetCurrent();
  6448. }
  6449. else if (token == BfToken_Mut)
  6450. {
  6451. Fail("'mut' must be specified after get/set", tokenNode);
  6452. mutSpecifier = tokenNode;
  6453. mVisitorPos.MoveNext();
  6454. }
  6455. else
  6456. break;
  6457. child = mVisitorPos.GetNext();
  6458. }
  6459. auto identifierNode = child;
  6460. auto accessorIdentifier = BfNodeDynCast<BfIdentifierNode>(child);
  6461. if (accessorIdentifier != NULL)
  6462. {
  6463. accessorName = accessorIdentifier->ToString();
  6464. mVisitorPos.MoveNext();
  6465. child = mVisitorPos.GetNext();
  6466. }
  6467. if (accessorName == "get")
  6468. {
  6469. // if (hadGet)
  6470. // Fail("Only one 'get' method can be specified", accessorIdentifier);
  6471. hadGet = true;
  6472. }
  6473. else if (accessorName == "set")
  6474. {
  6475. // if (hadSet)
  6476. // Fail("Only one 'set' method can be specified", accessorIdentifier);
  6477. hadSet = true;
  6478. }
  6479. else
  6480. {
  6481. auto refNode = child;
  6482. if (refNode == NULL)
  6483. refNode = block->mCloseBrace;
  6484. Fail("Expected 'get' or 'set'", refNode);
  6485. }
  6486. BfAstNode* bodyAfterNode = accessorIdentifier;
  6487. BfAstNode* body = NULL;
  6488. auto tokenNode = BfNodeDynCast<BfTokenNode>(child);
  6489. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_Ref) && (accessorName == "set"))
  6490. {
  6491. refSpecifier = tokenNode;
  6492. bodyAfterNode = tokenNode;
  6493. mVisitorPos.MoveNext();
  6494. child = mVisitorPos.GetNext();
  6495. tokenNode = BfNodeDynCast<BfTokenNode>(child);
  6496. }
  6497. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_Mut))
  6498. {
  6499. if (mutSpecifier != NULL)
  6500. {
  6501. Fail("'mut' already specified", mutSpecifier);
  6502. }
  6503. mutSpecifier = tokenNode;
  6504. bodyAfterNode = tokenNode;
  6505. mVisitorPos.MoveNext();
  6506. child = mVisitorPos.GetNext();
  6507. }
  6508. bool handled = false;
  6509. BfTokenNode* fatArrowToken = NULL;
  6510. BfAstNode* endSemicolon = NULL;
  6511. if ((tokenNode = BfNodeDynCast<BfTokenNode>(child)))
  6512. {
  6513. if ((tokenNode->GetToken() == BfToken_Semicolon))
  6514. {
  6515. handled = true;
  6516. endSemicolon = tokenNode;
  6517. mVisitorPos.MoveNext();
  6518. }
  6519. else if (tokenNode->mToken == BfToken_FatArrow)
  6520. {
  6521. handled = true;
  6522. fatArrowToken = tokenNode;
  6523. mVisitorPos.MoveNext();
  6524. auto expr = CreateExpressionAfter(tokenNode);
  6525. if (expr != NULL)
  6526. {
  6527. body = expr;
  6528. endSemicolon = ExpectTokenAfter(expr, BfToken_Semicolon);
  6529. }
  6530. }
  6531. }
  6532. if (!handled)
  6533. {
  6534. if (bodyAfterNode != NULL)
  6535. {
  6536. body = ExpectBlockAfter(bodyAfterNode);
  6537. }
  6538. else
  6539. {
  6540. if (auto accessorBlock = BfNodeDynCast<BfBlock>(child))
  6541. {
  6542. body = accessorBlock;
  6543. mVisitorPos.MoveNext();
  6544. }
  6545. if (body == NULL)
  6546. {
  6547. if (child != NULL)
  6548. {
  6549. Fail("Block expected", child);
  6550. AddErrorNode(child);
  6551. mVisitorPos.MoveNext();
  6552. }
  6553. }
  6554. }
  6555. }
  6556. if (auto block = BfNodeDynCast<BfBlock>(body))
  6557. {
  6558. if (((attributes == NULL) && (IsNodeRelevant(block))) ||
  6559. ((attributes != NULL) && (IsNodeRelevant(attributes, block))))
  6560. {
  6561. HandleBlock(block);
  6562. }
  6563. }
  6564. if ((body == NULL) && (!handled))
  6565. {
  6566. if (protectionSpecifier != NULL)
  6567. AddErrorNode(protectionSpecifier);
  6568. if (accessorIdentifier != NULL)
  6569. AddErrorNode(accessorIdentifier);
  6570. if (mutSpecifier != NULL)
  6571. AddErrorNode(mutSpecifier);
  6572. if (refSpecifier != NULL)
  6573. AddErrorNode(refSpecifier);
  6574. continue;
  6575. }
  6576. auto method = mAlloc->Alloc<BfPropertyMethodDeclaration>();
  6577. method->mPropertyDeclaration = propertyDeclaration;
  6578. if (fatArrowToken != NULL)
  6579. MEMBER_SET(method, mFatArrowToken, fatArrowToken);
  6580. if (endSemicolon != NULL)
  6581. MEMBER_SET(method, mEndSemicolon, endSemicolon);
  6582. if (protectionSpecifier != NULL)
  6583. MEMBER_SET(method, mProtectionSpecifier, protectionSpecifier);
  6584. if (accessorIdentifier != NULL)
  6585. MEMBER_SET(method, mNameNode, accessorIdentifier);
  6586. if (body != NULL)
  6587. {
  6588. MEMBER_SET(method, mBody, body);
  6589. }
  6590. if (refSpecifier != NULL)
  6591. MEMBER_SET(method, mSetRefSpecifier, refSpecifier);
  6592. if (mutSpecifier != NULL)
  6593. MEMBER_SET(method, mMutSpecifier, mutSpecifier);
  6594. // if ((accessorBlock != NULL) && (IsNodeRelevant(propertyDeclaration)))
  6595. // HandleBlock(accessorBlock);
  6596. if (attributes != NULL)
  6597. MEMBER_SET(method, mAttributes, attributes);
  6598. methods.push_back(method);
  6599. }
  6600. }
  6601. BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int depth, BfAstNode* deferredHeadNode)
  6602. {
  6603. // SetAndRestoreValue<BfAstNode*> prevTypeMemberNodeStart(mTypeMemberNodeStart, node, false);
  6604. // if (depth == 0)
  6605. // prevTypeMemberNodeStart.Set();
  6606. if (mCurTypeDecl != NULL)
  6607. {
  6608. if (!AssertCurrentNode(node))
  6609. return NULL;
  6610. }
  6611. BfTokenNode* refToken = NULL;
  6612. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(node))
  6613. {
  6614. BfToken token = tokenNode->GetToken();
  6615. bool isTypeRef = false;
  6616. if ((token == BfToken_Delegate) || (token == BfToken_Function))
  6617. {
  6618. // We need to differentiate between a delegate type reference and a delegate type declaration
  6619. int endNodeIdx = -1;
  6620. if (IsTypeReference(node, BfToken_LParen, -1, &endNodeIdx))
  6621. {
  6622. isTypeRef = true;
  6623. }
  6624. }
  6625. if (BfTokenIsTypeDecl(token))
  6626. {
  6627. int endNodeIdx = -1;
  6628. if (IsTypeReference(node, BfToken_None, -1, &endNodeIdx))
  6629. {
  6630. isTypeRef = true;
  6631. }
  6632. }
  6633. if ((token == BfToken_LBracket) && (depth > 0))
  6634. {
  6635. // The only valid option is an attributed type reference
  6636. isTypeRef = true;
  6637. }
  6638. if (isTypeRef)
  6639. {
  6640. // Handled below
  6641. }
  6642. else if ((token == BfToken_Ref) || (token == BfToken_Mut))
  6643. {
  6644. refToken = tokenNode;
  6645. mVisitorPos.MoveNext();
  6646. // Read type member
  6647. }
  6648. else if ((token == BfToken_Var) ||
  6649. (token == BfToken_Let) ||
  6650. (token == BfToken_AllocType) ||
  6651. (token == BfToken_RetType) ||
  6652. (token == BfToken_Nullable) ||
  6653. (token == BfToken_Comptype) ||
  6654. (token == BfToken_Decltype) ||
  6655. (token == BfToken_LParen))
  6656. {
  6657. // Read type member
  6658. }
  6659. else
  6660. {
  6661. SetAndRestoreValue<BfAstNode*> prevTypeMemberNodeStart(mTypeMemberNodeStart, tokenNode, !declStarted);
  6662. return ReadTypeMember(tokenNode, declStarted, depth, deferredHeadNode);
  6663. }
  6664. }
  6665. else if (auto block = BfNodeDynCast<BfBlock>(node))
  6666. {
  6667. Fail("Expected method declaration", node);
  6668. HandleBlock(block);
  6669. auto methodDecl = mAlloc->Alloc<BfMethodDeclaration>();
  6670. ReplaceNode(block, methodDecl);
  6671. methodDecl->mDocumentation = FindDocumentation(methodDecl);
  6672. methodDecl->mBody = block;
  6673. return methodDecl;
  6674. }
  6675. BfTokenNode* indexerThisToken = NULL;
  6676. bool isIndexProp = false;
  6677. auto origNode = node;
  6678. if (refToken != NULL)
  6679. {
  6680. auto nextNode = mVisitorPos.Get(mVisitorPos.mReadPos);
  6681. if (nextNode != NULL)
  6682. node = nextNode;
  6683. }
  6684. auto typeRef = CreateTypeRef(node);
  6685. if (typeRef == NULL)
  6686. {
  6687. if (refToken != NULL)
  6688. {
  6689. AddErrorNode(refToken);
  6690. if (mVisitorPos.Get(mVisitorPos.mReadPos) == node)
  6691. {
  6692. mVisitorPos.mReadPos--;
  6693. return NULL;
  6694. }
  6695. }
  6696. #ifdef BF_AST_HAS_PARENT_MEMBER
  6697. BF_ASSERT(node->mParent != NULL);
  6698. #endif
  6699. AddErrorNode(node);
  6700. return NULL;
  6701. }
  6702. if (refToken != NULL)
  6703. typeRef = CreateRefTypeRef(typeRef, refToken);
  6704. node = typeRef;
  6705. auto nextNode = mVisitorPos.GetNext();
  6706. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  6707. {
  6708. if (tokenNode->GetToken() == BfToken_This)
  6709. indexerThisToken = tokenNode;
  6710. }
  6711. BfTokenNode* explicitInterfaceDot = NULL;
  6712. BfTypeReference* explicitInterface = NULL;
  6713. bool forceIsMethod = false;
  6714. nextNode = mVisitorPos.GetNext();
  6715. auto nameIdentifier = BfNodeDynCast<BfIdentifierNode>(nextNode);
  6716. if (nameIdentifier != NULL)
  6717. {
  6718. mVisitorPos.MoveNext();
  6719. bool doExplicitInterface = false;
  6720. int endNodeIdx = -1;
  6721. //mVisitorPos.mReadPos++;
  6722. int nameIdentifierIdx = mVisitorPos.mReadPos;
  6723. doExplicitInterface = IsTypeReference(nameIdentifier, BfToken_LParen, -1, &endNodeIdx);
  6724. //mVisitorPos.mReadPos--;
  6725. BfAstNode* endNode = mVisitorPos.Get(endNodeIdx);
  6726. if (!doExplicitInterface)
  6727. {
  6728. if (auto endToken = BfNodeDynCastExact<BfTokenNode>(endNode))
  6729. {
  6730. if (endToken->GetToken() == BfToken_This)
  6731. {
  6732. indexerThisToken = endToken;
  6733. doExplicitInterface = true;
  6734. }
  6735. }
  6736. else if (auto block = BfNodeDynCastExact<BfBlock>(endNode))
  6737. {
  6738. doExplicitInterface = true; // Qualified property
  6739. }
  6740. }
  6741. // Experimental 'more permissive' explicit interface check
  6742. if (endNodeIdx != -1)
  6743. doExplicitInterface = true;
  6744. if (doExplicitInterface)
  6745. {
  6746. auto prevEndNode = mVisitorPos.Get(endNodeIdx - 1);
  6747. int explicitInterfaceDotIdx = QualifiedBacktrack(prevEndNode, endNodeIdx - 1);
  6748. if (explicitInterfaceDotIdx != -1)
  6749. {
  6750. explicitInterfaceDot = (BfTokenNode*)mVisitorPos.Get(explicitInterfaceDotIdx);
  6751. mVisitorPos.mReadPos = nameIdentifierIdx;
  6752. explicitInterfaceDot->SetToken(BfToken_Bar); // Hack to stop TypeRef parsing
  6753. explicitInterface = CreateTypeRef(nameIdentifier);
  6754. explicitInterfaceDot->SetToken(BfToken_Dot);
  6755. if (explicitInterface == NULL)
  6756. return NULL;
  6757. mVisitorPos.mReadPos = explicitInterfaceDotIdx;
  6758. if (indexerThisToken == NULL)
  6759. {
  6760. nameIdentifier = ExpectIdentifierAfter(explicitInterfaceDot);
  6761. if (nameIdentifier == NULL)
  6762. {
  6763. // Looks like a method declaration
  6764. auto methodDeclaration = mAlloc->Alloc<BfMethodDeclaration>();
  6765. BfDeferredAstSizedArray<BfParameterDeclaration*> params(methodDeclaration->mParams, mAlloc);
  6766. BfDeferredAstSizedArray<BfTokenNode*> commas(methodDeclaration->mCommas, mAlloc);
  6767. if (typeRef != NULL)
  6768. ReplaceNode(typeRef, methodDeclaration);
  6769. else
  6770. ReplaceNode(nameIdentifier, methodDeclaration);
  6771. methodDeclaration->mDocumentation = FindDocumentation(mTypeMemberNodeStart);
  6772. MEMBER_SET(methodDeclaration, mReturnType, typeRef);
  6773. CheckMultiuseAttributeTypeRef(methodDeclaration->mReturnType);
  6774. MEMBER_SET(methodDeclaration, mExplicitInterface, explicitInterface);
  6775. MEMBER_SET(methodDeclaration, mExplicitInterfaceDotToken, explicitInterfaceDot);
  6776. return methodDeclaration;
  6777. }
  6778. }
  6779. }
  6780. }
  6781. }
  6782. else if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  6783. {
  6784. if (nextToken->mToken == BfToken_Operator)
  6785. {
  6786. auto operatorDecl = mAlloc->Alloc<BfOperatorDeclaration>();
  6787. BfDeferredAstSizedArray<BfParameterDeclaration*> params(operatorDecl->mParams, mAlloc);
  6788. BfDeferredAstSizedArray<BfTokenNode*> commas(operatorDecl->mCommas, mAlloc);
  6789. ReplaceNode(typeRef, operatorDecl);
  6790. operatorDecl->mReturnType = typeRef;
  6791. CheckMultiuseAttributeTypeRef(operatorDecl->mReturnType);
  6792. mVisitorPos.MoveNext();
  6793. MEMBER_SET(operatorDecl, mOperatorToken, nextToken);
  6794. bool hadFailedOperator = false;
  6795. auto nextNode = mVisitorPos.GetNext();
  6796. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  6797. {
  6798. if ((nextToken->mToken == BfToken_Implicit) || (nextToken->mToken == BfToken_Explicit))
  6799. {
  6800. operatorDecl->mIsConvOperator = true;
  6801. MEMBER_SET(operatorDecl, mOpTypeToken, nextToken);
  6802. mVisitorPos.MoveNext();
  6803. }
  6804. else
  6805. {
  6806. operatorDecl->mBinOp = BfTokenToBinaryOp(nextToken->GetToken());
  6807. if (operatorDecl->mBinOp != BfBinaryOp_None)
  6808. {
  6809. MEMBER_SET(operatorDecl, mOpTypeToken, nextToken);
  6810. mVisitorPos.MoveNext();
  6811. }
  6812. else
  6813. {
  6814. operatorDecl->mUnaryOp = BfTokenToUnaryOp(nextToken->GetToken());
  6815. if (operatorDecl->mUnaryOp != BfUnaryOp_None)
  6816. {
  6817. MEMBER_SET(operatorDecl, mOpTypeToken, nextToken);
  6818. mVisitorPos.MoveNext();
  6819. }
  6820. else
  6821. {
  6822. operatorDecl->mAssignOp = BfTokenToAssignmentOp(nextToken->GetToken());
  6823. if (operatorDecl->mAssignOp == BfAssignmentOp_Assign)
  6824. {
  6825. Fail("The assignment operator '=' cannot be overridden", nextToken);
  6826. }
  6827. if (operatorDecl->mAssignOp != BfAssignmentOp_None)
  6828. {
  6829. MEMBER_SET(operatorDecl, mOpTypeToken, nextToken);
  6830. mVisitorPos.MoveNext();
  6831. }
  6832. else if (nextToken->GetToken() != BfToken_LParen)
  6833. {
  6834. Fail("Invalid operator type", nextToken);
  6835. MEMBER_SET(operatorDecl, mOpTypeToken, nextToken);
  6836. mVisitorPos.MoveNext();
  6837. }
  6838. }
  6839. }
  6840. }
  6841. }
  6842. if ((operatorDecl->mOpTypeToken == NULL) && (operatorDecl->mReturnType == NULL) && (!hadFailedOperator))
  6843. {
  6844. FailAfter("Expected operator type", operatorDecl);
  6845. return NULL;
  6846. }
  6847. ParseMethod(operatorDecl, &params, &commas);
  6848. if (params.size() == 1)
  6849. {
  6850. if (operatorDecl->mBinOp == BfBinaryOp_Add)
  6851. {
  6852. operatorDecl->mBinOp = BfBinaryOp_None;
  6853. operatorDecl->mUnaryOp = BfUnaryOp_Positive;
  6854. }
  6855. else if (operatorDecl->mBinOp == BfBinaryOp_Subtract)
  6856. {
  6857. operatorDecl->mBinOp = BfBinaryOp_None;
  6858. operatorDecl->mUnaryOp = BfUnaryOp_Negate;
  6859. }
  6860. }
  6861. return operatorDecl;
  6862. }
  6863. else if (nextToken->mToken == BfToken_LParen)
  6864. {
  6865. Fail("Method return type expected", node);
  6866. nameIdentifier = BfNodeDynCast<BfIdentifierNode>(origNode);
  6867. if (nameIdentifier != NULL)
  6868. {
  6869. // Remove TypeRef
  6870. ReplaceNode(typeRef, nameIdentifier);
  6871. typeRef = NULL;
  6872. }
  6873. }
  6874. else if (nextToken->mToken == BfToken_Semicolon)
  6875. {
  6876. forceIsMethod = true;
  6877. }
  6878. }
  6879. if ((nameIdentifier != NULL) || (forceIsMethod) || (indexerThisToken != NULL))
  6880. {
  6881. //ExtractExplicitInterfaceRef
  6882. int blockAfterIdx = mVisitorPos.mReadPos + 1;
  6883. BfAstNode* blockAfterPos = nameIdentifier;
  6884. BfPropertyDeclaration* propertyDeclaration = NULL;
  6885. if ((indexerThisToken != NULL) && (mVisitorPos.GetNext() != indexerThisToken))
  6886. {
  6887. indexerThisToken = NULL;
  6888. }
  6889. if (indexerThisToken != NULL)
  6890. {
  6891. auto indexerDeclaration = mAlloc->Alloc<BfIndexerDeclaration>();
  6892. BfDeferredAstSizedArray<BfParameterDeclaration*> params(indexerDeclaration->mParams, mAlloc);
  6893. BfDeferredAstSizedArray<BfTokenNode*> commas(indexerDeclaration->mCommas, mAlloc);
  6894. ReplaceNode(typeRef, indexerDeclaration);
  6895. indexerDeclaration->mTypeRef = typeRef;
  6896. MEMBER_SET(indexerDeclaration, mThisToken, indexerThisToken);
  6897. mVisitorPos.MoveNext();
  6898. if (explicitInterface != NULL)
  6899. {
  6900. MEMBER_SET(indexerDeclaration, mExplicitInterface, explicitInterface);
  6901. MEMBER_SET(indexerDeclaration, mExplicitInterfaceDotToken, explicitInterfaceDot);
  6902. //mVisitorPos.mReadPos = endNodeIdx;
  6903. }
  6904. auto openToken = ExpectTokenAfter(indexerDeclaration, BfToken_LBracket);
  6905. if (openToken == NULL)
  6906. return indexerDeclaration;
  6907. MEMBER_SET(indexerDeclaration, mOpenBracket, openToken);
  6908. auto endToken = ParseMethodParams(indexerDeclaration, &params, &commas, BfToken_RBracket, false);
  6909. if (endToken == NULL)
  6910. return indexerDeclaration;
  6911. MEMBER_SET(indexerDeclaration, mCloseBracket, endToken);
  6912. propertyDeclaration = indexerDeclaration;
  6913. blockAfterPos = propertyDeclaration;
  6914. mVisitorPos.MoveNext();
  6915. blockAfterIdx = mVisitorPos.mReadPos + 1;
  6916. }
  6917. else
  6918. {
  6919. blockAfterPos = nameIdentifier;
  6920. }
  6921. nextNode = mVisitorPos.Get(blockAfterIdx);
  6922. auto block = BfNodeDynCast<BfBlock>(nextNode);
  6923. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  6924. bool isExprBodyProp = (tokenNode != NULL) && ((tokenNode->mToken == BfToken_FatArrow) || (tokenNode->mToken == BfToken_Mut));
  6925. // Property.
  6926. // If we don't have a token afterwards then still treat it as a property for autocomplete purposes
  6927. if ((typeRef != NULL) &&
  6928. ((block != NULL) || (tokenNode == NULL) || (isExprBodyProp)))
  6929. {
  6930. if (propertyDeclaration == NULL)
  6931. {
  6932. if ((block == NULL) && (!isExprBodyProp))
  6933. {
  6934. auto propDecl = mAlloc->Alloc<BfPropertyDeclaration>();
  6935. ReplaceNode(typeRef, propDecl);
  6936. propDecl->mDocumentation = FindDocumentation(mTypeMemberNodeStart);
  6937. propDecl->mTypeRef = typeRef;
  6938. CheckMultiuseAttributeTypeRef(propDecl->mTypeRef);
  6939. if (explicitInterface != NULL)
  6940. {
  6941. MEMBER_SET(propDecl, mExplicitInterface, explicitInterface);
  6942. MEMBER_SET(propDecl, mExplicitInterfaceDotToken, explicitInterfaceDot);
  6943. }
  6944. // Don't set the name identifier, this could be bogus
  6945. //mVisitorPos.mReadPos--;
  6946. // WHY did we want to not set this?
  6947. // If we don't, then typing a new method name will end up treating the name node as a typeRef
  6948. // which can autocomplete incorrectly
  6949. MEMBER_SET(propDecl, mNameNode, nameIdentifier);
  6950. return propDecl;
  6951. }
  6952. mVisitorPos.mReadPos = blockAfterIdx;
  6953. propertyDeclaration = mAlloc->Alloc<BfPropertyDeclaration>();
  6954. ReplaceNode(typeRef, propertyDeclaration);
  6955. propertyDeclaration->mDocumentation = FindDocumentation(mTypeMemberNodeStart);
  6956. propertyDeclaration->mTypeRef = typeRef;
  6957. if (explicitInterface != NULL)
  6958. {
  6959. MEMBER_SET(propertyDeclaration, mExplicitInterface, explicitInterface);
  6960. MEMBER_SET(propertyDeclaration, mExplicitInterfaceDotToken, explicitInterfaceDot);
  6961. }
  6962. MEMBER_SET(propertyDeclaration, mNameNode, nameIdentifier);
  6963. //mVisitorPos.MoveNext();
  6964. }
  6965. else
  6966. mVisitorPos.mReadPos = blockAfterIdx;
  6967. if (block != NULL)
  6968. {
  6969. MEMBER_SET(propertyDeclaration, mDefinitionBlock, block);
  6970. ReadPropertyBlock(propertyDeclaration, block);
  6971. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  6972. {
  6973. if (tokenNode->mToken == BfToken_AssignEquals)
  6974. {
  6975. MEMBER_SET(propertyDeclaration, mEqualsNode, tokenNode);
  6976. mVisitorPos.MoveNext();
  6977. auto initExpr = CreateExpressionAfter(propertyDeclaration);
  6978. if (initExpr != NULL)
  6979. {
  6980. MEMBER_SET(propertyDeclaration, mInitializer, initExpr);
  6981. }
  6982. }
  6983. }
  6984. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  6985. {
  6986. if (tokenNode->mToken == BfToken_Tilde)
  6987. {
  6988. auto fieldDtor = CreateFieldDtorDeclaration(propertyDeclaration);
  6989. MEMBER_SET(propertyDeclaration, mFieldDtor, fieldDtor);
  6990. }
  6991. }
  6992. }
  6993. else if (isExprBodyProp)
  6994. {
  6995. BfDeferredAstSizedArray<BfPropertyMethodDeclaration*> methods(propertyDeclaration->mMethods, mAlloc);
  6996. auto propertyBodyExpr = mAlloc->Alloc<BfPropertyBodyExpression>();
  6997. ReplaceNode(tokenNode, propertyBodyExpr);
  6998. BfTokenNode* mutSpecifier = NULL;
  6999. if (tokenNode->mToken == BfToken_Mut)
  7000. {
  7001. MEMBER_SET(propertyBodyExpr, mMutSpecifier, tokenNode);
  7002. tokenNode = ExpectTokenAfter(tokenNode, BfToken_FatArrow);
  7003. }
  7004. if (tokenNode != NULL)
  7005. {
  7006. MEMBER_SET(propertyBodyExpr, mFatTokenArrow, tokenNode);
  7007. auto method = mAlloc->Alloc<BfPropertyMethodDeclaration>();
  7008. method->mPropertyDeclaration = propertyDeclaration;
  7009. method->mNameNode = propertyDeclaration->mNameNode;
  7010. auto expr = CreateExpressionAfter(tokenNode);
  7011. if (expr != NULL)
  7012. {
  7013. MEMBER_SET(method, mBody, expr);
  7014. propertyDeclaration->SetSrcEnd(expr->GetSrcEnd());
  7015. auto endSemicolon = ExpectTokenAfter(expr, BfToken_Semicolon);
  7016. if (endSemicolon != NULL)
  7017. MEMBER_SET(method, mEndSemicolon, endSemicolon);
  7018. }
  7019. methods.Add(method);
  7020. }
  7021. MEMBER_SET(propertyDeclaration, mDefinitionBlock, propertyBodyExpr);
  7022. }
  7023. return propertyDeclaration;
  7024. }
  7025. else if (propertyDeclaration != NULL)
  7026. {
  7027. // Failure case
  7028. block = ExpectBlockAfter(blockAfterPos);
  7029. BF_ASSERT(block == NULL);
  7030. return propertyDeclaration;
  7031. }
  7032. //nextNode = mVisitorPos.Get(mVisitorPos.mReadPos + 2);
  7033. /*if (tokenNode == NULL)
  7034. {
  7035. mVisitorPos.MoveNext();
  7036. ExpectTokenAfter(nameIdentifier, BfToken_Semicolon);
  7037. // Just 'eat' the typeRef by stuffing it into a property declaration
  7038. auto fieldDecl = mAlloc->Alloc<BfPropertyDeclaration>();
  7039. ReplaceNode(typeRef, fieldDecl);
  7040. fieldDecl->mTypeRef = typeRef;
  7041. return fieldDecl;
  7042. }*/
  7043. if (tokenNode == NULL)
  7044. {
  7045. auto fieldDecl = mAlloc->Alloc<BfPropertyDeclaration>();
  7046. ReplaceNode(nameIdentifier, fieldDecl);
  7047. fieldDecl->mDocumentation = FindDocumentation(mTypeMemberNodeStart);
  7048. fieldDecl->mNameNode = nameIdentifier;
  7049. return fieldDecl;
  7050. }
  7051. BfToken token = tokenNode->GetToken();
  7052. if ((token == BfToken_LParen) ||
  7053. (token == BfToken_LChevron))
  7054. {
  7055. if (token == BfToken_LChevron)
  7056. {
  7057. bool isTypeRef = IsTypeReference(nameIdentifier, BfToken_LParen);
  7058. if (!isTypeRef)
  7059. {
  7060. bool onNewLine = false;
  7061. auto src = nameIdentifier->GetSourceData();
  7062. int srcStart = nameIdentifier->GetSrcStart();
  7063. for (int srcIdx = typeRef->GetSrcEnd(); srcIdx < srcStart; srcIdx++)
  7064. if (src->mSrc[srcIdx] == '\n')
  7065. onNewLine = false;
  7066. if (onNewLine)
  7067. {
  7068. // Actually it looks like a partially formed type declaration followed by a method
  7069. // which returns a generic type
  7070. FailAfter("Name expected", typeRef);
  7071. auto fieldDecl = mAlloc->Alloc<BfFieldDeclaration>();
  7072. ReplaceNode(typeRef, fieldDecl);
  7073. fieldDecl->mDocumentation = FindDocumentation(mTypeMemberNodeStart);
  7074. fieldDecl->mTypeRef = typeRef;
  7075. CheckMultiuseAttributeTypeRef(fieldDecl->mTypeRef);
  7076. return fieldDecl;
  7077. }
  7078. }
  7079. }
  7080. // Looks like a method declaration
  7081. auto methodDeclaration = mAlloc->Alloc<BfMethodDeclaration>();
  7082. BfDeferredAstSizedArray<BfParameterDeclaration*> params(methodDeclaration->mParams, mAlloc);
  7083. BfDeferredAstSizedArray<BfTokenNode*> commas(methodDeclaration->mCommas, mAlloc);
  7084. if (typeRef != NULL)
  7085. ReplaceNode(typeRef, methodDeclaration);
  7086. else
  7087. ReplaceNode(nameIdentifier, methodDeclaration);
  7088. methodDeclaration->mDocumentation = FindDocumentation(mTypeMemberNodeStart);
  7089. if (explicitInterface != NULL)
  7090. {
  7091. MEMBER_SET(methodDeclaration, mExplicitInterface, explicitInterface);
  7092. MEMBER_SET(methodDeclaration, mExplicitInterfaceDotToken, explicitInterfaceDot);
  7093. }
  7094. if (token == BfToken_LChevron)
  7095. {
  7096. auto genericParams = CreateGenericParamsDeclaration(tokenNode);
  7097. if (genericParams != NULL)
  7098. {
  7099. MEMBER_SET(methodDeclaration, mGenericParams, genericParams);
  7100. }
  7101. }
  7102. methodDeclaration->mReturnType = typeRef;
  7103. CheckMultiuseAttributeTypeRef(methodDeclaration->mReturnType);
  7104. MEMBER_SET_CHECKED(methodDeclaration, mNameNode, nameIdentifier);
  7105. mCurMethodDecl = methodDeclaration;
  7106. ParseMethod(methodDeclaration, &params, &commas);
  7107. mCurMethodDecl = NULL;
  7108. return methodDeclaration;
  7109. }
  7110. return CreateFieldDeclaration(tokenNode, typeRef, nameIdentifier, NULL);
  7111. }
  7112. FailAfter("Member name expected", node);
  7113. // Same fail case as "expected member declaration"
  7114. auto fieldDecl = mAlloc->Alloc<BfPropertyDeclaration>();
  7115. ReplaceNode(typeRef, fieldDecl);
  7116. fieldDecl->mDocumentation = FindDocumentation(mTypeMemberNodeStart);
  7117. fieldDecl->mTypeRef = typeRef;
  7118. return fieldDecl;
  7119. }
  7120. BfInvocationExpression* BfReducer::CreateInvocationExpression(BfAstNode* target, CreateExprFlags createExprFlags)
  7121. {
  7122. auto tokenNode = ExpectTokenAfter(target, BfToken_LParen, BfToken_LChevron, BfToken_Bang);
  7123. auto invocationExpr = mAlloc->Alloc<BfInvocationExpression>();
  7124. BfDeferredAstSizedArray<BfExpression*> arguments(invocationExpr->mArguments, mAlloc);
  7125. BfDeferredAstSizedArray<BfTokenNode*> commas(invocationExpr->mCommas, mAlloc);
  7126. invocationExpr->mTarget = target;
  7127. ReplaceNode(target, invocationExpr);
  7128. if (tokenNode == NULL)
  7129. return invocationExpr;
  7130. if (tokenNode->GetToken() == BfToken_Bang)
  7131. {
  7132. MoveNode(tokenNode, invocationExpr);
  7133. if (tokenNode->GetSrcEnd() == invocationExpr->mTarget->GetSrcEnd() + 1)
  7134. {
  7135. BfAstNode* target = invocationExpr->mTarget;
  7136. while (true)
  7137. {
  7138. if (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(target))
  7139. target = qualifiedNameNode->mRight;
  7140. else if (auto memberRefExpr = BfNodeDynCast<BfMemberReferenceExpression>(target))
  7141. target = memberRefExpr->mMemberName;
  7142. else if (auto attribIdentifierNode = BfNodeDynCast<BfAttributedIdentifierNode>(target))
  7143. target = attribIdentifierNode->mIdentifier;
  7144. else
  7145. break;
  7146. }
  7147. if (target != NULL)
  7148. {
  7149. BF_ASSERT(tokenNode->GetSrcEnd() == target->GetSrcEnd() + 1);
  7150. target->SetSrcEnd(tokenNode->GetSrcEnd());
  7151. invocationExpr->mTarget->SetSrcEnd(tokenNode->GetSrcEnd());
  7152. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  7153. {
  7154. if ((nextToken->GetToken() == BfToken_Colon) || (nextToken->GetToken() == BfToken_ColonColon))
  7155. {
  7156. auto scopedInvocationTarget = CreateScopedInvocationTarget(invocationExpr->mTarget, nextToken);
  7157. invocationExpr->SetSrcEnd(scopedInvocationTarget->GetSrcEnd());
  7158. }
  7159. }
  7160. }
  7161. }
  7162. else
  7163. Fail("No space allowed before token", tokenNode);
  7164. tokenNode = ExpectTokenAfter(invocationExpr, BfToken_LParen, BfToken_LChevron);
  7165. if (tokenNode == NULL)
  7166. return invocationExpr;
  7167. }
  7168. if (tokenNode->GetToken() == BfToken_LChevron)
  7169. {
  7170. auto genericParamsDecl = CreateGenericArguments(tokenNode, true);
  7171. MEMBER_SET_CHECKED(invocationExpr, mGenericArgs, genericParamsDecl);
  7172. tokenNode = ExpectTokenAfter(invocationExpr, BfToken_LParen);
  7173. }
  7174. MEMBER_SET_CHECKED(invocationExpr, mOpenParen, tokenNode);
  7175. tokenNode = ReadArguments(invocationExpr, invocationExpr, &arguments, &commas, BfToken_RParen, true);
  7176. if (tokenNode != NULL)
  7177. {
  7178. MEMBER_SET(invocationExpr, mCloseParen, tokenNode);
  7179. }
  7180. return invocationExpr;
  7181. }
  7182. BfInitializerExpression* BfReducer::TryCreateInitializerExpression(BfAstNode* target)
  7183. {
  7184. auto block = BfNodeDynCast<BfBlock>(mVisitorPos.GetNext());
  7185. if (block == NULL)
  7186. return NULL;
  7187. bool allowInitializerStatement = false;
  7188. auto objectCreateExpr = BfNodeDynCast<BfObjectCreateExpression>(target);
  7189. if (objectCreateExpr != NULL)
  7190. allowInitializerStatement = true;
  7191. mVisitorPos.MoveNext();
  7192. auto initializerExpr = mAlloc->Alloc<BfInitializerExpression>();
  7193. ReplaceNode(target, initializerExpr);
  7194. initializerExpr->mTarget = target;
  7195. MEMBER_SET(initializerExpr, mOpenBrace, block->mOpenBrace);
  7196. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
  7197. bool isDone = !mVisitorPos.MoveNext();
  7198. BfDeferredAstNodeSizedArray<BfExpression*> values(initializerExpr, initializerExpr->mValues, mAlloc);
  7199. BfDeferredAstNodeSizedArray<BfTokenNode*> commas(initializerExpr, initializerExpr->mCommas, mAlloc);
  7200. int initializerStartIdx = 0;
  7201. int minTypeDeclEnd = 0;
  7202. BfAstNode* nextNode = NULL;
  7203. while (!isDone)
  7204. {
  7205. BfAstNode* node = mVisitorPos.GetCurrent();
  7206. if (node == NULL)
  7207. break;
  7208. initializerExpr->mSrcEnd = node->mSrcEnd;
  7209. if ((values.IsEmpty()) && (initializerExpr->mInlineTypeRef == NULL))
  7210. {
  7211. if ((allowInitializerStatement) && (!IsInitializerStatement(node)))
  7212. {
  7213. auto defBlock = mAlloc->Alloc<BfBlock>();
  7214. ReplaceNode(block, defBlock);
  7215. *defBlock = *block;
  7216. auto typeDecl = mAlloc->Alloc<BfInitializerTypeDeclaration>();
  7217. ReplaceNode(node, typeDecl);
  7218. defBlock->mOpenBrace = NULL;
  7219. MEMBER_SET(typeDecl, mDefineNode, defBlock);
  7220. InitAnonymousType(typeDecl);
  7221. HandleTypeDeclaration(typeDecl, NULL, NULL, true);
  7222. initializerStartIdx = mVisitorPos.mWritePos;
  7223. auto typeRef = mAlloc->Alloc<BfInlineTypeReference>();
  7224. ReplaceNode(typeDecl, typeRef);
  7225. typeRef->mTypeDeclaration = typeDecl;
  7226. MEMBER_SET(initializerExpr, mInlineTypeRef, typeRef);
  7227. if (objectCreateExpr != NULL)
  7228. {
  7229. BfDeferredAstSizedArray<BfTypeReference*> baseClasses(typeDecl->mBaseClasses, mAlloc);
  7230. baseClasses.Add(objectCreateExpr->mTypeRef);
  7231. }
  7232. continue;
  7233. }
  7234. }
  7235. auto expr = CreateExpression(node, BfReducer::CreateExprFlags_AllowAnonymousIndexer);
  7236. isDone = !mVisitorPos.MoveNext();
  7237. if (expr != NULL)
  7238. values.Add(expr);
  7239. else
  7240. AddErrorNode(node);
  7241. if (!isDone)
  7242. {
  7243. bool foundComma = false;
  7244. node = mVisitorPos.GetCurrent();
  7245. if (node != NULL)
  7246. {
  7247. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(node))
  7248. {
  7249. if (tokenNode->mToken == BfToken_Comma)
  7250. {
  7251. foundComma = true;
  7252. commas.Add(tokenNode);
  7253. isDone = !mVisitorPos.MoveNext();
  7254. }
  7255. }
  7256. if (!foundComma)
  7257. Fail("Expected ','", node);
  7258. }
  7259. }
  7260. }
  7261. mVisitorPos.Trim();
  7262. if (initializerExpr->mInlineTypeRef != NULL)
  7263. {
  7264. auto typeDecl = initializerExpr->mInlineTypeRef->mTypeDeclaration;
  7265. if (initializerStartIdx != 0)
  7266. {
  7267. block->SetSize(initializerStartIdx);
  7268. int srcEnd = block->mSrcEnd;
  7269. if (initializerStartIdx > 0)
  7270. srcEnd = block->mChildArr[initializerStartIdx - 1]->mSrcEnd;
  7271. typeDecl->mDefineNode->mSrcEnd = srcEnd;
  7272. typeDecl->mSrcEnd = srcEnd;
  7273. }
  7274. typeDecl->mSrcEnd = BF_MAX(typeDecl->mSrcEnd, minTypeDeclEnd);
  7275. initializerExpr->mInlineTypeRef->mSrcEnd = typeDecl->mSrcEnd;
  7276. }
  7277. if (block->mCloseBrace != NULL)
  7278. MEMBER_SET(initializerExpr, mCloseBrace, block->mCloseBrace);
  7279. return initializerExpr;
  7280. }
  7281. BfDelegateBindExpression* BfReducer::CreateDelegateBindExpression(BfAstNode* allocNode)
  7282. {
  7283. auto delegateBindExpr = mAlloc->Alloc<BfDelegateBindExpression>();
  7284. ReplaceNode(allocNode, delegateBindExpr);
  7285. MEMBER_SET(delegateBindExpr, mNewToken, allocNode);
  7286. auto tokenNode = ExpectTokenAfter(delegateBindExpr, BfToken_FatArrow);
  7287. MEMBER_SET_CHECKED(delegateBindExpr, mFatArrowToken, tokenNode);
  7288. auto expr = CreateExpressionAfter(delegateBindExpr);
  7289. MEMBER_SET_CHECKED(delegateBindExpr, mTarget, expr);
  7290. auto nextNode = mVisitorPos.GetNext();
  7291. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  7292. {
  7293. if (tokenNode->GetToken() == BfToken_LChevron)
  7294. {
  7295. mVisitorPos.MoveNext();
  7296. auto genericParamsDecl = CreateGenericArguments(tokenNode);
  7297. MEMBER_SET_CHECKED(delegateBindExpr, mGenericArgs, genericParamsDecl);
  7298. }
  7299. }
  7300. return delegateBindExpr;
  7301. }
  7302. BfLambdaBindExpression* BfReducer::CreateLambdaBindExpression(BfAstNode* allocNode, BfTokenNode* parenToken)
  7303. {
  7304. auto lambdaBindExpr = mAlloc->Alloc<BfLambdaBindExpression>();
  7305. BfDeferredAstSizedArray<BfIdentifierNode*> params(lambdaBindExpr->mParams, mAlloc);
  7306. BfDeferredAstSizedArray<BfTokenNode*> commas(lambdaBindExpr->mCommas, mAlloc);
  7307. BfTokenNode* tokenNode;
  7308. if (allocNode != NULL)
  7309. {
  7310. ReplaceNode(allocNode, lambdaBindExpr);
  7311. MEMBER_SET(lambdaBindExpr, mNewToken, allocNode);
  7312. tokenNode = ExpectTokenAfter(lambdaBindExpr, BfToken_LParen, BfToken_LBracket);
  7313. }
  7314. else
  7315. {
  7316. ReplaceNode(parenToken, lambdaBindExpr);
  7317. tokenNode = parenToken;
  7318. }
  7319. if (tokenNode == NULL)
  7320. return lambdaBindExpr;
  7321. MEMBER_SET_CHECKED(lambdaBindExpr, mOpenParen, tokenNode);
  7322. for (int paramIdx = 0; true; paramIdx++)
  7323. {
  7324. bool isRParen = false;
  7325. auto nextNode = mVisitorPos.GetNext();
  7326. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  7327. isRParen = tokenNode->GetToken() == BfToken_RParen;
  7328. if (!isRParen)
  7329. {
  7330. auto nameIdentifier = ExpectIdentifierAfter(lambdaBindExpr, "parameter name");
  7331. if (nameIdentifier == NULL)
  7332. return lambdaBindExpr;
  7333. MoveNode(nameIdentifier, lambdaBindExpr);
  7334. params.push_back(nameIdentifier);
  7335. }
  7336. tokenNode = ExpectTokenAfter(lambdaBindExpr, BfToken_Comma, BfToken_RParen);
  7337. if (tokenNode == NULL)
  7338. return lambdaBindExpr;
  7339. if (tokenNode->GetToken() == BfToken_RParen)
  7340. {
  7341. MEMBER_SET(lambdaBindExpr, mCloseParen, tokenNode);
  7342. break;
  7343. }
  7344. MoveNode(tokenNode, lambdaBindExpr);
  7345. commas.push_back(tokenNode);
  7346. }
  7347. tokenNode = ExpectTokenAfter(lambdaBindExpr, BfToken_FatArrow);
  7348. MEMBER_SET_CHECKED(lambdaBindExpr, mFatArrowToken, tokenNode);
  7349. auto nextNode = mVisitorPos.GetNext();
  7350. auto block = BfNodeDynCast<BfBlock>(nextNode);
  7351. if (block != NULL)
  7352. {
  7353. HandleBlock(block, true);
  7354. mVisitorPos.MoveNext();
  7355. MEMBER_SET_CHECKED(lambdaBindExpr, mBody, block);
  7356. }
  7357. else
  7358. {
  7359. auto expr = CreateExpressionAfter(lambdaBindExpr);
  7360. MEMBER_SET_CHECKED(lambdaBindExpr, mBody, expr);
  7361. }
  7362. auto lambdaDtor = CreateFieldDtorDeclaration(lambdaBindExpr);
  7363. if (lambdaDtor != NULL)
  7364. {
  7365. if ((mIsFieldInitializer) && (!mInParenExpr))
  7366. {
  7367. Fail("Ambiguous destructor: could be field destructor or lambda destructor. Disambiguate with parentheses, either '(lambda) ~ fieldDtor' or '(lambda ~ lambdaDtor)'", lambdaBindExpr);
  7368. }
  7369. lambdaBindExpr->mDtor = lambdaDtor;
  7370. }
  7371. return lambdaBindExpr;
  7372. }
  7373. BfCollectionInitializerExpression* BfReducer::CreateCollectionInitializerExpression(BfBlock* block)
  7374. {
  7375. auto arrayInitializerExpression = mAlloc->Alloc<BfCollectionInitializerExpression>();
  7376. BfDeferredAstSizedArray<BfExpression*> values(arrayInitializerExpression->mValues, mAlloc);
  7377. BfDeferredAstSizedArray<BfTokenNode*> commas(arrayInitializerExpression->mCommas, mAlloc);
  7378. ReplaceNode(block, arrayInitializerExpression);
  7379. MEMBER_SET(arrayInitializerExpression, mOpenBrace, block->mOpenBrace);
  7380. if (block->mCloseBrace != NULL)
  7381. MEMBER_SET(arrayInitializerExpression, mCloseBrace, block->mCloseBrace);
  7382. block->mOpenBrace = NULL;
  7383. block->mCloseBrace = NULL;
  7384. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
  7385. bool isDone = !mVisitorPos.MoveNext();
  7386. while (true)
  7387. {
  7388. auto head = mVisitorPos.GetCurrent();
  7389. if (head == NULL)
  7390. break;
  7391. BfExpression* expression;
  7392. if (auto innerBlock = BfNodeDynCast<BfBlock>(head))
  7393. expression = CreateCollectionInitializerExpression(innerBlock);
  7394. else
  7395. expression = CreateExpression(head);
  7396. if (expression == NULL)
  7397. break;
  7398. auto nextNode = mVisitorPos.GetNext();
  7399. bool atEnd = nextNode == NULL;
  7400. auto tokenNode = atEnd ? NULL : ExpectTokenAfter(expression, BfToken_Comma, BfToken_RBrace);
  7401. MoveNode(expression, arrayInitializerExpression);
  7402. values.push_back(expression);
  7403. if ((!atEnd) && (tokenNode == NULL))
  7404. break;
  7405. if (atEnd)
  7406. break;
  7407. MoveNode(tokenNode, arrayInitializerExpression);
  7408. commas.push_back(tokenNode);
  7409. isDone = !mVisitorPos.MoveNext();
  7410. }
  7411. return arrayInitializerExpression;
  7412. }
  7413. BfCollectionInitializerExpression* BfReducer::CreateCollectionInitializerExpression(BfTokenNode* openToken)
  7414. {
  7415. auto arrayInitializerExpression = mAlloc->Alloc<BfCollectionInitializerExpression>();
  7416. BfDeferredAstSizedArray<BfExpression*> values(arrayInitializerExpression->mValues, mAlloc);
  7417. BfDeferredAstSizedArray<BfTokenNode*> commas(arrayInitializerExpression->mCommas, mAlloc);
  7418. ReplaceNode(openToken, arrayInitializerExpression);
  7419. MEMBER_SET(arrayInitializerExpression, mOpenBrace, openToken);
  7420. bool isDone = !mVisitorPos.MoveNext();
  7421. while (true)
  7422. {
  7423. auto head = mVisitorPos.GetCurrent();
  7424. if (head == NULL)
  7425. break;
  7426. BfExpression* expression;
  7427. if (auto innerBlock = BfNodeDynCast<BfBlock>(head))
  7428. expression = CreateCollectionInitializerExpression(innerBlock);
  7429. else
  7430. {
  7431. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(head))
  7432. {
  7433. if (tokenNode->mToken == BfToken_RParen)
  7434. {
  7435. MEMBER_SET(arrayInitializerExpression, mCloseBrace, tokenNode);
  7436. return arrayInitializerExpression;
  7437. }
  7438. }
  7439. expression = CreateExpression(head);
  7440. }
  7441. if (expression == NULL)
  7442. {
  7443. arrayInitializerExpression->mSrcEnd = head->mSrcEnd;
  7444. break;
  7445. }
  7446. auto nextNode = mVisitorPos.GetNext();
  7447. bool atEnd = nextNode == NULL;
  7448. auto tokenNode = atEnd ? NULL : ExpectTokenAfter(expression, BfToken_Comma, BfToken_RParen);
  7449. MoveNode(expression, arrayInitializerExpression);
  7450. values.push_back(expression);
  7451. if ((!atEnd) && (tokenNode == NULL))
  7452. break;
  7453. if (atEnd)
  7454. break;
  7455. MoveNode(tokenNode, arrayInitializerExpression);
  7456. if (tokenNode->GetToken() == BfToken_RParen)
  7457. {
  7458. MEMBER_SET(arrayInitializerExpression, mCloseBrace, tokenNode);
  7459. break;
  7460. }
  7461. commas.push_back(tokenNode);
  7462. isDone = !mVisitorPos.MoveNext();
  7463. }
  7464. return arrayInitializerExpression;
  7465. }
  7466. BfScopedInvocationTarget* BfReducer::CreateScopedInvocationTarget(BfAstNode*& targetRef, BfTokenNode* colonToken)
  7467. {
  7468. auto scopedInvocationTarget = mAlloc->Alloc<BfScopedInvocationTarget>();
  7469. ReplaceNode(targetRef, scopedInvocationTarget);
  7470. scopedInvocationTarget->mTarget = targetRef;
  7471. targetRef = scopedInvocationTarget;
  7472. if (colonToken == NULL)
  7473. return scopedInvocationTarget;
  7474. MEMBER_SET(scopedInvocationTarget, mColonToken, colonToken);
  7475. mVisitorPos.MoveNext();
  7476. if (colonToken->mToken == BfToken_ColonColon)
  7477. return scopedInvocationTarget;
  7478. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  7479. {
  7480. if ((nextToken->GetToken() == BfToken_Colon) || (nextToken->GetToken() == BfToken_Mixin))
  7481. {
  7482. MEMBER_SET(scopedInvocationTarget, mScopeName, nextToken);
  7483. mVisitorPos.MoveNext();
  7484. }
  7485. }
  7486. else if (auto identifier = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext()))
  7487. {
  7488. MEMBER_SET(scopedInvocationTarget, mScopeName, identifier);
  7489. mVisitorPos.MoveNext();
  7490. }
  7491. if (scopedInvocationTarget->mScopeName == NULL)
  7492. {
  7493. FailAfter("Expected scope name", scopedInvocationTarget);
  7494. }
  7495. return scopedInvocationTarget;
  7496. }
  7497. void BfReducer::InitAnonymousType(BfTypeDeclaration* typeDecl)
  7498. {
  7499. int blockId = 0;
  7500. if (auto block = BfNodeDynCast<BfBlock>(typeDecl->mDefineNode))
  7501. {
  7502. blockId = block->mParserBlockId;
  7503. }
  7504. else
  7505. {
  7506. auto parser = mSource->ToParser();
  7507. if (parser != NULL)
  7508. blockId = parser->mCurBlockId + typeDecl->mSrcStart;
  7509. }
  7510. String name;
  7511. auto parserData = typeDecl->GetParserData();
  7512. name = "_Anon_";
  7513. auto parseFileData = parserData->mParseFileData;
  7514. int uniqueId = parseFileData->GetUniqueId(blockId);
  7515. name += StrFormat("%d", uniqueId);
  7516. int len = (int)name.length() + 1;
  7517. typeDecl->mAnonymousName = (char*)mAlloc->AllocBytes(len);
  7518. memcpy(typeDecl->mAnonymousName, name.c_str(), len);
  7519. auto parser = typeDecl->GetParser();
  7520. if ((parser != NULL) && (parser->mIsEmitted))
  7521. {
  7522. Fail("Type declarations are not allowed in emitted code", typeDecl);
  7523. }
  7524. else if (mCurTypeState != NULL)
  7525. {
  7526. mCurTypeState->mAnonymousTypeDecls.Add(typeDecl);
  7527. }
  7528. else
  7529. {
  7530. Fail("Invalid use of anonymous type declaration", typeDecl);
  7531. }
  7532. }
  7533. bool BfReducer::CheckInlineTypeRefAttribute(BfAstNode* typeRef, BfAttributeDirective* attributes)
  7534. {
  7535. if (attributes == NULL)
  7536. return false;
  7537. if (auto inlineTypeRef = BfNodeDynCast<BfInlineTypeReference>(typeRef))
  7538. {
  7539. auto checkAttribute = attributes;
  7540. while (checkAttribute != NULL)
  7541. {
  7542. checkAttribute->mIsMultiUse = true;
  7543. checkAttribute = checkAttribute->mNextAttribute;
  7544. }
  7545. auto typeDecl = inlineTypeRef->mTypeDeclaration;
  7546. typeDecl->mSrcStart = attributes->mSrcStart;
  7547. typeDecl->mTriviaStart = typeDecl->mSrcStart;
  7548. typeDecl->mAttributes = attributes;
  7549. inlineTypeRef->mTriviaStart = attributes->mTriviaStart;
  7550. inlineTypeRef->mSrcStart = attributes->mSrcStart;
  7551. if ((typeDecl->mIgnoreDeclaration) && (IsNodeRelevant(typeDecl)))
  7552. typeDecl->mIgnoreDeclaration = false;
  7553. return true;
  7554. }
  7555. return false;
  7556. }
  7557. void BfReducer::CheckMultiuseAttributeTypeRef(BfAstNode* typeRef)
  7558. {
  7559. if (auto inlineTypeRef = BfNodeDynCast<BfInlineTypeReference>(typeRef))
  7560. {
  7561. auto checkAttribute = inlineTypeRef->mTypeDeclaration->mAttributes;
  7562. while (checkAttribute != NULL)
  7563. {
  7564. checkAttribute->mIsMultiUse = true;
  7565. checkAttribute = checkAttribute->mNextAttribute;
  7566. }
  7567. }
  7568. }
  7569. bool BfReducer::SetProtection(BfAstNode* parentNode, BfAstNode*& protectionNodeRef, BfTokenNode* tokenNode)
  7570. {
  7571. bool failed = false;
  7572. if (protectionNodeRef != NULL)
  7573. {
  7574. if (auto prevToken = BfNodeDynCast<BfTokenNode>(protectionNodeRef))
  7575. {
  7576. if (((prevToken->mToken == BfToken_Protected) && (tokenNode->mToken == BfToken_Internal)) ||
  7577. ((prevToken->mToken == BfToken_Internal) && (tokenNode->mToken == BfToken_Protected)))
  7578. {
  7579. auto tokenPair = mAlloc->Alloc<BfTokenPairNode>();
  7580. if (prevToken->mSrcStart < tokenNode->mSrcStart)
  7581. {
  7582. ReplaceNode(prevToken, tokenPair);
  7583. MEMBER_SET(tokenPair, mLeft, prevToken);
  7584. MEMBER_SET(tokenPair, mRight, tokenNode);
  7585. }
  7586. else
  7587. {
  7588. ReplaceNode(tokenNode, tokenPair);
  7589. MEMBER_SET(tokenPair, mLeft, tokenNode);
  7590. MEMBER_SET(tokenPair, mRight, prevToken);
  7591. }
  7592. protectionNodeRef = tokenPair;
  7593. if (parentNode != NULL)
  7594. MoveNode(tokenPair, parentNode);
  7595. return true;
  7596. }
  7597. }
  7598. Fail("Protection already specified", protectionNodeRef);
  7599. }
  7600. protectionNodeRef = tokenNode;
  7601. if (parentNode != NULL)
  7602. MoveNode(tokenNode, parentNode);
  7603. return !failed;
  7604. }
  7605. BfAstNode* BfReducer::CreateAllocNode(BfTokenNode* allocToken)
  7606. {
  7607. if (allocToken->GetToken() == BfToken_Scope)
  7608. {
  7609. auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  7610. if (nextToken == NULL)
  7611. return allocToken;
  7612. if ((nextToken->mToken != BfToken_Colon) && (nextToken->mToken != BfToken_ColonColon) && (nextToken->mToken != BfToken_LBracket))
  7613. return allocToken;
  7614. auto scopeNode = mAlloc->Alloc<BfScopeNode>();
  7615. ReplaceNode(allocToken, scopeNode);
  7616. scopeNode->mScopeToken = allocToken;
  7617. if (nextToken->mToken == BfToken_Colon)
  7618. {
  7619. MEMBER_SET(scopeNode, mColonToken, nextToken);
  7620. mVisitorPos.MoveNext();
  7621. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  7622. {
  7623. if ((nextToken->GetToken() == BfToken_Colon) || (nextToken->GetToken() == BfToken_Mixin))
  7624. {
  7625. MEMBER_SET(scopeNode, mTargetNode, nextToken);
  7626. mVisitorPos.MoveNext();
  7627. }
  7628. }
  7629. else if (auto identifier = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext()))
  7630. {
  7631. MEMBER_SET(scopeNode, mTargetNode, identifier);
  7632. mVisitorPos.MoveNext();
  7633. }
  7634. if (scopeNode->mTargetNode == NULL)
  7635. {
  7636. FailAfter("Expected scope name", scopeNode);
  7637. }
  7638. }
  7639. else if (nextToken->mToken == BfToken_ColonColon)
  7640. {
  7641. MEMBER_SET(scopeNode, mColonToken, nextToken);
  7642. mVisitorPos.MoveNext();
  7643. }
  7644. nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  7645. if (nextToken == NULL)
  7646. return scopeNode;
  7647. if (nextToken->mToken != BfToken_LBracket)
  7648. return scopeNode;
  7649. mVisitorPos.MoveNext();
  7650. auto attributeDirective = CreateAttributeDirective(nextToken);
  7651. MEMBER_SET(scopeNode, mAttributes, attributeDirective);
  7652. return scopeNode;
  7653. }
  7654. if (allocToken->GetToken() == BfToken_New)
  7655. {
  7656. auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  7657. if (nextToken == NULL)
  7658. return allocToken;
  7659. if ((nextToken->mToken != BfToken_Colon) && (nextToken->mToken != BfToken_LBracket))
  7660. return allocToken;
  7661. auto newNode = mAlloc->Alloc<BfNewNode>();
  7662. ReplaceNode(allocToken, newNode);
  7663. newNode->mNewToken = allocToken;
  7664. if (nextToken->mToken == BfToken_Colon)
  7665. {
  7666. MEMBER_SET(newNode, mColonToken, nextToken);
  7667. mVisitorPos.MoveNext();
  7668. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  7669. {
  7670. BfToken nextToken = nextTokenNode->GetToken();
  7671. if ((nextToken == BfToken_LParen) || (nextToken == BfToken_This) || (nextToken == BfToken_Null))
  7672. {
  7673. auto allocExpr = CreateExpressionAfter(newNode, (CreateExprFlags)(CreateExprFlags_NoCast | CreateExprFlags_ExitOnParenExpr));
  7674. if (allocExpr != NULL)
  7675. {
  7676. MEMBER_SET(newNode, mAllocNode, allocExpr);
  7677. }
  7678. }
  7679. }
  7680. else
  7681. {
  7682. int endNodeIdx = -1;
  7683. int nodeIdx = mVisitorPos.mReadPos;
  7684. mVisitorPos.MoveNext();
  7685. if (IsTypeReference(mVisitorPos.GetCurrent(), BfToken_Bang, -1, &endNodeIdx))
  7686. {
  7687. if (auto bangToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(endNodeIdx)))
  7688. {
  7689. if (auto prevIdentifier = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.Get(endNodeIdx - 1)))
  7690. {
  7691. if (bangToken->GetSrcStart() == prevIdentifier->GetSrcEnd())
  7692. {
  7693. if (endNodeIdx == nodeIdx + 2)
  7694. {
  7695. MEMBER_SET(newNode, mAllocNode, prevIdentifier);
  7696. prevIdentifier->SetSrcEnd(bangToken->GetSrcEnd());
  7697. }
  7698. else
  7699. {
  7700. mVisitorPos.mReadPos = nodeIdx + 1;
  7701. BfExpression* expr = CreateExpression(mVisitorPos.Get(nodeIdx + 1), CreateExprFlags_ExitOnBang);
  7702. expr->SetSrcEnd(bangToken->GetSrcEnd());
  7703. MEMBER_SET(newNode, mAllocNode, expr);
  7704. BfAstNode* memberNode = expr;
  7705. if (auto memberRefExpr = BfNodeDynCast<BfMemberReferenceExpression>(expr))
  7706. {
  7707. memberNode = memberRefExpr->mMemberName;
  7708. }
  7709. else if (auto qualifiedIdentifier = BfNodeDynCast<BfQualifiedNameNode>(expr))
  7710. {
  7711. memberNode = qualifiedIdentifier->mRight;
  7712. }
  7713. if (memberNode != NULL)
  7714. memberNode->SetSrcEnd(bangToken->GetSrcEnd());
  7715. }
  7716. newNode->SetSrcEnd(bangToken->GetSrcEnd());
  7717. mVisitorPos.mReadPos = endNodeIdx;
  7718. BfTokenNode* colonToken = NULL;
  7719. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(endNodeIdx + 1)))
  7720. {
  7721. if (nextToken->GetToken() == BfToken_Colon)
  7722. colonToken = nextToken;
  7723. }
  7724. auto scopedInvocationTarget = CreateScopedInvocationTarget(newNode->mAllocNode, colonToken);
  7725. newNode->SetSrcEnd(scopedInvocationTarget->GetSrcEnd());
  7726. }
  7727. }
  7728. }
  7729. }
  7730. if (newNode->mAllocNode == NULL)
  7731. {
  7732. mVisitorPos.mReadPos = nodeIdx;
  7733. if (auto identifier = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext()))
  7734. {
  7735. MEMBER_SET(newNode, mAllocNode, identifier);
  7736. mVisitorPos.MoveNext();
  7737. }
  7738. }
  7739. }
  7740. if (newNode->mAllocNode == NULL)
  7741. {
  7742. FailAfter("Expected allocator expression", newNode);
  7743. }
  7744. }
  7745. nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  7746. if (nextToken == NULL)
  7747. return newNode;
  7748. if (nextToken->mToken != BfToken_LBracket)
  7749. return newNode;
  7750. mVisitorPos.MoveNext();
  7751. auto attributeDirective = CreateAttributeDirective(nextToken);
  7752. MEMBER_SET(newNode, mAttributes, attributeDirective);
  7753. return newNode;
  7754. }
  7755. return allocToken;
  7756. }
  7757. BfObjectCreateExpression* BfReducer::CreateObjectCreateExpression(BfAstNode* allocNode, BfAstNode* targetNode)
  7758. {
  7759. auto objectCreateExpr = mAlloc->Alloc<BfObjectCreateExpression>();
  7760. BfDeferredAstSizedArray<BfExpression*> arguments(objectCreateExpr->mArguments, mAlloc);
  7761. BfDeferredAstSizedArray<BfTokenNode*> commas(objectCreateExpr->mCommas, mAlloc);
  7762. BfTypeReference* typeRef = NULL;
  7763. if (allocNode != NULL)
  7764. {
  7765. ReplaceNode(allocNode, objectCreateExpr);
  7766. MEMBER_SET(objectCreateExpr, mNewNode, allocNode);
  7767. }
  7768. else
  7769. {
  7770. ReplaceNode(targetNode, objectCreateExpr);
  7771. typeRef = CreateTypeRef(targetNode);
  7772. if (typeRef == NULL)
  7773. return NULL;
  7774. }
  7775. auto nextNode = mVisitorPos.GetNext();
  7776. BfTokenNode* tokenNode;
  7777. if (typeRef == NULL)
  7778. typeRef = CreateTypeRefAfter(objectCreateExpr);
  7779. if (typeRef == NULL)
  7780. return objectCreateExpr;
  7781. bool isArray = false;
  7782. if (auto ptrType = BfNodeDynCast<BfPointerTypeRef>(typeRef))
  7783. {
  7784. if (auto arrayType = BfNodeDynCast<BfArrayTypeRef>(ptrType->mElementType))
  7785. {
  7786. MEMBER_SET(objectCreateExpr, mStarToken, ptrType->mStarNode);
  7787. typeRef = ptrType->mElementType;
  7788. isArray = true;
  7789. }
  7790. }
  7791. else if (auto arrayType = BfNodeDynCast<BfArrayTypeRef>(typeRef))
  7792. {
  7793. isArray = true;
  7794. }
  7795. MEMBER_SET(objectCreateExpr, mTypeRef, typeRef);
  7796. if (auto block = BfNodeDynCast<BfBlock>(mVisitorPos.GetNext()))
  7797. {
  7798. mPassInstance->Warn(0, "Expected '('", block->mOpenBrace);
  7799. mVisitorPos.MoveNext();
  7800. MEMBER_SET(objectCreateExpr, mOpenToken, block->mOpenBrace);
  7801. //
  7802. {
  7803. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
  7804. ReadArguments(objectCreateExpr, objectCreateExpr, &arguments, &commas, BfToken_None, true);
  7805. while (true)
  7806. {
  7807. auto nextNode = mVisitorPos.GetNext();
  7808. if (nextNode == NULL)
  7809. break;
  7810. AddErrorNode(nextNode);
  7811. mVisitorPos.MoveNext();
  7812. }
  7813. }
  7814. if (block->mCloseBrace != NULL)
  7815. MEMBER_SET(objectCreateExpr, mCloseToken, block->mCloseBrace);
  7816. objectCreateExpr->mSrcEnd = block->mSrcEnd;
  7817. return objectCreateExpr;
  7818. }
  7819. if (isArray)
  7820. {
  7821. tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  7822. if (tokenNode == NULL)
  7823. return objectCreateExpr;
  7824. if (tokenNode->GetToken() != BfToken_LParen)
  7825. return objectCreateExpr;
  7826. mVisitorPos.MoveNext();
  7827. }
  7828. else
  7829. {
  7830. auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  7831. auto nextNextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2));
  7832. if ((nextToken != NULL) && (nextToken->mToken == BfToken_Dot) &&
  7833. (nextNextToken != NULL) && (nextNextToken->mToken == BfToken_This))
  7834. {
  7835. auto ctorExplicitNode = mAlloc->Alloc<BfCtorExplicitNode>();
  7836. ReplaceNode(nextToken, ctorExplicitNode);
  7837. ctorExplicitNode->mDotToken = nextToken;
  7838. MEMBER_SET(ctorExplicitNode, mThisToken, nextNextToken);
  7839. mVisitorPos.MoveNext();
  7840. mVisitorPos.MoveNext();
  7841. MEMBER_SET(objectCreateExpr, mCtorExplicit, ctorExplicitNode);
  7842. }
  7843. else if ((nextToken != NULL) && (nextToken->mToken == BfToken_This))
  7844. {
  7845. auto ctorExplicitNode = mAlloc->Alloc<BfCtorExplicitNode>();
  7846. ReplaceNode(nextToken, ctorExplicitNode);
  7847. ctorExplicitNode->mThisToken = nextToken;
  7848. mVisitorPos.MoveNext();
  7849. MEMBER_SET(objectCreateExpr, mCtorExplicit, ctorExplicitNode);
  7850. }
  7851. if (objectCreateExpr->mCtorExplicit != NULL)
  7852. {
  7853. if (nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  7854. {
  7855. if ((nextToken->mToken != NULL) && (nextToken->mToken == BfToken_LChevron))
  7856. {
  7857. mVisitorPos.MoveNext();
  7858. auto genericParamsDecl = CreateGenericArguments(nextToken, true);
  7859. if (genericParamsDecl == NULL)
  7860. return objectCreateExpr;
  7861. MEMBER_SET(objectCreateExpr->mCtorExplicit, mGenericArgs, genericParamsDecl);
  7862. objectCreateExpr->mSrcEnd = objectCreateExpr->mCtorExplicit->mSrcEnd;
  7863. }
  7864. }
  7865. }
  7866. // Note- if there WERE an LBracket here then we'd have an 'isArray' case. We pass this in here for
  7867. // error display purposes
  7868. tokenNode = ExpectTokenAfter(objectCreateExpr, BfToken_LParen, BfToken_LBracket);
  7869. if (tokenNode == NULL)
  7870. return objectCreateExpr;
  7871. }
  7872. MEMBER_SET(objectCreateExpr, mOpenToken, tokenNode);
  7873. BfToken endToken = (BfToken)(tokenNode->GetToken() + 1);
  7874. tokenNode = ReadArguments(objectCreateExpr, objectCreateExpr, &arguments, &commas, BfToken_RParen, true);
  7875. if (tokenNode == NULL)
  7876. return objectCreateExpr;
  7877. MEMBER_SET(objectCreateExpr, mCloseToken, tokenNode);
  7878. return objectCreateExpr;
  7879. }
  7880. BfExpression* BfReducer::CreateIndexerExpression(BfExpression* target, BfTokenNode* openBracketNode)
  7881. {
  7882. auto tokenNode = openBracketNode;
  7883. if (openBracketNode == NULL)
  7884. tokenNode = ExpectTokenAfter(target, BfToken_LBracket, BfToken_QuestionLBracket);
  7885. auto indexerExpr = mAlloc->Alloc<BfIndexerExpression>();
  7886. BfDeferredAstSizedArray<BfExpression*> arguments(indexerExpr->mArguments, mAlloc);
  7887. BfDeferredAstSizedArray<BfTokenNode*> commas(indexerExpr->mCommas, mAlloc);
  7888. if (target != NULL)
  7889. {
  7890. indexerExpr->mTarget = target;
  7891. ReplaceNode(target, indexerExpr);
  7892. }
  7893. else
  7894. {
  7895. ReplaceNode(openBracketNode, indexerExpr);
  7896. }
  7897. indexerExpr->mOpenBracket = tokenNode;
  7898. MoveNode(indexerExpr->mOpenBracket, indexerExpr);
  7899. BfAstNode* argAfterNode = indexerExpr;
  7900. BfAttributeDirective* attributeDirective = NULL;
  7901. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  7902. {
  7903. if (tokenNode->mToken == BfToken_LBracket)
  7904. {
  7905. mVisitorPos.MoveNext();
  7906. attributeDirective = CreateAttributeDirective(tokenNode);
  7907. argAfterNode = attributeDirective;
  7908. }
  7909. }
  7910. indexerExpr->mCloseBracket = ReadArguments(indexerExpr, argAfterNode, &arguments, &commas, BfToken_RBracket, false);
  7911. if (attributeDirective != NULL)
  7912. {
  7913. BfAttributedExpression* attribExpr = mAlloc->Alloc<BfAttributedExpression>();
  7914. ReplaceNode(indexerExpr, attribExpr);
  7915. attribExpr->mExpression = indexerExpr;
  7916. MEMBER_SET(attribExpr, mAttributes, attributeDirective);
  7917. return attribExpr;
  7918. }
  7919. return indexerExpr;
  7920. }
  7921. BfMemberReferenceExpression* BfReducer::CreateMemberReferenceExpression(BfAstNode* target)
  7922. {
  7923. auto tokenNode = ExpectTokenAfter(target, BfToken_Dot, BfToken_DotDot, BfToken_QuestionDot, BfToken_Arrow);
  7924. auto memberReferenceExpr = mAlloc->Alloc<BfMemberReferenceExpression>();
  7925. if (target != NULL)
  7926. {
  7927. memberReferenceExpr->mTarget = target;
  7928. ReplaceNode(target, memberReferenceExpr);
  7929. }
  7930. MEMBER_SET_CHECKED(memberReferenceExpr, mDotToken, tokenNode);
  7931. auto nextNode = mVisitorPos.GetNext();
  7932. if (auto literalExpr = BfNodeDynCast<BfLiteralExpression>(nextNode))
  7933. {
  7934. // Special case for "tuple.0" type references
  7935. if (literalExpr->mValue.mTypeCode == BfTypeCode_IntUnknown)
  7936. {
  7937. MEMBER_SET(memberReferenceExpr, mMemberName, literalExpr);
  7938. mVisitorPos.MoveNext();
  7939. return memberReferenceExpr;
  7940. }
  7941. }
  7942. if ((tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext())))
  7943. {
  7944. if (tokenNode->GetToken() == BfToken_LBracket)
  7945. {
  7946. mVisitorPos.MoveNext();
  7947. auto attrIdentifier = CreateAttributedExpression(tokenNode, true);
  7948. if (attrIdentifier != NULL)
  7949. {
  7950. MEMBER_SET(memberReferenceExpr, mMemberName, attrIdentifier);
  7951. }
  7952. }
  7953. if (tokenNode->GetToken() == BfToken_This)
  7954. {
  7955. mVisitorPos.MoveNext();
  7956. MEMBER_SET(memberReferenceExpr, mMemberName, tokenNode);
  7957. }
  7958. }
  7959. if (memberReferenceExpr->mMemberName == NULL)
  7960. {
  7961. auto memberName = ExpectIdentifierAfter(memberReferenceExpr);
  7962. if (memberName != NULL)
  7963. {
  7964. MEMBER_SET(memberReferenceExpr, mMemberName, memberName);
  7965. }
  7966. }
  7967. return memberReferenceExpr;
  7968. }
  7969. BfTupleExpression* BfReducer::CreateTupleExpression(BfTokenNode* node, BfExpression* innerExpr)
  7970. {
  7971. auto tupleExpr = mAlloc->Alloc<BfTupleExpression>();
  7972. ReplaceNode(node, tupleExpr);
  7973. tupleExpr->mOpenParen = node;
  7974. BfDeferredAstSizedArray<BfTupleNameNode*> names(tupleExpr->mNames, mAlloc);
  7975. BfDeferredAstSizedArray<BfExpression*> values(tupleExpr->mValues, mAlloc);
  7976. BfDeferredAstSizedArray<BfTokenNode*> commas(tupleExpr->mCommas, mAlloc);
  7977. while (true)
  7978. {
  7979. BfTokenNode* closeParenToken;
  7980. if (innerExpr == NULL)
  7981. {
  7982. bool skipExpr = false;
  7983. if (values.size() != 0)
  7984. {
  7985. if (auto nextToken = BfNodeDynCastExact<BfTokenNode>(mVisitorPos.GetNext()))
  7986. {
  7987. if (nextToken->GetToken() == BfToken_RParen)
  7988. {
  7989. // Unterminated - default initialize
  7990. skipExpr = true;
  7991. }
  7992. }
  7993. }
  7994. if (!skipExpr)
  7995. innerExpr = CreateExpressionAfter(tupleExpr, CreateExprFlags_PermissiveVariableDecl);
  7996. }
  7997. if (innerExpr == NULL)
  7998. {
  7999. // Failed, but can we pull in the closing rparen?
  8000. auto nextNode = mVisitorPos.GetNext();
  8001. if ((closeParenToken = BfNodeDynCast<BfTokenNode>(nextNode)))
  8002. {
  8003. if (closeParenToken->GetToken() == BfToken_RParen)
  8004. {
  8005. MEMBER_SET(tupleExpr, mCloseParen, closeParenToken);
  8006. mVisitorPos.MoveNext();
  8007. }
  8008. }
  8009. break;
  8010. }
  8011. if (innerExpr->IsA<BfIdentifierNode>())
  8012. closeParenToken = ExpectTokenAfter(innerExpr, BfToken_RParen, BfToken_Comma, BfToken_Colon);
  8013. else
  8014. closeParenToken = ExpectTokenAfter(innerExpr, BfToken_RParen, BfToken_Comma);
  8015. if (closeParenToken == NULL)
  8016. {
  8017. values.push_back(innerExpr);
  8018. MoveNode(innerExpr, tupleExpr);
  8019. break;
  8020. }
  8021. //TODO: Why did we have this compat mode thing? It kept us from properly creating tuples with names
  8022. if ((closeParenToken->GetToken() == BfToken_Colon) /*&& (!mCompatMode)*/)
  8023. {
  8024. BfTupleNameNode* tupleNameNode = mAlloc->Alloc<BfTupleNameNode>();
  8025. ReplaceNode(innerExpr, tupleNameNode);
  8026. tupleNameNode->mNameNode = (BfIdentifierNode*)innerExpr;
  8027. MEMBER_SET(tupleNameNode, mColonToken, closeParenToken);
  8028. while ((int)values.size() > names.size())
  8029. names.push_back(NULL);
  8030. names.push_back(tupleNameNode);
  8031. MoveNode(tupleNameNode, tupleExpr);
  8032. innerExpr = CreateExpressionAfter(tupleExpr);
  8033. if (innerExpr == NULL)
  8034. break;
  8035. closeParenToken = ExpectTokenAfter(innerExpr, BfToken_RParen, BfToken_Comma);
  8036. }
  8037. values.push_back(innerExpr);
  8038. MoveNode(innerExpr, tupleExpr);
  8039. innerExpr = NULL;
  8040. if (closeParenToken == NULL)
  8041. break;
  8042. if (closeParenToken->GetToken() == BfToken_RParen)
  8043. {
  8044. MEMBER_SET(tupleExpr, mCloseParen, closeParenToken);
  8045. break;
  8046. }
  8047. commas.push_back(closeParenToken);
  8048. MoveNode(closeParenToken, tupleExpr);
  8049. }
  8050. return tupleExpr;
  8051. }
  8052. BfAstNode* BfReducer::HandleTopLevel(BfBlock* node)
  8053. {
  8054. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(node));
  8055. BfAstNode* prevNode = NULL;
  8056. bool hadPrevFail = false;
  8057. bool isDone = !mVisitorPos.MoveNext();
  8058. auto parser = mSource->ToParser();
  8059. if ((parser != NULL) && (parser->mEmbedKind == BfSourceEmbedKind_Type))
  8060. {
  8061. while (!isDone)
  8062. {
  8063. auto node = mVisitorPos.GetCurrent();
  8064. if (node == prevNode)
  8065. {
  8066. // If we're stuck on an error and can't process any more nodes
  8067. break;
  8068. }
  8069. prevNode = node;
  8070. BfAstNode* typeMember = BfNodeDynCast<BfMemberDeclaration>(node);
  8071. if (typeMember == NULL)
  8072. {
  8073. SetAndRestoreValue<BfAstNode*> prevTypeMemberNodeStart(mTypeMemberNodeStart, node);
  8074. typeMember = ReadTypeMember(node);
  8075. }
  8076. //methodDeclaration->mDocumentation = FindDocumentation(methodDeclaration);
  8077. isDone = !mVisitorPos.MoveNext();
  8078. if (typeMember != NULL)
  8079. {
  8080. mVisitorPos.Write(typeMember);
  8081. }
  8082. }
  8083. }
  8084. if ((parser != NULL) && (parser->mEmbedKind == BfSourceEmbedKind_Method))
  8085. {
  8086. bool allowEndingExpression = false;
  8087. BfAstNode* nextNode = NULL;
  8088. while (!isDone)
  8089. {
  8090. BfAstNode* node = mVisitorPos.GetCurrent();
  8091. CreateStmtFlags flags = (CreateStmtFlags)(CreateStmtFlags_FindTrailingSemicolon | CreateStmtFlags_AllowLocalFunction);
  8092. if (allowEndingExpression)
  8093. flags = (CreateStmtFlags)(flags | CreateStmtFlags_AllowUnterminatedExpression);
  8094. auto statement = CreateStatement(node, flags);
  8095. if ((statement == NULL) && (mSource != NULL))
  8096. statement = mSource->CreateErrorNode(node);
  8097. isDone = !mVisitorPos.MoveNext();
  8098. if (statement != NULL)
  8099. mVisitorPos.Write(statement);
  8100. }
  8101. }
  8102. while (!isDone)
  8103. {
  8104. auto child = mVisitorPos.GetCurrent();
  8105. if (child == prevNode)
  8106. {
  8107. // If we're stuck on an error and can't process any more nodes
  8108. break;
  8109. }
  8110. prevNode = child;
  8111. auto tokenNode = BfNodeDynCast<BfTokenNode>(child);
  8112. if (tokenNode == NULL)
  8113. {
  8114. if (!hadPrevFail)
  8115. Fail("Namespace or type declaration expected", child);
  8116. hadPrevFail = true;
  8117. isDone = !mVisitorPos.MoveNext();
  8118. mVisitorPos.Write(child); // Just keep it...
  8119. continue;
  8120. }
  8121. SetAndRestoreValue<BfAstNode*> prevTypeMemberNodeStart(mTypeMemberNodeStart, tokenNode);
  8122. auto newNode = CreateTopLevelObject(tokenNode, NULL);
  8123. hadPrevFail = newNode == NULL;
  8124. isDone = !mVisitorPos.MoveNext();
  8125. if (newNode != NULL)
  8126. mVisitorPos.Write(newNode);
  8127. }
  8128. mVisitorPos.Trim();
  8129. return node;
  8130. }
  8131. BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDirective* attributes, BfAstNode* deferredHeadNode, bool isAnonymous)
  8132. {
  8133. if (!AssertCurrentNode(tokenNode))
  8134. return NULL;
  8135. bool isSimpleEnum = false;
  8136. if (tokenNode->GetToken() == BfToken_Enum)
  8137. {
  8138. int checkReadPos = mVisitorPos.mReadPos + 1;
  8139. // Do we just have a value list with no members?
  8140. auto nextNode = mVisitorPos.Get(checkReadPos);
  8141. auto checkNode = nextNode;
  8142. while (checkNode != NULL)
  8143. {
  8144. if (auto block = BfNodeDynCast<BfBlock>(checkNode))
  8145. {
  8146. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
  8147. mVisitorPos.MoveNext();
  8148. bool hadIllegal = false;
  8149. bool inAssignment = false;
  8150. int bracketDepth = 0;
  8151. int parenDepth = 0;
  8152. int checkIdx = 0;
  8153. while (true)
  8154. {
  8155. auto node = block->mChildArr.Get(checkIdx);
  8156. if (node == NULL)
  8157. break;
  8158. if (auto identifierNode = BfNodeDynCast<BfIdentifierNode>(node))
  8159. {
  8160. // Allow
  8161. }
  8162. else if (auto tokenNode = BfNodeDynCast<BfTokenNode>(node))
  8163. {
  8164. if (tokenNode->mToken == BfToken_Comma)
  8165. {
  8166. // Allow
  8167. inAssignment = false;
  8168. }
  8169. else if (tokenNode->mToken == BfToken_AssignEquals)
  8170. {
  8171. inAssignment = true;
  8172. }
  8173. else if (tokenNode->mToken == BfToken_LBracket)
  8174. {
  8175. bracketDepth++;
  8176. }
  8177. else if (tokenNode->mToken == BfToken_RBracket)
  8178. {
  8179. bracketDepth--;
  8180. }
  8181. else if (tokenNode->mToken == BfToken_LParen)
  8182. {
  8183. parenDepth++;
  8184. }
  8185. else if (tokenNode->mToken == BfToken_RParen)
  8186. {
  8187. parenDepth--;
  8188. }
  8189. else if ((bracketDepth > 0) || (parenDepth > 0))
  8190. {
  8191. // Allow
  8192. }
  8193. else if (tokenNode->mToken == BfToken_Semicolon)
  8194. {
  8195. hadIllegal = true;
  8196. break;
  8197. }
  8198. else
  8199. {
  8200. if (!inAssignment)
  8201. {
  8202. hadIllegal = true;
  8203. break;
  8204. }
  8205. }
  8206. }
  8207. else if ((bracketDepth > 0) || (parenDepth > 0))
  8208. {
  8209. // Allow
  8210. }
  8211. else
  8212. {
  8213. if (!inAssignment)
  8214. {
  8215. hadIllegal = true;
  8216. break;
  8217. }
  8218. }
  8219. checkIdx++;
  8220. }
  8221. if (!hadIllegal)
  8222. {
  8223. isSimpleEnum = true;
  8224. }
  8225. break;
  8226. }
  8227. checkReadPos++;
  8228. auto nextCheckNode = mVisitorPos.Get(checkReadPos);
  8229. checkNode = nextCheckNode;
  8230. }
  8231. }
  8232. switch (tokenNode->GetToken())
  8233. {
  8234. case BfToken_Using:
  8235. {
  8236. if (auto nextTokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  8237. {
  8238. if ((nextTokenNode->mToken == BfToken_Static) || (nextTokenNode->mToken == BfToken_Internal))
  8239. {
  8240. auto usingDirective = mAlloc->Alloc<BfUsingModDirective>();
  8241. ReplaceNode(tokenNode, usingDirective);
  8242. usingDirective->mUsingToken = tokenNode;
  8243. MEMBER_SET(usingDirective, mModToken, nextTokenNode);
  8244. mVisitorPos.MoveNext();
  8245. auto typeRef = CreateTypeRefAfter(usingDirective);
  8246. if (typeRef != NULL)
  8247. MEMBER_SET(usingDirective, mTypeRef, typeRef);
  8248. tokenNode = ExpectTokenAfter(usingDirective, BfToken_Semicolon);
  8249. if (tokenNode != NULL)
  8250. MEMBER_SET(usingDirective, mTrailingSemicolon, tokenNode);
  8251. BfExteriorNode exteriorNode;
  8252. exteriorNode.mNode = usingDirective;
  8253. BfSizedArrayInitIndirect(exteriorNode.mNamespaceNodes, mCurNamespaceStack, mAlloc);
  8254. mExteriorNodes.Add(exteriorNode);
  8255. return usingDirective;
  8256. }
  8257. }
  8258. auto usingDirective = mAlloc->Alloc<BfUsingDirective>();
  8259. ReplaceNode(tokenNode, usingDirective);
  8260. usingDirective->mUsingToken = tokenNode;
  8261. auto identifierNode = ExpectIdentifierAfter(usingDirective);
  8262. if (identifierNode != NULL)
  8263. {
  8264. identifierNode = CompactQualifiedName(identifierNode);
  8265. MEMBER_SET(usingDirective, mNamespace, identifierNode);
  8266. tokenNode = ExpectTokenAfter(usingDirective, BfToken_Semicolon);
  8267. if (tokenNode == NULL)
  8268. {
  8269. // Failure, but eat any following dot for autocompletion purposes
  8270. auto nextNode = mVisitorPos.GetNext();
  8271. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  8272. {
  8273. if (tokenNode->GetToken() == BfToken_Dot)
  8274. {
  8275. auto qualifiedNameNode = mAlloc->Alloc<BfQualifiedNameNode>();
  8276. ReplaceNode(usingDirective->mNamespace, qualifiedNameNode);
  8277. qualifiedNameNode->mLeft = usingDirective->mNamespace;
  8278. MEMBER_SET(qualifiedNameNode, mDot, tokenNode);
  8279. usingDirective->mNamespace = qualifiedNameNode;
  8280. usingDirective->SetSrcEnd(qualifiedNameNode->GetSrcEnd());
  8281. return usingDirective;
  8282. }
  8283. }
  8284. }
  8285. else if (tokenNode != NULL)
  8286. {
  8287. MEMBER_SET(usingDirective, mTrailingSemicolon, tokenNode);
  8288. }
  8289. }
  8290. BfExteriorNode exteriorNode;
  8291. exteriorNode.mNode = usingDirective;
  8292. mExteriorNodes.Add(exteriorNode);
  8293. return usingDirective;
  8294. }
  8295. break;
  8296. case BfToken_Namespace:
  8297. {
  8298. auto namespaceDeclaration = mAlloc->Alloc<BfNamespaceDeclaration>();
  8299. namespaceDeclaration->mNamespaceNode = tokenNode;
  8300. auto identifierNode = ExpectIdentifierAfter(tokenNode);
  8301. if (identifierNode == NULL)
  8302. return namespaceDeclaration;
  8303. identifierNode = CompactQualifiedName(identifierNode);
  8304. namespaceDeclaration->mNameNode = identifierNode;
  8305. ReplaceNode(tokenNode, namespaceDeclaration);
  8306. MoveNode(identifierNode, namespaceDeclaration);
  8307. BfAstNode* bodyNode = NULL;
  8308. BfBlock* blockNode = NULL;
  8309. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  8310. bodyNode = ExpectTokenAfter(namespaceDeclaration, BfToken_Semicolon);
  8311. else
  8312. bodyNode = blockNode = ExpectBlockAfter(namespaceDeclaration);
  8313. if (bodyNode == NULL)
  8314. return namespaceDeclaration;
  8315. MoveNode(bodyNode, namespaceDeclaration);
  8316. namespaceDeclaration->mBody = bodyNode;
  8317. mCurNamespaceStack.Add(namespaceDeclaration);
  8318. if (blockNode != NULL)
  8319. HandleTopLevel(blockNode);
  8320. mCurNamespaceStack.pop_back();
  8321. return namespaceDeclaration;
  8322. }
  8323. break;
  8324. case BfToken_LBracket:
  8325. {
  8326. auto attributes = CreateAttributeDirective(tokenNode);
  8327. if (attributes == NULL)
  8328. return NULL;
  8329. auto nextNode = mVisitorPos.GetNext();
  8330. auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode);
  8331. if (nextToken == NULL)
  8332. {
  8333. FailAfter("Expected type declaration", tokenNode);
  8334. return NULL;
  8335. }
  8336. mVisitorPos.MoveNext();
  8337. auto topLevelObject = CreateTopLevelObject(nextToken, attributes);
  8338. if (topLevelObject == NULL)
  8339. return NULL;
  8340. auto typeDeclaration = BfNodeDynCast<BfTypeDeclaration>(topLevelObject);
  8341. if (typeDeclaration == NULL)
  8342. {
  8343. Fail("Invalid type specifier", tokenNode);
  8344. return NULL;
  8345. }
  8346. typeDeclaration->mAttributes = attributes;
  8347. ReplaceNode(attributes, typeDeclaration);
  8348. return typeDeclaration;
  8349. }
  8350. break;
  8351. case BfToken_Sealed:
  8352. case BfToken_Abstract:
  8353. case BfToken_Public:
  8354. case BfToken_Private:
  8355. case BfToken_Protected:
  8356. case BfToken_Internal:
  8357. case BfToken_Static:
  8358. {
  8359. auto nextNode = mVisitorPos.GetNext();
  8360. if ((tokenNode->GetToken() == BfToken_Static) && BfNodeIsA<BfBlock>(nextNode))
  8361. {
  8362. // It's a global block!
  8363. auto typeDeclaration = mAlloc->Alloc<BfTypeDeclaration>();
  8364. ReplaceNode(tokenNode, typeDeclaration);
  8365. typeDeclaration->mDocumentation = FindDocumentation(typeDeclaration);
  8366. typeDeclaration->mStaticSpecifier = tokenNode;
  8367. auto block = BfNodeDynCast<BfBlock>(nextNode);
  8368. MEMBER_SET(typeDeclaration, mDefineNode, block);
  8369. mVisitorPos.MoveNext();
  8370. HandleTypeDeclaration(typeDeclaration, attributes, deferredHeadNode);
  8371. return typeDeclaration;
  8372. }
  8373. nextNode = mVisitorPos.GetNext();
  8374. auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode);
  8375. if (nextToken == NULL)
  8376. {
  8377. AddErrorNode(tokenNode);
  8378. FailAfter("Expected type declaration", tokenNode);
  8379. return NULL;
  8380. }
  8381. mVisitorPos.MoveNext();
  8382. auto topLevelObject = CreateTopLevelObject(nextToken, attributes);
  8383. if (topLevelObject == NULL)
  8384. {
  8385. AddErrorNode(tokenNode);
  8386. return NULL;
  8387. }
  8388. auto typeDeclaration = BfNodeDynCast<BfTypeDeclaration>(topLevelObject);
  8389. if (typeDeclaration == NULL)
  8390. {
  8391. AddErrorNode(tokenNode);
  8392. Fail("Invalid type specifier", tokenNode);
  8393. return NULL;
  8394. }
  8395. ReplaceNode(tokenNode, typeDeclaration);
  8396. BfToken token = tokenNode->GetToken();
  8397. if ((token == BfToken_Public) ||
  8398. (token == BfToken_Protected) ||
  8399. (token == BfToken_Private) ||
  8400. (token == BfToken_Internal))
  8401. {
  8402. SetProtection(typeDeclaration, typeDeclaration->mProtectionSpecifier, tokenNode);
  8403. }
  8404. if (token == BfToken_Static)
  8405. {
  8406. if (typeDeclaration->mStaticSpecifier != NULL)
  8407. {
  8408. Fail("Static already specified", tokenNode);
  8409. }
  8410. MEMBER_SET(typeDeclaration, mStaticSpecifier, tokenNode);
  8411. }
  8412. if (token == BfToken_Sealed)
  8413. {
  8414. if (typeDeclaration->mSealedSpecifier != NULL)
  8415. {
  8416. Fail("Sealed already specified", tokenNode);
  8417. }
  8418. MEMBER_SET(typeDeclaration, mSealedSpecifier, tokenNode);
  8419. }
  8420. if (token == BfToken_Abstract)
  8421. {
  8422. if (typeDeclaration->mAbstractSpecifier != NULL)
  8423. {
  8424. Fail(StrFormat("'%s' already specified", typeDeclaration->mAbstractSpecifier->ToString().c_str()), tokenNode);
  8425. }
  8426. MEMBER_SET(typeDeclaration, mAbstractSpecifier, tokenNode);
  8427. }
  8428. //TODO: Store type specifiers
  8429. return typeDeclaration;
  8430. }
  8431. break;
  8432. case BfToken_Delegate:
  8433. case BfToken_Function:
  8434. {
  8435. auto typeDeclaration = mAlloc->Alloc<BfTypeDeclaration>();
  8436. SetAndRestoreValue<BfTypeDeclaration*> prevTypeDecl(mCurTypeDecl, typeDeclaration);
  8437. CurTypeState curTypeState(typeDeclaration, mAlloc);
  8438. SetAndRestoreValue<CurTypeState*> prevTypeState(mCurTypeState, &curTypeState);
  8439. ReplaceNode(tokenNode, typeDeclaration);
  8440. typeDeclaration->mDocumentation = FindDocumentation(typeDeclaration);
  8441. typeDeclaration->mTypeNode = tokenNode;
  8442. auto retType = CreateTypeRefAfter(typeDeclaration);
  8443. if (retType == NULL)
  8444. return typeDeclaration;
  8445. auto methodDecl = mAlloc->Alloc<BfMethodDeclaration>();
  8446. MEMBER_SET(methodDecl, mReturnType, retType);
  8447. CheckMultiuseAttributeTypeRef(methodDecl->mReturnType);
  8448. BfDeferredAstSizedArray<BfParameterDeclaration*> params(methodDecl->mParams, mAlloc);
  8449. BfDeferredAstSizedArray<BfTokenNode*> commas(methodDecl->mCommas, mAlloc);
  8450. methodDecl->mDocumentation = FindDocumentation(methodDecl);
  8451. BfBlock* defineBlock = mAlloc->Alloc<BfBlock>();
  8452. MoveNode(defineBlock, typeDeclaration);
  8453. BfDeferredAstSizedArray<BfAstNode*> members(defineBlock->mChildArr, mAlloc);
  8454. members.push_back(methodDecl);
  8455. MoveNode(methodDecl, typeDeclaration);
  8456. typeDeclaration->mDefineNode = defineBlock;
  8457. auto name = ExpectIdentifierAfter(retType);
  8458. if (name == NULL)
  8459. {
  8460. ReplaceNode(retType, methodDecl);
  8461. return typeDeclaration;
  8462. }
  8463. ReplaceNode(name, methodDecl);
  8464. MEMBER_SET_CHECKED(typeDeclaration, mNameNode, name);
  8465. auto nextNode = mVisitorPos.GetNext();
  8466. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  8467. {
  8468. if (tokenNode->GetToken() == BfToken_LChevron)
  8469. {
  8470. auto genericParams = CreateGenericParamsDeclaration(tokenNode);
  8471. MEMBER_SET_CHECKED(typeDeclaration, mGenericParams, genericParams);
  8472. methodDecl->SetSrcEnd(genericParams->GetSrcEnd());
  8473. }
  8474. }
  8475. bool failed = ParseMethod(methodDecl, &params, &commas);
  8476. if (methodDecl->mGenericConstraintsDeclaration != NULL)
  8477. {
  8478. typeDeclaration->mGenericConstraintsDeclaration = methodDecl->mGenericConstraintsDeclaration;
  8479. typeDeclaration->SetSrcEnd(methodDecl->GetSrcEnd());
  8480. methodDecl->mGenericConstraintsDeclaration = NULL;
  8481. }
  8482. if (methodDecl->mBody != NULL)
  8483. {
  8484. Fail("Unexpected method body after delegate/function type", methodDecl->mBody);
  8485. }
  8486. if (failed)
  8487. return typeDeclaration;
  8488. if ((methodDecl->mEndSemicolon == NULL) && (methodDecl->mCloseParen != NULL))
  8489. FailAfter("Expected ';'", methodDecl->mCloseParen);
  8490. //MEMBER_SET(methodDecl, mReturnType, retType);
  8491. return typeDeclaration;
  8492. }
  8493. break;
  8494. case BfToken_TypeAlias:
  8495. {
  8496. auto identifierNode = ExpectIdentifierAfter(tokenNode);
  8497. if (identifierNode == NULL)
  8498. return NULL;
  8499. auto typeDeclaration = mAlloc->Alloc<BfTypeAliasDeclaration>();
  8500. BfDeferredAstSizedArray<BfTypeReference*> baseClasses(typeDeclaration->mBaseClasses, mAlloc);
  8501. BfDeferredAstSizedArray<BfAstNode*> baseClassCommas(typeDeclaration->mBaseClassCommas, mAlloc);
  8502. mLastTypeDecl = typeDeclaration;
  8503. typeDeclaration->mTypeNode = tokenNode;
  8504. typeDeclaration->mNameNode = identifierNode;
  8505. ReplaceNode(tokenNode, typeDeclaration);
  8506. MoveNode(identifierNode, typeDeclaration);
  8507. typeDeclaration->mDocumentation = FindDocumentation(typeDeclaration);
  8508. auto nextNode = mVisitorPos.GetNext();
  8509. auto chevronToken = BfNodeDynCast<BfTokenNode>(nextNode);
  8510. if ((chevronToken != NULL) && (chevronToken->GetToken() == BfToken_LChevron))
  8511. {
  8512. auto genericMethodParams = CreateGenericParamsDeclaration(chevronToken);
  8513. if (genericMethodParams != NULL)
  8514. {
  8515. MEMBER_SET(typeDeclaration, mGenericParams, genericMethodParams);
  8516. }
  8517. }
  8518. auto tokenNode = ExpectTokenAfter(typeDeclaration, BfToken_AssignEquals);
  8519. if (tokenNode != NULL)
  8520. {
  8521. MEMBER_SET(typeDeclaration, mEqualsToken, tokenNode);
  8522. auto aliasToType = CreateTypeRefAfter(typeDeclaration);
  8523. if (aliasToType != NULL)
  8524. {
  8525. MEMBER_SET(typeDeclaration, mAliasToType, aliasToType);
  8526. auto tokenNode = ExpectTokenAfter(typeDeclaration, BfToken_Semicolon);
  8527. if (tokenNode != NULL)
  8528. MEMBER_SET(typeDeclaration, mEndSemicolon, tokenNode);
  8529. }
  8530. }
  8531. if (!IsNodeRelevant(deferredHeadNode, typeDeclaration))
  8532. typeDeclaration->mIgnoreDeclaration = true;
  8533. return typeDeclaration;
  8534. }
  8535. break;
  8536. case BfToken_Class:
  8537. case BfToken_Struct:
  8538. case BfToken_Interface:
  8539. case BfToken_Enum:
  8540. case BfToken_Extension:
  8541. {
  8542. if ((tokenNode->GetToken() == BfToken_Enum) && (isSimpleEnum))
  8543. break;
  8544. BfIdentifierNode* identifierNode = NULL;
  8545. if (!isAnonymous)
  8546. {
  8547. identifierNode = ExpectIdentifierAfter(tokenNode);
  8548. if (identifierNode == NULL)
  8549. {
  8550. AddErrorNode(tokenNode);
  8551. return NULL;
  8552. }
  8553. }
  8554. // We put extra effort in here to continue after failure, since 'return NULL' failure
  8555. // means we don't parse members inside type (messes up colorization and such)
  8556. auto typeDeclaration = mAlloc->Alloc<BfTypeDeclaration>();
  8557. BfDeferredAstSizedArray<BfTypeReference*> baseClasses(typeDeclaration->mBaseClasses, mAlloc);
  8558. BfDeferredAstSizedArray<BfAstNode*> baseClassCommas(typeDeclaration->mBaseClassCommas, mAlloc);
  8559. mLastTypeDecl = typeDeclaration;
  8560. typeDeclaration->mTypeNode = tokenNode;
  8561. typeDeclaration->mNameNode = identifierNode;
  8562. ReplaceNode(tokenNode, typeDeclaration);
  8563. if (identifierNode != NULL)
  8564. MoveNode(identifierNode, typeDeclaration);
  8565. typeDeclaration->mDocumentation = FindDocumentation(mTypeMemberNodeStart);
  8566. auto nextNode = mVisitorPos.GetNext();
  8567. auto chevronToken = BfNodeDynCast<BfTokenNode>(nextNode);
  8568. if ((chevronToken != NULL) && (chevronToken->GetToken() == BfToken_LChevron))
  8569. {
  8570. auto genericMethodParams = CreateGenericParamsDeclaration(chevronToken);
  8571. if (genericMethodParams != NULL)
  8572. {
  8573. MEMBER_SET(typeDeclaration, mGenericParams, genericMethodParams);
  8574. }
  8575. }
  8576. nextNode = mVisitorPos.GetNext();
  8577. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  8578. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_Colon))
  8579. {
  8580. MEMBER_SET(typeDeclaration, mColonToken, tokenNode);
  8581. mVisitorPos.MoveNext();
  8582. tokenNode = NULL;
  8583. for (int baseTypeIdx = 0; true; baseTypeIdx++)
  8584. {
  8585. nextNode = mVisitorPos.GetNext();
  8586. if ((baseTypeIdx > 0) && (BfNodeDynCast<BfBlock>(nextNode)))
  8587. break;
  8588. if (baseTypeIdx > 0)
  8589. {
  8590. bool hasComma = false;
  8591. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  8592. {
  8593. if ((tokenNode->mToken == BfToken_Semicolon) && (!isAnonymous))
  8594. break;
  8595. if (tokenNode->mToken == BfToken_Comma)
  8596. hasComma = true;
  8597. }
  8598. if ((!hasComma) && (isAnonymous))
  8599. {
  8600. // End type declaration
  8601. break;
  8602. }
  8603. BfTokenNode* commaToken = NULL;
  8604. if (typeDeclaration->mGenericParams != NULL)
  8605. {
  8606. commaToken = ExpectTokenAfter(typeDeclaration, BfToken_Comma, BfToken_Where);
  8607. if ((commaToken != NULL) && (commaToken->GetToken() == BfToken_Where))
  8608. {
  8609. mVisitorPos.mReadPos--;
  8610. break;
  8611. }
  8612. }
  8613. else
  8614. commaToken = ExpectTokenAfter(typeDeclaration, BfToken_Comma);
  8615. if (commaToken == NULL)
  8616. break;
  8617. MoveNode(commaToken, typeDeclaration);
  8618. baseClassCommas.push_back(commaToken);
  8619. }
  8620. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  8621. {
  8622. if (tokenNode->mToken == BfToken_This)
  8623. {
  8624. mVisitorPos.MoveNext();
  8625. auto ctorDecl = mAlloc->Alloc<BfAutoConstructorDeclaration>();
  8626. BfDeferredAstSizedArray<BfParameterDeclaration*> params(ctorDecl->mParams, mAlloc);
  8627. BfDeferredAstSizedArray<BfTokenNode*> commas(ctorDecl->mCommas, mAlloc);
  8628. ctorDecl->mReturnType = NULL;
  8629. ReplaceNode(tokenNode, ctorDecl);
  8630. MEMBER_SET(ctorDecl, mThisToken, tokenNode);
  8631. ParseMethod(ctorDecl, &params, &commas);
  8632. if (!baseClassCommas.IsEmpty())
  8633. {
  8634. ctorDecl->mPrefix = baseClassCommas.back();
  8635. baseClassCommas.pop_back();
  8636. ctorDecl->mSrcStart = ctorDecl->mPrefix->mSrcStart;
  8637. }
  8638. if (typeDeclaration->mAutoCtor == NULL)
  8639. {
  8640. MEMBER_SET(typeDeclaration, mAutoCtor, ctorDecl);
  8641. }
  8642. else
  8643. {
  8644. Fail("Only one auto-constructor is allowed", ctorDecl);
  8645. AddErrorNode(ctorDecl);
  8646. }
  8647. continue;
  8648. }
  8649. }
  8650. auto baseType = CreateTypeRefAfter(typeDeclaration);
  8651. if (baseType == NULL)
  8652. break;
  8653. MoveNode(baseType, typeDeclaration);
  8654. baseClasses.push_back(baseType);
  8655. }
  8656. nextNode = mVisitorPos.GetNext();
  8657. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  8658. }
  8659. if (tokenNode != NULL)
  8660. {
  8661. if (tokenNode->GetToken() == BfToken_Where)
  8662. {
  8663. mVisitorPos.MoveNext();
  8664. auto constraints = CreateGenericConstraintsDeclaration(tokenNode);
  8665. if (constraints != NULL)
  8666. {
  8667. MEMBER_SET(typeDeclaration, mGenericConstraintsDeclaration, constraints);
  8668. }
  8669. nextNode = mVisitorPos.GetNext();
  8670. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  8671. }
  8672. }
  8673. if (tokenNode != NULL)
  8674. {
  8675. if ((tokenNode->GetToken() == BfToken_Semicolon) && (!isAnonymous))
  8676. {
  8677. typeDeclaration->mDefineNode = tokenNode;
  8678. MoveNode(tokenNode, typeDeclaration);
  8679. mVisitorPos.MoveNext();
  8680. return typeDeclaration;
  8681. }
  8682. }
  8683. if ((isAnonymous) && (!BfNodeIsA<BfBlock>(nextNode)))
  8684. return typeDeclaration;
  8685. auto blockNode = ExpectBlockAfter(typeDeclaration);
  8686. if (blockNode != NULL)
  8687. {
  8688. typeDeclaration->mDefineNode = blockNode;
  8689. MoveNode(blockNode, typeDeclaration);
  8690. HandleTypeDeclaration(typeDeclaration, attributes, (deferredHeadNode != NULL) ? deferredHeadNode : attributes);
  8691. }
  8692. return typeDeclaration;
  8693. }
  8694. break;
  8695. default: break;
  8696. }
  8697. if (isSimpleEnum)
  8698. {
  8699. BfIdentifierNode* identifierNode = NULL;
  8700. if (!isAnonymous)
  8701. {
  8702. identifierNode = ExpectIdentifierAfter(tokenNode, "enum name");
  8703. if (identifierNode == NULL)
  8704. return NULL;
  8705. }
  8706. // We put extra effort in here to continue after failure, since 'return NULL' failure
  8707. // means we don't parse members inside type (messes up colorization and such)
  8708. auto typeDeclaration = mAlloc->Alloc<BfTypeDeclaration>();
  8709. BfDeferredAstSizedArray<BfTypeReference*> baseClasses(typeDeclaration->mBaseClasses, mAlloc);
  8710. auto prevTypeDecl = mCurTypeDecl;
  8711. mCurTypeDecl = typeDeclaration;
  8712. typeDeclaration->mTypeNode = tokenNode;
  8713. typeDeclaration->mNameNode = identifierNode;
  8714. ReplaceNode(tokenNode, typeDeclaration);
  8715. if (identifierNode != NULL)
  8716. MoveNode(identifierNode, typeDeclaration);
  8717. typeDeclaration->mDocumentation = FindDocumentation(typeDeclaration);
  8718. auto nextNode = mVisitorPos.GetNext();
  8719. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  8720. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_Colon))
  8721. {
  8722. MEMBER_SET(typeDeclaration, mColonToken, tokenNode);
  8723. mVisitorPos.MoveNext();
  8724. tokenNode = NULL;
  8725. auto baseType = CreateTypeRefAfter(typeDeclaration);
  8726. if (baseType == NULL)
  8727. return NULL;
  8728. MoveNode(baseType, typeDeclaration);
  8729. baseClasses.push_back(baseType);
  8730. }
  8731. auto blockNode = ExpectBlockAfter(typeDeclaration);
  8732. if (blockNode != NULL)
  8733. {
  8734. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(blockNode));
  8735. mVisitorPos.MoveNext();
  8736. for (int fieldNum = 0; true; fieldNum++)
  8737. {
  8738. BfAstNode* child = mVisitorPos.GetCurrent();
  8739. if (child == NULL)
  8740. break;
  8741. if (fieldNum > 0)
  8742. {
  8743. auto commaToken = BfNodeDynCast<BfTokenNode>(child);
  8744. if ((commaToken == NULL) || (commaToken->GetToken() != BfToken_Comma))
  8745. {
  8746. Fail("Comma expected", child);
  8747. break;
  8748. }
  8749. MoveNode(commaToken, mCurTypeDecl);
  8750. mVisitorPos.MoveNext();
  8751. mVisitorPos.Write(commaToken);
  8752. child = mVisitorPos.GetCurrent();
  8753. }
  8754. if (child == NULL)
  8755. break;
  8756. auto fieldDecl = mAlloc->Alloc<BfEnumEntryDeclaration>();
  8757. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(child))
  8758. {
  8759. if (tokenNode->mToken == BfToken_LBracket)
  8760. {
  8761. BfAttributeDirective* attribute = CreateAttributeDirective(tokenNode);
  8762. if (attribute != NULL)
  8763. {
  8764. mVisitorPos.MoveNext();
  8765. child = mVisitorPos.GetCurrent();
  8766. fieldDecl->mAttributes = attribute;
  8767. if (child == NULL)
  8768. break;
  8769. }
  8770. }
  8771. }
  8772. mVisitorPos.MoveNext();
  8773. mVisitorPos.Write(fieldDecl);
  8774. ReplaceNode(child, fieldDecl);
  8775. if (fieldDecl->mAttributes != NULL)
  8776. fieldDecl->mSrcStart = fieldDecl->mAttributes->mSrcStart;
  8777. auto valueName = BfNodeDynCast<BfIdentifierNode>(child);
  8778. if (valueName == NULL)
  8779. {
  8780. Fail("Enum value name expected", child);
  8781. break;
  8782. }
  8783. MEMBER_SET(fieldDecl, mNameNode, valueName);
  8784. auto nextNode = mVisitorPos.GetCurrent();
  8785. if (auto equalsToken = BfNodeDynCast<BfTokenNode>(nextNode))
  8786. {
  8787. if (equalsToken->GetToken() == BfToken_AssignEquals)
  8788. {
  8789. MEMBER_SET(fieldDecl, mEqualsNode, equalsToken);
  8790. fieldDecl->mInitializer = CreateExpressionAfter(fieldDecl);
  8791. if (fieldDecl->mInitializer != NULL)
  8792. {
  8793. mVisitorPos.MoveNext();
  8794. MoveNode(fieldDecl->mInitializer, fieldDecl);
  8795. }
  8796. }
  8797. }
  8798. fieldDecl->mDocumentation = FindDocumentation(fieldDecl, NULL, true);
  8799. MoveNode(fieldDecl, mCurTypeDecl);
  8800. }
  8801. mVisitorPos.Trim();
  8802. }
  8803. typeDeclaration->mDefineNode = blockNode;
  8804. if (blockNode != NULL)
  8805. {
  8806. MoveNode(blockNode, typeDeclaration);
  8807. }
  8808. mCurTypeDecl = prevTypeDecl;
  8809. return typeDeclaration;
  8810. }
  8811. AddErrorNode(tokenNode, false);
  8812. Fail("Unexpected token", tokenNode);
  8813. return NULL;
  8814. }
  8815. BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken token)
  8816. {
  8817. if (!AssertCurrentNode(node))
  8818. return NULL;
  8819. auto nextNode = mVisitorPos.GetNext();
  8820. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  8821. if ((tokenNode == NULL) ||
  8822. (tokenNode->GetToken() != token))
  8823. {
  8824. FailAfter(StrFormat("Expected '%s'", BfTokenToString(token)), node);
  8825. return NULL;
  8826. }
  8827. mVisitorPos.MoveNext();
  8828. return tokenNode;
  8829. }
  8830. BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToken tokenB)
  8831. {
  8832. if (!AssertCurrentNode(node))
  8833. return NULL;
  8834. auto nextNode = mVisitorPos.GetNext();
  8835. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  8836. if ((tokenNode == NULL) ||
  8837. ((tokenNode->GetToken() != tokenA) && (tokenNode->GetToken() != tokenB)))
  8838. {
  8839. FailAfter(StrFormat("Expected '%s' or '%s'", BfTokenToString(tokenA), BfTokenToString(tokenB)), node);
  8840. return NULL;
  8841. }
  8842. mVisitorPos.MoveNext();
  8843. return tokenNode;
  8844. }
  8845. BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToken tokenB, BfToken tokenC)
  8846. {
  8847. if (!AssertCurrentNode(node))
  8848. return NULL;
  8849. auto nextNode = mVisitorPos.GetNext();
  8850. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  8851. BfToken token = BfToken_Null;
  8852. if (tokenNode != NULL)
  8853. token = tokenNode->GetToken();
  8854. if ((tokenNode == NULL) ||
  8855. ((token != tokenA) && (token != tokenB) && (token != tokenC)))
  8856. {
  8857. FailAfter(StrFormat("Expected '%s', '%s', or '%s'", BfTokenToString(tokenA), BfTokenToString(tokenB), BfTokenToString(tokenC)), node);
  8858. return NULL;
  8859. }
  8860. mVisitorPos.MoveNext();
  8861. return tokenNode;
  8862. }
  8863. BfTokenNode* BfReducer::ExpectTokenAfter(BfAstNode* node, BfToken tokenA, BfToken tokenB, BfToken tokenC, BfToken tokenD)
  8864. {
  8865. if (!AssertCurrentNode(node))
  8866. return NULL;
  8867. auto nextNode = mVisitorPos.GetNext();
  8868. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  8869. BfToken token = BfToken_Null;
  8870. if (tokenNode != NULL)
  8871. token = tokenNode->GetToken();
  8872. if ((tokenNode == NULL) ||
  8873. ((token != tokenA) && (token != tokenB) && (token != tokenC) && (token != tokenD)))
  8874. {
  8875. FailAfter(StrFormat("Expected '%s', '%s', '%s', or '%s'", BfTokenToString(tokenA), BfTokenToString(tokenB), BfTokenToString(tokenC), BfTokenToString(tokenD)), node);
  8876. return NULL;
  8877. }
  8878. mVisitorPos.MoveNext();
  8879. return tokenNode;
  8880. }
  8881. BfIdentifierNode* BfReducer::ExpectIdentifierAfter(BfAstNode* node, const char* typeName)
  8882. {
  8883. if (!AssertCurrentNode(node))
  8884. return NULL;
  8885. auto nextNode = mVisitorPos.GetNext();
  8886. auto identifierNode = BfNodeDynCast<BfIdentifierNode>(nextNode);
  8887. if (identifierNode == NULL)
  8888. {
  8889. if (typeName != NULL)
  8890. FailAfter(StrFormat("Expected %s", typeName), node);
  8891. else
  8892. FailAfter("Expected identifier", node);
  8893. return NULL;
  8894. }
  8895. mVisitorPos.MoveNext();
  8896. return identifierNode;
  8897. }
  8898. BfBlock* BfReducer::ExpectBlockAfter(BfAstNode* node)
  8899. {
  8900. if (!AssertCurrentNode(node))
  8901. return NULL;
  8902. auto nextNode = mVisitorPos.GetNext();
  8903. auto block = BfNodeDynCast<BfBlock>(nextNode);
  8904. if (block == NULL)
  8905. {
  8906. FailAfter("Block expected", node);
  8907. return NULL;
  8908. }
  8909. mVisitorPos.MoveNext();
  8910. return block;
  8911. }
  8912. BfTokenNode* BfReducer::BreakDoubleChevron(BfTokenNode* tokenNode)
  8913. {
  8914. // Break up those chevrons
  8915. auto firstChevron = mAlloc->Alloc<BfTokenNode>();
  8916. firstChevron->SetToken(BfToken_RChevron);
  8917. int triviaStart;
  8918. int srcStart;
  8919. int srcEnd;
  8920. tokenNode->GetSrcPositions(triviaStart, srcStart, srcEnd);
  8921. firstChevron->Init(triviaStart, srcStart, srcEnd - 1);
  8922. tokenNode->SetToken(BfToken_RChevron);
  8923. tokenNode->SetSrcStart(srcStart + 1);
  8924. tokenNode->SetTriviaStart(srcStart);
  8925. return firstChevron;
  8926. }
  8927. BfTokenNode* BfReducer::BreakQuestionLBracket(BfTokenNode* tokenNode)
  8928. {
  8929. // Break up those chevrons
  8930. auto firstToken = mAlloc->Alloc<BfTokenNode>();
  8931. firstToken->SetToken(BfToken_Question);
  8932. int triviaStart;
  8933. int srcStart;
  8934. int srcEnd;
  8935. tokenNode->GetSrcPositions(triviaStart, srcStart, srcEnd);
  8936. firstToken->Init(triviaStart, srcStart, srcEnd - 1);
  8937. tokenNode->SetToken(BfToken_LBracket);
  8938. tokenNode->SetSrcStart(srcStart + 1);
  8939. tokenNode->SetTriviaStart(srcStart);
  8940. return firstToken;
  8941. }
  8942. BfCommentNode* BfReducer::FindDocumentation(BfAstNode* defNodeHead, BfAstNode* defNodeEnd, bool checkDocAfter)
  8943. {
  8944. if (defNodeEnd == NULL)
  8945. defNodeEnd = defNodeHead;
  8946. else if (defNodeHead == NULL)
  8947. defNodeHead = defNodeEnd;
  8948. while (mDocumentCheckIdx < mSource->mSidechannelRootNode->mChildArr.mSize)
  8949. {
  8950. auto checkComment = BfNodeDynCast<BfCommentNode>(mSource->mSidechannelRootNode->mChildArr[mDocumentCheckIdx]);
  8951. if ((checkComment == NULL) || (checkComment->mCommentKind == BfCommentKind_Block) || (checkComment->mCommentKind == BfCommentKind_Line))
  8952. {
  8953. mDocumentCheckIdx++;
  8954. continue;
  8955. }
  8956. if (checkComment->GetSrcEnd() > defNodeEnd->GetSrcStart())
  8957. {
  8958. if ((checkComment->mCommentKind == BfCommentKind_Documentation_Line_Post) ||
  8959. (checkComment->mCommentKind == BfCommentKind_Documentation_Block_Post))
  8960. {
  8961. int defEnd = defNodeEnd->GetSrcEnd();
  8962. if (checkDocAfter)
  8963. {
  8964. int endDiff = defEnd - checkComment->GetSrcStart();
  8965. if (endDiff > 256)
  8966. return NULL;
  8967. for (int idx = defEnd; idx < checkComment->GetSrcStart(); idx++)
  8968. {
  8969. char c = mSource->mSrc[idx];
  8970. if (idx == defEnd)
  8971. {
  8972. if ((c == ';') || (c == ','))
  8973. continue;
  8974. }
  8975. if (c == '\n')
  8976. return NULL; // No newline allowed
  8977. if (!isspace((uint8)c))
  8978. return NULL;
  8979. }
  8980. mDocumentCheckIdx++;
  8981. return checkComment;
  8982. }
  8983. }
  8984. return NULL;
  8985. }
  8986. if ((checkComment->mCommentKind != BfCommentKind_Documentation_Line_Pre) &&
  8987. (checkComment->mCommentKind != BfCommentKind_Documentation_Block_Pre))
  8988. {
  8989. // Skip this, not used
  8990. mDocumentCheckIdx++;
  8991. continue;
  8992. }
  8993. if (mDocumentCheckIdx < mSource->mSidechannelRootNode->mChildArr.mSize - 1)
  8994. {
  8995. auto nextComment = mSource->mSidechannelRootNode->mChildArr[mDocumentCheckIdx + 1];
  8996. if (nextComment->GetSrcEnd() <= defNodeHead->GetSrcStart())
  8997. {
  8998. // This comment is still before the node in question
  8999. mDocumentCheckIdx++;
  9000. continue;
  9001. }
  9002. }
  9003. mDocumentCheckIdx++;
  9004. int defSrcIdx = defNodeHead->GetSrcStart();
  9005. for (int idx = checkComment->GetSrcEnd(); idx < defSrcIdx; idx++)
  9006. {
  9007. char c = mSource->mSrc[idx];
  9008. if (!isspace((uint8)c))
  9009. return NULL;
  9010. }
  9011. return checkComment;
  9012. }
  9013. return NULL;
  9014. }
  9015. BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfParameterDeclaration*>* params, SizedArrayImpl<BfTokenNode*>* commas, BfToken endToken, bool requireNames)
  9016. {
  9017. BfAstNode* nameAfterNode = node;
  9018. BfAttributeDirective* attributes = NULL;
  9019. for (int paramIdx = 0; true; paramIdx++)
  9020. {
  9021. auto nextNode = ReplaceTokenStarter(mVisitorPos.GetNext(), mVisitorPos.mReadPos + 1, true);
  9022. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  9023. if (tokenNode != NULL)
  9024. {
  9025. BfToken token = tokenNode->GetToken();
  9026. if ((paramIdx > 0) && (token == BfToken_AssignEquals))
  9027. {
  9028. auto paramDecl = params->back();
  9029. MEMBER_SET(paramDecl, mEqualsNode, tokenNode);
  9030. paramDecl->mEqualsNode = tokenNode;
  9031. mVisitorPos.MoveNext();
  9032. mSkipCurrentNodeAssert = true;
  9033. auto initExpr = CreateExpressionAfter(node);
  9034. mSkipCurrentNodeAssert = false;
  9035. if (initExpr == NULL)
  9036. return NULL;
  9037. MEMBER_SET(paramDecl, mInitializer, initExpr);
  9038. node->mSrcEnd = paramDecl->mSrcEnd;
  9039. auto nextNode = mVisitorPos.GetNext();
  9040. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  9041. if (tokenNode == NULL)
  9042. return NULL;
  9043. token = tokenNode->GetToken();
  9044. }
  9045. if (token == endToken)
  9046. return tokenNode;
  9047. if ((paramIdx == 0) && (
  9048. (token == BfToken_In) || (token == BfToken_Out) || (token == BfToken_Ref) || (token == BfToken_Mut) ||
  9049. (token == BfToken_Delegate) || (token == BfToken_Function) ||
  9050. (token == BfToken_Comptype) || (token == BfToken_Decltype) ||
  9051. (token == BfToken_AllocType) || (token == BfToken_RetType) ||
  9052. (token == BfToken_Params) || (token == BfToken_LParen) ||
  9053. (token == BfToken_Var) || (token == BfToken_LBracket) ||
  9054. (token == BfToken_ReadOnly) || (token == BfToken_DotDotDot) ||
  9055. BfTokenIsTypeDecl(token)))
  9056. {
  9057. // These get picked up below
  9058. }
  9059. else
  9060. {
  9061. if ((paramIdx == 0) || (token != BfToken_Comma))
  9062. {
  9063. Fail("Expected ')' or parameter list", tokenNode);
  9064. return NULL;
  9065. }
  9066. if (paramIdx > 0)
  9067. commas->push_back(tokenNode);
  9068. MoveNode(tokenNode, node);
  9069. mVisitorPos.MoveNext();
  9070. }
  9071. nameAfterNode = tokenNode;
  9072. }
  9073. else
  9074. {
  9075. if (paramIdx > 0)
  9076. {
  9077. FailAfter("Expected ')' or additional parameters", nameAfterNode);
  9078. return NULL;
  9079. }
  9080. }
  9081. bool nextNextIsIdentifier = BfNodeIsA<BfIdentifierNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2));
  9082. attributes = NULL;
  9083. BfTokenNode* modTokenNode = NULL;
  9084. nextNode = ReplaceTokenStarter(mVisitorPos.GetNext(), mVisitorPos.mReadPos + 1, nextNextIsIdentifier);
  9085. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  9086. BfTypeReference* typeRef = NULL;
  9087. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_LBracket))
  9088. {
  9089. mVisitorPos.MoveNext();
  9090. attributes = CreateAttributeDirective(tokenNode);
  9091. if (attributes != NULL)
  9092. {
  9093. nameAfterNode = attributes;
  9094. auto nextNode = mVisitorPos.GetNext();
  9095. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  9096. }
  9097. }
  9098. int paramStartReadPos = mVisitorPos.mReadPos;
  9099. bool isParams = false;
  9100. if (tokenNode != NULL)
  9101. {
  9102. BfToken token = tokenNode->GetToken();
  9103. if ((token == BfToken_Var) || (token == BfToken_LParen) ||
  9104. (token == BfToken_Delegate) || (token == BfToken_Function) ||
  9105. (token == BfToken_Comptype) || (token == BfToken_Decltype) ||
  9106. (token == BfToken_AllocType) || (token == BfToken_RetType) ||
  9107. (token == BfToken_DotDotDot) || BfTokenIsTypeDecl(token))
  9108. {
  9109. mVisitorPos.MoveNext();
  9110. typeRef = CreateTypeRef(tokenNode);
  9111. }
  9112. else
  9113. {
  9114. if ((token != BfToken_In) && (token != BfToken_Out) && (token != BfToken_Ref) && (token != BfToken_Mut) && (token != BfToken_Params) && (token != BfToken_ReadOnly))
  9115. {
  9116. if (attributes != NULL)
  9117. {
  9118. auto paramDecl = mAlloc->Alloc<BfParameterDeclaration>();
  9119. ReplaceNode(attributes, paramDecl);
  9120. MoveNode(paramDecl, node);
  9121. params->push_back(paramDecl);
  9122. MEMBER_SET(paramDecl, mAttributes, attributes);
  9123. attributes = NULL;
  9124. }
  9125. Fail("Invalid token", tokenNode);
  9126. return NULL;
  9127. }
  9128. if (token == BfToken_Params)
  9129. isParams = true;
  9130. modTokenNode = tokenNode;
  9131. nameAfterNode = modTokenNode;
  9132. mVisitorPos.MoveNext();
  9133. }
  9134. }
  9135. if (typeRef == NULL)
  9136. {
  9137. auto nextNode = mVisitorPos.GetNext();
  9138. if (nextNode == NULL)
  9139. {
  9140. FailAfter("Type expected", nameAfterNode);
  9141. break;
  9142. }
  9143. mVisitorPos.MoveNext();
  9144. typeRef = CreateTypeRef(nextNode);
  9145. if (typeRef == NULL)
  9146. {
  9147. mVisitorPos.mReadPos = paramStartReadPos;
  9148. break;
  9149. }
  9150. }
  9151. BfToken modToken = BfToken_None;
  9152. if (modTokenNode != NULL)
  9153. modToken = modTokenNode->GetToken();
  9154. if ((modTokenNode != NULL) && ((modToken == BfToken_Ref) || (modToken == BfToken_Mut) || (modToken == BfToken_In) || (modToken == BfToken_Out)))
  9155. {
  9156. typeRef = CreateRefTypeRef(typeRef, modTokenNode);
  9157. modTokenNode = NULL;
  9158. }
  9159. auto paramDecl = mAlloc->Alloc<BfParameterDeclaration>();
  9160. ReplaceNode(typeRef, paramDecl);
  9161. MoveNode(paramDecl, node);
  9162. params->push_back(paramDecl);
  9163. MEMBER_SET(paramDecl, mTypeRef, typeRef);
  9164. if (attributes != NULL)
  9165. {
  9166. MEMBER_SET(paramDecl, mAttributes, attributes);
  9167. attributes = NULL;
  9168. }
  9169. if (modTokenNode != NULL)
  9170. {
  9171. MEMBER_SET(paramDecl, mModToken, modTokenNode);
  9172. }
  9173. if ((tokenNode != NULL) && (tokenNode->mToken == BfToken_DotDotDot))
  9174. continue;
  9175. bool allowNameFail = false;
  9176. bool nextIsName = false;
  9177. auto afterNameTokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2));
  9178. if (afterNameTokenNode != NULL)
  9179. {
  9180. BfToken afterNameToken = afterNameTokenNode->GetToken();
  9181. if ((afterNameToken == BfToken_Comma) ||
  9182. (afterNameToken == BfToken_AssignEquals) ||
  9183. (afterNameToken == BfToken_RParen))
  9184. {
  9185. nextIsName = true;
  9186. }
  9187. }
  9188. // We definitely have a failure, but we want to attempt to scan to the actual param name if we can...
  9189. if (!nextIsName)
  9190. {
  9191. int nameIdx = -1;
  9192. int checkIdx = mVisitorPos.mReadPos + 1;
  9193. bool useNameIdx = true;
  9194. int parenDepth = 1;
  9195. int bracketDepth = 0;
  9196. while (true)
  9197. {
  9198. auto checkNode = mVisitorPos.Get(checkIdx);
  9199. auto checkTokenNode = BfNodeDynCast<BfTokenNode>(checkNode);
  9200. if (checkTokenNode != NULL)
  9201. {
  9202. BfToken checkToken = checkTokenNode->GetToken();
  9203. if (nameIdx == -1)
  9204. {
  9205. if ((parenDepth == 1) && (bracketDepth == 0))
  9206. {
  9207. if ((checkToken == BfToken_Comma) ||
  9208. (checkToken == BfToken_AssignEquals) ||
  9209. (checkToken == BfToken_RParen))
  9210. {
  9211. if (auto nameIdentifier = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.Get(checkIdx - 1)))
  9212. {
  9213. nameIdx = checkIdx - 1;
  9214. }
  9215. else
  9216. {
  9217. useNameIdx = false;
  9218. break;
  9219. }
  9220. }
  9221. }
  9222. }
  9223. if (checkToken == BfToken_RParen)
  9224. parenDepth--;
  9225. else if (checkToken == BfToken_LParen)
  9226. parenDepth++;
  9227. else if (checkToken == BfToken_LBracket)
  9228. bracketDepth++;
  9229. else if (checkToken == BfToken_RBracket)
  9230. bracketDepth--;
  9231. if (parenDepth == 0)
  9232. {
  9233. if (bracketDepth != 0)
  9234. useNameIdx = false;
  9235. break;
  9236. }
  9237. if (checkToken == BfToken_Semicolon)
  9238. {
  9239. useNameIdx = false;
  9240. break;
  9241. }
  9242. }
  9243. else if (auto identifier = BfNodeDynCast<BfIdentifierNode>(checkNode))
  9244. {
  9245. // Okay
  9246. }
  9247. else
  9248. {
  9249. // Nothing else is okay
  9250. useNameIdx = false;
  9251. break;
  9252. }
  9253. checkIdx++;
  9254. }
  9255. if ((useNameIdx) && (nameIdx != -1))
  9256. {
  9257. if (nameIdx <= mVisitorPos.mReadPos)
  9258. {
  9259. // We have a valid-enough param list but a missing name, so keep going
  9260. allowNameFail = true;
  9261. }
  9262. else
  9263. {
  9264. for (int errIdx = mVisitorPos.mReadPos + 1; errIdx < nameIdx; errIdx++)
  9265. {
  9266. auto node = mVisitorPos.Get(errIdx);
  9267. if (auto token = BfNodeDynCast<BfTokenNode>(node))
  9268. Fail("Unexpected token", node);
  9269. else
  9270. Fail("Unexpected identifier", node);
  9271. AddErrorNode(node);
  9272. }
  9273. auto nameIdentifierNode = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.Get(nameIdx));
  9274. paramDecl->mNameNode = nameIdentifierNode;
  9275. MoveNode(nameIdentifierNode, paramDecl);
  9276. nameAfterNode = nameIdentifierNode;
  9277. mVisitorPos.mReadPos = nameIdx;
  9278. continue;
  9279. //mVisitorPos.mReadPos = nameIdx - 1;
  9280. }
  9281. }
  9282. }
  9283. if (auto nameToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  9284. {
  9285. if ((nameToken->GetToken() == BfToken_This))
  9286. {
  9287. bool isDelegate = false;
  9288. bool isFunction = false;
  9289. if (auto delegateTypeRef = BfNodeDynCast<BfDelegateTypeRef>(node))
  9290. {
  9291. if (delegateTypeRef->mTypeToken->GetToken() == BfToken_Function)
  9292. isFunction = true;
  9293. else
  9294. isDelegate = true;
  9295. }
  9296. else if ((mCurTypeDecl->mTypeNode != NULL) && (mCurTypeDecl->mTypeNode->GetToken() == BfToken_Function))
  9297. isFunction = true;
  9298. else if ((mCurTypeDecl->mTypeNode != NULL) && (mCurTypeDecl->mTypeNode->GetToken() == BfToken_Delegate))
  9299. isDelegate = true;
  9300. if (isFunction || isDelegate)
  9301. {
  9302. if (paramIdx != 0)
  9303. Fail("'this' can only be used as the first parameter", nameToken);
  9304. if (!isFunction)
  9305. Fail("'this' can only be specified on function types", nameToken);
  9306. mVisitorPos.MoveNext();
  9307. paramDecl->mNameNode = nameToken;
  9308. MoveNode(nameToken, paramDecl);
  9309. nameAfterNode = nameToken;
  9310. }
  9311. }
  9312. }
  9313. if (paramDecl->mNameNode == NULL)
  9314. {
  9315. BfAstNode* nameIdentifierNode;
  9316. if (requireNames)
  9317. {
  9318. nameIdentifierNode = ExpectIdentifierAfter(node, "parameter name");
  9319. if (nameIdentifierNode == NULL)
  9320. {
  9321. if (!allowNameFail)
  9322. return NULL;
  9323. }
  9324. }
  9325. else
  9326. {
  9327. nameIdentifierNode = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext());
  9328. if (nameIdentifierNode != NULL)
  9329. mVisitorPos.MoveNext();
  9330. }
  9331. if (nameIdentifierNode != NULL)
  9332. {
  9333. paramDecl->mNameNode = nameIdentifierNode;
  9334. MoveNode(nameIdentifierNode, paramDecl);
  9335. nameAfterNode = nameIdentifierNode;
  9336. }
  9337. }
  9338. node->mSrcEnd = paramDecl->mSrcEnd;
  9339. }
  9340. if (attributes != NULL)
  9341. {
  9342. Fail("Unexpected attributes", attributes);
  9343. AddErrorNode(attributes);
  9344. }
  9345. return NULL;
  9346. }
  9347. bool BfReducer::ParseMethod(BfMethodDeclaration* methodDeclaration, SizedArrayImpl<BfParameterDeclaration*>* params, SizedArrayImpl<BfTokenNode*>* commas, bool alwaysIncludeBlock)
  9348. {
  9349. BfTokenNode* tokenNode;
  9350. auto nextNode = mVisitorPos.GetNext();
  9351. if (methodDeclaration->mGenericParams == NULL)
  9352. {
  9353. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  9354. {
  9355. if (tokenNode->GetToken() == BfToken_LChevron)
  9356. {
  9357. auto genericParams = CreateGenericParamsDeclaration(tokenNode);
  9358. if (genericParams != NULL)
  9359. {
  9360. MEMBER_SET(methodDeclaration, mGenericParams, genericParams);
  9361. }
  9362. }
  9363. }
  9364. }
  9365. tokenNode = ExpectTokenAfter(methodDeclaration, BfToken_LParen, BfToken_Bang);
  9366. if (tokenNode == NULL)
  9367. return false;
  9368. if (tokenNode->GetToken() == BfToken_Bang)
  9369. {
  9370. Fail("Cannot include '!' in the method declaration", tokenNode);
  9371. MoveNode(tokenNode, methodDeclaration);
  9372. tokenNode = ExpectTokenAfter(methodDeclaration, BfToken_LParen);
  9373. if (tokenNode == NULL)
  9374. return false;
  9375. }
  9376. methodDeclaration->mOpenParen = tokenNode;
  9377. MoveNode(methodDeclaration->mOpenParen, methodDeclaration);
  9378. bool isFunction = false;
  9379. bool isDelegate = false;
  9380. if ((mCurTypeDecl != NULL) && (mCurTypeDecl->mTypeNode != NULL) && (mCurTypeDecl->mTypeNode->GetToken() == BfToken_Function))
  9381. isFunction = true;
  9382. else if ((mCurTypeDecl != NULL) && (mCurTypeDecl->mTypeNode != NULL) && (mCurTypeDecl->mTypeNode->GetToken() == BfToken_Delegate))
  9383. isDelegate = true;
  9384. if ((!isFunction) && (!isDelegate))
  9385. {
  9386. if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  9387. {
  9388. if (nextToken->mToken == BfToken_This)
  9389. {
  9390. MEMBER_SET(methodDeclaration, mThisToken, nextToken);
  9391. mVisitorPos.MoveNext();
  9392. }
  9393. }
  9394. }
  9395. methodDeclaration->mCloseParen = ParseMethodParams(methodDeclaration, params, commas, BfToken_RParen, false);
  9396. // RParen
  9397. if (methodDeclaration->mCloseParen == NULL)
  9398. {
  9399. auto nextNode = mVisitorPos.GetNext();
  9400. while (auto checkToken = BfNodeDynCast<BfTokenNode>(nextNode))
  9401. {
  9402. if (checkToken->GetToken() == BfToken_RParen)
  9403. {
  9404. methodDeclaration->mCloseParen = checkToken;
  9405. break;
  9406. }
  9407. else
  9408. {
  9409. // Just eat it - for autocompletion. This helps make cases nicer where we're typing in the "in" for "int", for example
  9410. MoveNode(checkToken, methodDeclaration);
  9411. AddErrorNode(checkToken);
  9412. mVisitorPos.MoveNext();
  9413. nextNode = mVisitorPos.GetNext();
  9414. }
  9415. }
  9416. if (methodDeclaration->mCloseParen == NULL)
  9417. return false;
  9418. }
  9419. MoveNode(methodDeclaration->mCloseParen, methodDeclaration);
  9420. mVisitorPos.MoveNext();
  9421. auto ctorDecl = BfNodeDynCast<BfConstructorDeclaration>(methodDeclaration);
  9422. if (auto autoCtorDecl = BfNodeDynCast<BfAutoConstructorDeclaration>(ctorDecl))
  9423. return true;
  9424. auto typeDecl = mCurTypeDecl;
  9425. nextNode = mVisitorPos.GetNext();
  9426. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  9427. {
  9428. if (tokenNode->GetToken() == BfToken_Mut)
  9429. {
  9430. if (methodDeclaration->mMutSpecifier != NULL)
  9431. {
  9432. AddErrorNode(methodDeclaration->mMutSpecifier);
  9433. Fail("Mut already specified", methodDeclaration->mMutSpecifier);
  9434. }
  9435. MEMBER_SET(methodDeclaration, mMutSpecifier, tokenNode);
  9436. mVisitorPos.MoveNext();
  9437. nextNode = mVisitorPos.GetNext();
  9438. }
  9439. }
  9440. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  9441. {
  9442. if (tokenNode->GetToken() == BfToken_Where)
  9443. {
  9444. mVisitorPos.MoveNext();
  9445. auto genericConstraints = CreateGenericConstraintsDeclaration(tokenNode);
  9446. MEMBER_SET_CHECKED_BOOL(methodDeclaration, mGenericConstraintsDeclaration, genericConstraints);
  9447. }
  9448. }
  9449. nextNode = mVisitorPos.GetNext();
  9450. auto endToken = BfNodeDynCast<BfTokenNode>(nextNode);
  9451. if ((endToken != NULL) && (endToken->GetToken() == BfToken_Colon))
  9452. {
  9453. if (auto ctorDecl = BfNodeDynCast<BfConstructorDeclaration>(methodDeclaration))
  9454. {
  9455. MEMBER_SET(ctorDecl, mInitializerColonToken, endToken);
  9456. mVisitorPos.MoveNext();
  9457. BfAstNode* invokeAfter = ctorDecl;
  9458. auto nextNode = mVisitorPos.GetNext();
  9459. BfAttributeDirective* attributeDirective = NULL;
  9460. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  9461. {
  9462. if (nextToken->mToken == BfToken_LBracket)
  9463. {
  9464. mVisitorPos.MoveNext();
  9465. attributeDirective = CreateAttributeDirective(nextToken);
  9466. nextNode = mVisitorPos.GetNext();
  9467. if (attributeDirective != NULL)
  9468. invokeAfter = attributeDirective;
  9469. }
  9470. }
  9471. endToken = ExpectTokenAfter(invokeAfter, BfToken_This, BfToken_Base);
  9472. if (endToken != NULL)
  9473. {
  9474. auto invocationExpr = CreateInvocationExpression(endToken);
  9475. if (invocationExpr != NULL)
  9476. {
  9477. MEMBER_SET(ctorDecl, mInitializer, invocationExpr);
  9478. }
  9479. }
  9480. else if (auto identifierAfter = BfNodeDynCast<BfIdentifierNode>(nextNode))
  9481. {
  9482. // In process of typing - just eat identifier so we don't error out on whole method
  9483. MoveNode(identifierAfter, ctorDecl);
  9484. mVisitorPos.MoveNext();
  9485. AddErrorNode(identifierAfter);
  9486. }
  9487. if (attributeDirective != NULL)
  9488. {
  9489. BfAttributedExpression* attribExpr = mAlloc->Alloc<BfAttributedExpression>();
  9490. ReplaceNode(attributeDirective, attribExpr);
  9491. attribExpr->mAttributes = attributeDirective;
  9492. if (ctorDecl->mInitializer != NULL)
  9493. {
  9494. MEMBER_SET(attribExpr, mExpression, ctorDecl->mInitializer);
  9495. }
  9496. MEMBER_SET(ctorDecl, mInitializer, attribExpr);
  9497. }
  9498. }
  9499. endToken = NULL;
  9500. }
  9501. if ((endToken != NULL) && (endToken->GetToken() == BfToken_Semicolon))
  9502. {
  9503. MEMBER_SET_CHECKED_BOOL(methodDeclaration, mEndSemicolon, endToken);
  9504. mVisitorPos.MoveNext();
  9505. }
  9506. else
  9507. {
  9508. nextNode = mVisitorPos.GetNext();
  9509. auto blockNode = BfNodeDynCast<BfBlock>(nextNode);
  9510. if (blockNode != NULL)
  9511. {
  9512. methodDeclaration->mBody = blockNode;
  9513. MoveNode(blockNode, methodDeclaration);
  9514. mVisitorPos.MoveNext();
  9515. if ((IsNodeRelevant(methodDeclaration)) || (alwaysIncludeBlock))
  9516. {
  9517. SetAndRestoreValue<BfMethodDeclaration*> prevMethodDeclaration(mCurMethodDecl, methodDeclaration);
  9518. HandleBlock(blockNode, methodDeclaration->mMixinSpecifier != NULL);
  9519. }
  9520. return true;
  9521. }
  9522. else
  9523. {
  9524. nextNode = mVisitorPos.GetNext();
  9525. auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  9526. if ((tokenNode != NULL) && (tokenNode->GetToken() == BfToken_FatArrow))
  9527. {
  9528. MEMBER_SET(methodDeclaration, mFatArrowToken, tokenNode);
  9529. mVisitorPos.MoveNext();
  9530. auto methodExpression = CreateExpressionAfter(methodDeclaration);
  9531. MEMBER_SET_CHECKED_BOOL(methodDeclaration, mBody, methodExpression);
  9532. auto semicolonToken = ExpectTokenAfter(methodDeclaration, BfToken_Semicolon);
  9533. MEMBER_SET_CHECKED_BOOL(methodDeclaration, mEndSemicolon, semicolonToken);
  9534. return true;
  9535. }
  9536. }
  9537. FailAfter("Expected method body", methodDeclaration);
  9538. }
  9539. return true;
  9540. }
  9541. BfGenericArgumentsNode* BfReducer::CreateGenericArguments(BfTokenNode* tokenNode, bool allowPartial)
  9542. {
  9543. auto genericArgs = mAlloc->Alloc<BfGenericArgumentsNode>();
  9544. BfDeferredAstSizedArray<BfAstNode*> genericArgsArray(genericArgs->mGenericArgs, mAlloc);
  9545. BfDeferredAstSizedArray<BfAstNode*> commas(genericArgs->mCommas, mAlloc);
  9546. ReplaceNode(tokenNode, genericArgs);
  9547. genericArgs->mOpenChevron = tokenNode;
  9548. while (true)
  9549. {
  9550. bool doAsExpr = false;
  9551. auto nextNode = mVisitorPos.GetNext();
  9552. if (BfNodeIsA<BfLiteralExpression>(nextNode))
  9553. doAsExpr = true;
  9554. else if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  9555. {
  9556. if (tokenNode->mToken == BfToken_Question)
  9557. doAsExpr = true;
  9558. }
  9559. BfAstNode* genericArg = NULL;
  9560. if (doAsExpr)
  9561. genericArg = CreateExpressionAfter(genericArgs, CreateExprFlags_BreakOnRChevron);
  9562. else
  9563. genericArg = CreateTypeRefAfter(genericArgs);
  9564. if (genericArg == NULL)
  9565. {
  9566. genericArgsArray.push_back(NULL); // Leave empty for purposes of generic argument count
  9567. auto nextNode = mVisitorPos.GetNext();
  9568. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  9569. if (tokenNode != NULL)
  9570. {
  9571. // Try to get right chevron. Reduces error count when we're typing out a generic argument list
  9572. if (tokenNode->GetToken() == BfToken_RDblChevron)
  9573. tokenNode = BreakDoubleChevron(tokenNode);
  9574. if (tokenNode->GetToken() == BfToken_RChevron)
  9575. {
  9576. MoveNode(tokenNode, genericArgs);
  9577. genericArgs->mCloseChevron = tokenNode;
  9578. mVisitorPos.MoveNext();
  9579. }
  9580. }
  9581. return genericArgs;
  9582. }
  9583. MoveNode(genericArg, genericArgs);
  9584. genericArgsArray.push_back(genericArg);
  9585. nextNode = mVisitorPos.GetNext();
  9586. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  9587. if (tokenNode == NULL)
  9588. {
  9589. FailAfter("Expected ',' or '>'", genericArgs);
  9590. return genericArgs;
  9591. }
  9592. BfToken token = tokenNode->GetToken();
  9593. if (token == BfToken_RDblChevron)
  9594. tokenNode = BreakDoubleChevron(tokenNode);
  9595. if ((token == BfToken_DotDotDot) && (allowPartial))
  9596. {
  9597. commas.push_back(tokenNode);
  9598. mVisitorPos.MoveNext();
  9599. nextNode = mVisitorPos.GetNext();
  9600. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  9601. token = tokenNode->GetToken();
  9602. }
  9603. if (token == BfToken_RChevron)
  9604. {
  9605. MoveNode(tokenNode, genericArgs);
  9606. genericArgs->mCloseChevron = tokenNode;
  9607. mVisitorPos.MoveNext();
  9608. break;
  9609. }
  9610. if (token != BfToken_Comma)
  9611. {
  9612. Fail("Either , or > expected", tokenNode);
  9613. return genericArgs;
  9614. }
  9615. MoveNode(tokenNode, genericArgs);
  9616. commas.push_back(tokenNode);
  9617. mVisitorPos.MoveNext();
  9618. }
  9619. return genericArgs;
  9620. }
  9621. BfGenericParamsDeclaration* BfReducer::CreateGenericParamsDeclaration(BfTokenNode* tokenNode)
  9622. {
  9623. auto genericParams = mAlloc->Alloc<BfGenericParamsDeclaration>();
  9624. BfDeferredAstSizedArray<BfIdentifierNode*> genericParamsArr(genericParams->mGenericParams, mAlloc);
  9625. BfDeferredAstSizedArray<BfAstNode*> commas(genericParams->mCommas, mAlloc);
  9626. ReplaceNode(tokenNode, genericParams);
  9627. genericParams->mOpenChevron = tokenNode;
  9628. mVisitorPos.MoveNext();
  9629. while (true)
  9630. {
  9631. auto genericIdentifier = ExpectIdentifierAfter(genericParams, "generic parameters");
  9632. if (genericIdentifier == NULL)
  9633. return genericParams;
  9634. MoveNode(genericIdentifier, genericParams);
  9635. genericParamsArr.push_back(genericIdentifier);
  9636. auto nextNode = mVisitorPos.GetNext();
  9637. tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
  9638. if (tokenNode == NULL)
  9639. {
  9640. FailAfter("Expected ',' or '>'", genericParams);
  9641. return genericParams;
  9642. }
  9643. BfToken token = tokenNode->GetToken();
  9644. if (token == BfToken_RDblChevron)
  9645. tokenNode = BreakDoubleChevron(tokenNode);
  9646. MoveNode(tokenNode, genericParams);
  9647. mVisitorPos.MoveNext();
  9648. if (token == BfToken_RChevron)
  9649. {
  9650. genericParams->mCloseChevron = tokenNode;
  9651. break;
  9652. }
  9653. if (token != BfToken_Comma)
  9654. {
  9655. Fail("Either , or > expected", tokenNode);
  9656. return genericParams;
  9657. }
  9658. commas.push_back(tokenNode);
  9659. }
  9660. return genericParams;
  9661. }
  9662. BfGenericConstraintsDeclaration* BfReducer::CreateGenericConstraintsDeclaration(BfTokenNode* tokenNode)
  9663. {
  9664. auto constraintsDeclaration = mAlloc->Alloc<BfGenericConstraintsDeclaration>();
  9665. BfDeferredAstSizedArray<BfAstNode*> genericConstraintsArr(constraintsDeclaration->mGenericConstraints, mAlloc);
  9666. bool isDone = false;
  9667. for (int constraintIdx = 0; !isDone; constraintIdx++)
  9668. {
  9669. // if (auto nextToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  9670. // {
  9671. // if (nextToken->mToken == BfToken_LParen)
  9672. // {
  9673. // BfGenericConstraintExpression* genericConstraint = mAlloc->Alloc<BfGenericConstraintExpression>();
  9674. // ReplaceNode(tokenNode, genericConstraint);
  9675. // genericConstraint->mWhereToken = tokenNode;
  9676. // constraintsDeclaration->mHasExpressions = true;
  9677. //
  9678. // genericConstraintsArr.push_back(genericConstraint);
  9679. //
  9680. // auto expr = CreateExpressionAfter(genericConstraint, CreateExprFlags_EarlyExit);
  9681. // if (expr == NULL)
  9682. // break;
  9683. //
  9684. // MEMBER_SET(genericConstraint, mExpression, expr);
  9685. //
  9686. // BfTokenNode* nextWhereToken = NULL;
  9687. // if (auto checkToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
  9688. // {
  9689. // if (checkToken->mToken != BfToken_Where)
  9690. // nextWhereToken = checkToken;
  9691. // }
  9692. //
  9693. // auto nextNode = mVisitorPos.GetNext();
  9694. // if (BfNodeDynCast<BfBlock>(nextNode))
  9695. // break;
  9696. //
  9697. // bool handled = false;
  9698. // if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  9699. // {
  9700. // if (tokenNode->mToken == BfToken_FatArrow)
  9701. // break;
  9702. // }
  9703. //
  9704. // tokenNode = ExpectTokenAfter(genericConstraint, BfToken_LBrace, BfToken_Where, BfToken_Semicolon);
  9705. // if (tokenNode == NULL)
  9706. // break;
  9707. //
  9708. // BfToken token = tokenNode->GetToken();
  9709. // if (token != BfToken_Where)
  9710. // {
  9711. // mVisitorPos.mReadPos--;
  9712. // break;
  9713. // }
  9714. //
  9715. // continue;
  9716. // }
  9717. // }
  9718. BfGenericConstraint* genericConstraint = mAlloc->Alloc<BfGenericConstraint>();
  9719. BfDeferredAstSizedArray<BfAstNode*> constraintTypes(genericConstraint->mConstraintTypes, mAlloc);
  9720. BfDeferredAstSizedArray<BfTokenNode*> commas(genericConstraint->mCommas, mAlloc);
  9721. ReplaceNode(tokenNode, genericConstraint);
  9722. genericConstraint->mWhereToken = tokenNode;
  9723. genericConstraintsArr.push_back(genericConstraint);
  9724. auto genericParamName = CreateTypeRefAfter(genericConstraint);
  9725. if (genericParamName != NULL)
  9726. {
  9727. MEMBER_SET(genericConstraint, mTypeRef, genericParamName);
  9728. tokenNode = ExpectTokenAfter(genericConstraint, BfToken_Colon);
  9729. }
  9730. else
  9731. isDone = true;
  9732. if (tokenNode != NULL)
  9733. {
  9734. MEMBER_SET(genericConstraint, mColonToken, tokenNode);
  9735. }
  9736. else
  9737. isDone = true;
  9738. for (int typeIdx = 0; !isDone; typeIdx++)
  9739. {
  9740. if (typeIdx > 0)
  9741. {
  9742. auto nextNode = mVisitorPos.GetNext();
  9743. if (BfNodeDynCast<BfBlock>(nextNode))
  9744. {
  9745. isDone = true;
  9746. break;
  9747. }
  9748. bool handled = false;
  9749. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  9750. {
  9751. if ((tokenNode->mToken == BfToken_FatArrow) || (tokenNode->mToken == BfToken_Colon))
  9752. {
  9753. isDone = true;
  9754. break;
  9755. }
  9756. }
  9757. tokenNode = ExpectTokenAfter(genericConstraint, BfToken_Comma, BfToken_LBrace, BfToken_Where, BfToken_Semicolon);
  9758. if (tokenNode == NULL)
  9759. {
  9760. isDone = true;
  9761. break;
  9762. }
  9763. BfToken token = tokenNode->GetToken();
  9764. if (token == BfToken_Where)
  9765. break;
  9766. if ((token == BfToken_LBrace) || (token == BfToken_Semicolon))
  9767. {
  9768. mVisitorPos.mReadPos--;
  9769. isDone = true;
  9770. break;
  9771. }
  9772. MoveNode(tokenNode, genericConstraint);
  9773. commas.push_back(tokenNode);
  9774. }
  9775. auto nextNode = mVisitorPos.GetNext();
  9776. if (auto constraintToken = BfNodeDynCast<BfTokenNode>(nextNode))
  9777. {
  9778. BfAstNode* constraintNode = NULL;
  9779. bool addToConstraint = false;
  9780. switch (constraintToken->GetToken())
  9781. {
  9782. case BfToken_Class:
  9783. case BfToken_Struct:
  9784. case BfToken_Const:
  9785. case BfToken_Concrete:
  9786. case BfToken_Var:
  9787. case BfToken_New:
  9788. case BfToken_Delete:
  9789. case BfToken_Enum:
  9790. case BfToken_Interface:
  9791. addToConstraint = true;
  9792. break;
  9793. case BfToken_Operator:
  9794. {
  9795. BfGenericOperatorConstraint* opConstraint = mAlloc->Alloc<BfGenericOperatorConstraint>();
  9796. constraintNode = opConstraint;
  9797. ReplaceNode(constraintToken, opConstraint);
  9798. MEMBER_SET(opConstraint, mOperatorToken, constraintToken);
  9799. mVisitorPos.MoveNext();
  9800. auto opToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  9801. if (opToken == NULL)
  9802. {
  9803. auto typeRef = CreateTypeRefAfter(opConstraint, BfReducer::CreateTypeRefFlags_SafeGenericParse);
  9804. if (typeRef == NULL)
  9805. break;
  9806. MEMBER_SET(opConstraint, mLeftType, typeRef);
  9807. opToken = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext());
  9808. if (opToken == NULL)
  9809. {
  9810. if (auto pointerTypeRef = BfNodeDynCast<BfPointerTypeRef>(typeRef))
  9811. {
  9812. MEMBER_SET(opConstraint, mLeftType, pointerTypeRef->mElementType);
  9813. opToken = pointerTypeRef->mStarNode;
  9814. MEMBER_SET(opConstraint, mOpToken, opToken);
  9815. }
  9816. }
  9817. }
  9818. if (opConstraint->mOpToken == NULL)
  9819. {
  9820. if (opToken == NULL)
  9821. {
  9822. Fail("Conversion operators require either 'implicit' or 'explicit' qualifiers", opConstraint->mOperatorToken);
  9823. break;
  9824. }
  9825. MEMBER_SET(opConstraint, mOpToken, opToken);
  9826. mVisitorPos.MoveNext();
  9827. }
  9828. auto typeRef = CreateTypeRefAfter(opConstraint);
  9829. if (typeRef == NULL)
  9830. break;
  9831. MEMBER_SET(opConstraint, mRightType, typeRef);
  9832. }
  9833. break;
  9834. default: break;
  9835. }
  9836. if (addToConstraint)
  9837. {
  9838. constraintNode = constraintToken;
  9839. bool addToConstraint = false;
  9840. mVisitorPos.MoveNext();
  9841. if (constraintToken->GetToken() == BfToken_Struct)
  9842. {
  9843. addToConstraint = true;
  9844. nextNode = mVisitorPos.GetNext();
  9845. if ((tokenNode = BfNodeDynCast<BfTokenNode>(nextNode)))
  9846. {
  9847. if (tokenNode->GetToken() == BfToken_Star)
  9848. {
  9849. auto tokenPair = mAlloc->Alloc<BfTokenPairNode>();
  9850. ReplaceNode(constraintToken, tokenPair);
  9851. MEMBER_SET(tokenPair, mLeft, constraintToken);
  9852. MEMBER_SET(tokenPair, mRight, tokenNode);
  9853. constraintNode = tokenPair;
  9854. MoveNode(constraintToken, genericConstraint);
  9855. genericConstraint->SetSrcEnd(tokenNode->GetSrcEnd());
  9856. mVisitorPos.MoveNext();
  9857. }
  9858. }
  9859. }
  9860. else if (constraintToken->GetToken() == BfToken_Const)
  9861. {
  9862. constraintTypes.push_back(constraintNode);
  9863. genericConstraint->mSrcEnd = constraintNode->mSrcEnd;
  9864. auto typeRef = CreateTypeRefAfter(nextNode);
  9865. if (typeRef == NULL)
  9866. {
  9867. isDone = true;
  9868. break;
  9869. }
  9870. MoveNode(typeRef, genericConstraint);
  9871. constraintTypes.push_back(typeRef);
  9872. continue;
  9873. }
  9874. }
  9875. if (constraintNode != NULL)
  9876. {
  9877. MoveNode(constraintNode, genericConstraint);
  9878. constraintTypes.push_back(constraintNode);
  9879. continue;
  9880. }
  9881. }
  9882. auto typeRef = CreateTypeRefAfter(genericConstraint);
  9883. if (typeRef == NULL)
  9884. {
  9885. isDone = true;
  9886. break;
  9887. }
  9888. MoveNode(typeRef, genericConstraint);
  9889. constraintTypes.push_back(typeRef);
  9890. }
  9891. if (constraintIdx == 0)
  9892. ReplaceNode(genericConstraint, constraintsDeclaration);
  9893. else
  9894. MoveNode(genericConstraint, constraintsDeclaration);
  9895. }
  9896. return constraintsDeclaration;
  9897. }
  9898. void BfReducer::HandleBlock(BfBlock* block, bool allowEndingExpression)
  9899. {
  9900. //for (auto node : block->mChildren)
  9901. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
  9902. bool isDone = !mVisitorPos.MoveNext();
  9903. BfAstNode* nextNode = NULL;
  9904. while (!isDone)
  9905. {
  9906. BfAstNode* node = mVisitorPos.GetCurrent();
  9907. CreateStmtFlags flags = (CreateStmtFlags)(CreateStmtFlags_FindTrailingSemicolon | CreateStmtFlags_AllowLocalFunction);
  9908. if (allowEndingExpression)
  9909. flags = (CreateStmtFlags)(flags | CreateStmtFlags_AllowUnterminatedExpression);
  9910. auto statement = CreateStatement(node, flags);
  9911. if ((statement == NULL) && (mSource != NULL) && (!mSource->HasPendingError(node)))
  9912. statement = mSource->CreateErrorNode(node);
  9913. isDone = !mVisitorPos.MoveNext();
  9914. if (statement != NULL)
  9915. mVisitorPos.Write(statement);
  9916. }
  9917. mVisitorPos.Trim();
  9918. }
  9919. bool BfReducer::IsInitializerStatement(int checkIdx)
  9920. {
  9921. SetAndRestoreValue<int> prevReadPos(mVisitorPos.mReadPos);
  9922. int nodeCount = 0;
  9923. while (true)
  9924. {
  9925. mVisitorPos.mReadPos = checkIdx;
  9926. auto checkNode = mVisitorPos.GetCurrent();
  9927. if (checkNode == NULL)
  9928. return false;
  9929. if (auto checkToken = BfNodeDynCast<BfTokenNode>(checkNode))
  9930. {
  9931. switch (checkToken->mToken)
  9932. {
  9933. case BfToken_Dot:
  9934. if (nodeCount == 0)
  9935. return true;
  9936. break;
  9937. case BfToken_Public:
  9938. case BfToken_Private:
  9939. case BfToken_Internal:
  9940. case BfToken_Protected:
  9941. case BfToken_This:
  9942. case BfToken_Semicolon:
  9943. case BfToken_Case:
  9944. case BfToken_Const:
  9945. case BfToken_Static:
  9946. case BfToken_TypeAlias:
  9947. case BfToken_Mixin:
  9948. case BfToken_Class:
  9949. case BfToken_Struct:
  9950. case BfToken_Enum:
  9951. case BfToken_Interface:
  9952. case BfToken_Override:
  9953. return false;
  9954. case BfToken_AssignEquals:
  9955. if (nodeCount > 0)
  9956. return true;
  9957. break;
  9958. case BfToken_Comma:
  9959. if (nodeCount == 0)
  9960. return false;
  9961. else
  9962. return true;
  9963. }
  9964. }
  9965. else if (auto literalExpr = BfNodeDynCast<BfLiteralExpression>(checkNode))
  9966. {
  9967. return true;
  9968. }
  9969. else if (auto block = BfNodeDynCast<BfBlock>(checkNode))
  9970. {
  9971. if (nodeCount == 0)
  9972. return true;
  9973. }
  9974. int endNode = -1;
  9975. bool coundBeExpr = false;
  9976. if (IsTypeReference(checkNode, BfToken_None, -1, &endNode, &coundBeExpr))
  9977. {
  9978. auto nextNode = mVisitorPos.Get(endNode);
  9979. if (nextNode == NULL)
  9980. {
  9981. // At end
  9982. return true;
  9983. }
  9984. if (BfNodeIsA<BfIdentifierNode>(nextNode))
  9985. return false;
  9986. if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
  9987. {
  9988. switch (nextToken->mToken)
  9989. {
  9990. case BfToken_This:
  9991. return false;
  9992. }
  9993. }
  9994. nodeCount++;
  9995. checkIdx = BF_MAX(checkIdx + 1, endNode);
  9996. continue;
  9997. }
  9998. else if (endNode != -1)
  9999. {
  10000. auto nextNode = mVisitorPos.Get(endNode);
  10001. if (auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode))
  10002. {
  10003. if (tokenNode->mToken == BfToken_LParen)
  10004. {
  10005. int checkEndNode = -1;
  10006. if (IsTypeReference(checkNode, tokenNode->mToken, -1, &checkEndNode, &coundBeExpr))
  10007. {
  10008. if (checkEndNode == endNode)
  10009. {
  10010. // Is method call
  10011. return true;
  10012. }
  10013. }
  10014. }
  10015. }
  10016. }
  10017. nodeCount++;
  10018. checkIdx++;
  10019. }
  10020. return false;
  10021. }
  10022. bool BfReducer::IsInitializerStatement(BfAstNode* node)
  10023. {
  10024. AssertCurrentNode(node);
  10025. return IsInitializerStatement(mVisitorPos.mReadPos);
  10026. }
  10027. bool BfReducer::InitializerBlockHasInlineTypeDecl(BfBlock* block)
  10028. {
  10029. if (block->mChildArr.mSize == 0)
  10030. return false;
  10031. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(block));
  10032. return !IsInitializerStatement(0);
  10033. }
  10034. void BfReducer::HandleTypeDeclaration(BfTypeDeclaration* typeDecl, BfAttributeDirective* attributes, BfAstNode* deferredHeadNode, bool findInitializer)
  10035. {
  10036. SetAndRestoreValue<BfTypeDeclaration*> prevTypeDecl(mCurTypeDecl, typeDecl);
  10037. CurTypeState curTypeState(typeDecl, mAlloc);
  10038. SetAndRestoreValue<CurTypeState*> prevTypeState(mCurTypeState, &curTypeState);
  10039. SetAndRestoreValue<BfVisitorPos> prevVisitorPos(mVisitorPos, BfVisitorPos(BfNodeDynCast<BfBlock>(typeDecl->mDefineNode)));
  10040. if (findInitializer)
  10041. prevVisitorPos.CancelRestore();
  10042. if (attributes != NULL)
  10043. {
  10044. MEMBER_SET(typeDecl, mAttributes, attributes);
  10045. typeDecl->mTriviaStart = BF_MIN(typeDecl->mAttributes->mTriviaStart, attributes->mTriviaStart);
  10046. }
  10047. if ((!IsNodeRelevant(deferredHeadNode, typeDecl)) && (!typeDecl->IsTemporary()) && (!findInitializer))
  10048. {
  10049. typeDecl->mIgnoreDeclaration = true;
  10050. return;
  10051. }
  10052. BfAstNode* prevNode = NULL;
  10053. bool isDone = !mVisitorPos.MoveNext();
  10054. while (!isDone)
  10055. {
  10056. auto node = mVisitorPos.GetCurrent();
  10057. if (node == prevNode)
  10058. {
  10059. BF_FATAL("Should have handled node already");
  10060. // If we're stuck on an error and can't process any more nodes
  10061. break;
  10062. }
  10063. prevNode = node;
  10064. BfAstNode* typeMember = BfNodeDynCast<BfMemberDeclaration>(node);
  10065. if (typeMember == NULL)
  10066. {
  10067. if (findInitializer)
  10068. {
  10069. bool isInitializerStatement = IsInitializerStatement(node);
  10070. if (isInitializerStatement)
  10071. return;
  10072. }
  10073. SetAndRestoreValue<BfAstNode*> prevTypeMemberNodeStart(mTypeMemberNodeStart, node);
  10074. typeMember = ReadTypeMember(node);
  10075. }
  10076. //methodDeclaration->mDocumentation = FindDocumentation(methodDeclaration);
  10077. isDone = !mVisitorPos.MoveNext();
  10078. if (typeMember != NULL)
  10079. {
  10080. mVisitorPos.Write(typeMember);
  10081. }
  10082. }
  10083. mVisitorPos.Trim();
  10084. }
  10085. void BfReducer::HandleRoot(BfRootNode* rootNode)
  10086. {
  10087. String fileName;
  10088. auto parser = rootNode->GetSourceData()->ToParserData();
  10089. if (parser != NULL)
  10090. fileName = parser->mFileName;
  10091. BP_ZONE_F("BfReducer::HandleRoot %s", fileName.c_str());
  10092. mAlloc = &rootNode->GetSourceData()->mAlloc;
  10093. mSystem = mSource->mSystem;
  10094. HandleTopLevel(rootNode);
  10095. BfSizedArrayInitIndirect(mSource->mSourceData->mExteriorNodes, mExteriorNodes, mAlloc);
  10096. mAlloc = NULL;
  10097. if (mPassInstance->HasFailed())
  10098. mSource->mParsingFailed = true;
  10099. }
  10100. static String NodeToString(BfAstNode* node)
  10101. {
  10102. return String(&node->GetSourceData()->mSrc[node->GetSrcStart()], node->GetSrcLength());
  10103. }
  10104. BfInlineAsmStatement* BfReducer::CreateInlineAsmStatement(BfAstNode* asmNode)
  10105. {
  10106. auto asmToken = BfNodeDynCast<BfTokenNode>(asmNode);
  10107. auto nextNode = mVisitorPos.GetNext();
  10108. auto blockNode = BfNodeDynCast<BfInlineAsmStatement>(nextNode);
  10109. if (blockNode == NULL)
  10110. return (BfInlineAsmStatement*)Fail("Expected inline assembly block", asmNode);
  10111. ReplaceNode(asmToken, blockNode);
  10112. BfInlineAsmStatement* asmStatement = (BfInlineAsmStatement*)blockNode;
  10113. {
  10114. auto processInstrNodes = [&](const Array<BfAstNode*>& nodes) -> BfInlineAsmInstruction*
  10115. {
  10116. int nodeCount = (int)nodes.size();
  10117. int curNodeIdx = 0;
  10118. auto instNode = mAlloc->Alloc<BfInlineAsmInstruction>();
  10119. //instNode->mSource = asmStatement->mSource;
  10120. int srcStart = nodes.front()->GetSrcStart();
  10121. int srcEnd = nodes.back()->GetSrcEnd();
  10122. instNode->Init(srcStart, srcStart, srcEnd);
  10123. auto replaceWithLower = [](String& s)
  10124. {
  10125. std::transform(s.begin(), s.end(), s.begin(), ::tolower);
  10126. };
  10127. auto readIdent = [&](String& outStr, bool forceLowerCase, const StringImpl& errorExpectation, bool peekOnly) -> bool
  10128. {
  10129. if (curNodeIdx >= nodeCount)
  10130. {
  10131. if (!peekOnly)
  10132. Fail(StrFormat("Expected %s", errorExpectation.c_str()), instNode);
  10133. return false;
  10134. }
  10135. BfAstNode* curNode = nodes[curNodeIdx];
  10136. if (!peekOnly)
  10137. ++curNodeIdx;
  10138. if (!BfNodeDynCast<BfIdentifierNode>(curNode))
  10139. {
  10140. if (!peekOnly)
  10141. Fail(StrFormat("Found \"%s\", expected %s", NodeToString(curNode).c_str(), errorExpectation.c_str()), instNode);
  10142. return false;
  10143. }
  10144. outStr = NodeToString(curNode);
  10145. if (forceLowerCase)
  10146. replaceWithLower(outStr);
  10147. return true;
  10148. };
  10149. auto readToken = [&](BfToken tokenType, const StringImpl& errorExpectation, bool peekOnly) -> bool
  10150. {
  10151. if (curNodeIdx >= nodeCount)
  10152. {
  10153. if (!peekOnly)
  10154. Fail(StrFormat("Expected %s", errorExpectation.c_str()), instNode);
  10155. return false;
  10156. }
  10157. BfAstNode* curNode = nodes[curNodeIdx];
  10158. if (!peekOnly)
  10159. ++curNodeIdx;
  10160. auto tokenNode = BfNodeDynCast<BfTokenNode>(curNode);
  10161. if (!tokenNode || tokenNode->GetToken() != tokenType)
  10162. {
  10163. if (!peekOnly)
  10164. Fail(StrFormat("Found \"%s\", expected %s", NodeToString(curNode).c_str(), errorExpectation.c_str()), instNode);
  10165. return false;
  10166. }
  10167. return true;
  10168. };
  10169. auto readInteger = [&](int& outInt, const StringImpl& errorExpectation, bool peekOnly, int& outAdvanceTokenCount) -> bool
  10170. {
  10171. int origCurNodeIdx = curNodeIdx;
  10172. outAdvanceTokenCount = 0;
  10173. bool negate = false;
  10174. if (readToken(BfToken_Minus, "", true))
  10175. {
  10176. ++curNodeIdx;
  10177. ++outAdvanceTokenCount;
  10178. negate = true;
  10179. }
  10180. if (curNodeIdx >= nodeCount)
  10181. {
  10182. if (!peekOnly)
  10183. Fail(StrFormat("Expected %s", errorExpectation.c_str()), instNode);
  10184. else
  10185. curNodeIdx = origCurNodeIdx;
  10186. return false;
  10187. }
  10188. BfAstNode* curNode = nodes[curNodeIdx];
  10189. ++curNodeIdx;
  10190. ++outAdvanceTokenCount;
  10191. auto litNode = BfNodeDynCast<BfLiteralExpression>(curNode);
  10192. if (!litNode || litNode->mValue.mTypeCode != BfTypeCode_Int32)
  10193. {
  10194. if (!peekOnly)
  10195. Fail(StrFormat("Found \"%s\", expected %s", NodeToString(curNode).c_str(), errorExpectation.c_str()), instNode);
  10196. else
  10197. curNodeIdx = origCurNodeIdx;
  10198. return false;
  10199. }
  10200. outInt = litNode->mValue.mInt32;
  10201. if (negate)
  10202. outInt = -outInt;
  10203. if (peekOnly)
  10204. curNodeIdx = origCurNodeIdx;
  10205. return true;
  10206. };
  10207. auto readArgMemPrimaryExpr = [&](BfInlineAsmInstruction::AsmArg& outArg) -> bool
  10208. {
  10209. String primaryIdent;
  10210. int primaryInt;
  10211. int advanceTokenCount = 0;
  10212. if (readIdent(primaryIdent, false, "", true))
  10213. {
  10214. outArg.mMemFlags = BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg;
  10215. outArg.mReg = primaryIdent;
  10216. ++curNodeIdx;
  10217. return true;
  10218. }
  10219. else if (readInteger(primaryInt, "", true, advanceTokenCount))
  10220. {
  10221. outArg.mMemFlags = BfInlineAsmInstruction::AsmArg::ARGMEMF_ImmediateDisp;
  10222. outArg.mInt = primaryInt;
  10223. curNodeIdx += advanceTokenCount;
  10224. return true;
  10225. }
  10226. else
  10227. {
  10228. Fail(StrFormat("Found \"%s\", expected integer or identifier", NodeToString(nodes[curNodeIdx]).c_str()), instNode);
  10229. return false;
  10230. }
  10231. };
  10232. std::function<bool(BfInlineAsmInstruction::AsmArg&)> readArgMemMulExpr = [&](BfInlineAsmInstruction::AsmArg& outArg) -> bool
  10233. {
  10234. BfInlineAsmInstruction::AsmArg exprArgLeft, exprArgRight;
  10235. if (!readArgMemPrimaryExpr(exprArgLeft))
  10236. return false;
  10237. if (!readToken(BfToken_Star, "", true))
  10238. {
  10239. outArg = exprArgLeft;
  10240. return true;
  10241. }
  10242. ++curNodeIdx;
  10243. if (!readArgMemMulExpr(exprArgRight))
  10244. return false;
  10245. bool leftIdent = (exprArgLeft.mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg) != 0;
  10246. bool rightIdent = (exprArgRight.mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg) != 0;
  10247. if (leftIdent && rightIdent)
  10248. {
  10249. Fail(StrFormat("Memory expressions can only scale by an integer", NodeToString(nodes[curNodeIdx]).c_str()), instNode);
  10250. return false;
  10251. }
  10252. else if (leftIdent || rightIdent)
  10253. {
  10254. if (leftIdent)
  10255. {
  10256. outArg = exprArgLeft;
  10257. outArg.mAdjRegScalar = exprArgRight.mInt;
  10258. }
  10259. else
  10260. {
  10261. outArg = exprArgRight;
  10262. outArg.mAdjRegScalar = exprArgLeft.mInt;
  10263. }
  10264. outArg.mMemFlags &= ~BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg;
  10265. outArg.mMemFlags |= BfInlineAsmInstruction::AsmArg::ARGMEMF_AdjReg;
  10266. outArg.mAdjReg = outArg.mReg;
  10267. outArg.mReg.clear();
  10268. }
  10269. else
  10270. {
  10271. outArg = exprArgLeft;
  10272. outArg.mInt = exprArgLeft.mInt * exprArgRight.mInt;
  10273. }
  10274. return true;
  10275. };
  10276. std::function<bool(BfInlineAsmInstruction::AsmArg&, bool)> readArgMemAddExpr = [&](BfInlineAsmInstruction::AsmArg& outArg, bool subtractLeft) -> bool // can't use 'auto' here since it's recursive
  10277. {
  10278. BfInlineAsmInstruction::AsmArg exprArgLeft, exprArgRight;
  10279. if (!readArgMemMulExpr(exprArgLeft))
  10280. return false;
  10281. if (subtractLeft)
  10282. {
  10283. if (exprArgLeft.mMemFlags != BfInlineAsmInstruction::AsmArg::ARGMEMF_ImmediateDisp)
  10284. {
  10285. Fail("Memory expressions can only subtract by an integer", instNode);
  10286. return false;
  10287. }
  10288. exprArgLeft.mInt = -exprArgLeft.mInt;
  10289. }
  10290. bool subtract = false;
  10291. if (!readToken(BfToken_Plus, "", true))
  10292. {
  10293. if (!readToken(BfToken_Minus, "", true))
  10294. {
  10295. outArg = exprArgLeft;
  10296. return true;
  10297. }
  10298. else
  10299. subtract = true;
  10300. }
  10301. ++curNodeIdx;
  10302. if (!readArgMemAddExpr(exprArgRight, subtract))
  10303. return false;
  10304. bool leftScaling = (exprArgLeft.mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_AdjReg) != 0;
  10305. bool rightScaling = (exprArgRight.mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_AdjReg) != 0;
  10306. if (leftScaling && rightScaling)
  10307. {
  10308. Fail("Memory expressions can only have one scaling register and one non-scaling register", instNode);
  10309. return false;
  10310. }
  10311. BfInlineAsmInstruction::AsmArg* scaledArg = leftScaling ? &exprArgLeft : (rightScaling ? &exprArgRight : nullptr);
  10312. if (scaledArg)
  10313. {
  10314. BfInlineAsmInstruction::AsmArg* otherArg = leftScaling ? &exprArgRight : &exprArgLeft;
  10315. outArg = *scaledArg;
  10316. outArg.mMemFlags |= otherArg->mMemFlags;
  10317. if (otherArg->mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg)
  10318. {
  10319. if (scaledArg->mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg)
  10320. {
  10321. Fail("Memory expressions can involve at most two registers", instNode);
  10322. return false;
  10323. }
  10324. outArg.mReg = otherArg->mReg;
  10325. }
  10326. if (otherArg->mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_ImmediateDisp)
  10327. {
  10328. outArg.mInt += otherArg->mInt;
  10329. }
  10330. }
  10331. else
  10332. {
  10333. outArg.mInt = 0;
  10334. if (exprArgLeft.mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_ImmediateDisp)
  10335. {
  10336. outArg.mMemFlags |= BfInlineAsmInstruction::AsmArg::ARGMEMF_ImmediateDisp;
  10337. outArg.mInt += exprArgLeft.mInt;
  10338. }
  10339. if (exprArgRight.mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_ImmediateDisp)
  10340. {
  10341. outArg.mMemFlags |= BfInlineAsmInstruction::AsmArg::ARGMEMF_ImmediateDisp;
  10342. outArg.mInt += exprArgRight.mInt;
  10343. }
  10344. bool leftIdent = (exprArgLeft.mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg) != 0;
  10345. bool rightIdent = (exprArgRight.mMemFlags & BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg) != 0;
  10346. if (leftIdent && rightIdent)
  10347. {
  10348. outArg.mMemFlags |= (BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg | BfInlineAsmInstruction::AsmArg::ARGMEMF_AdjReg);
  10349. outArg.mReg = exprArgLeft.mReg;
  10350. outArg.mAdjReg = exprArgRight.mReg;
  10351. outArg.mAdjRegScalar = 1;
  10352. }
  10353. else if (leftIdent)
  10354. {
  10355. outArg.mMemFlags |= BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg;
  10356. outArg.mReg = exprArgLeft.mReg;
  10357. }
  10358. else if (rightIdent)
  10359. {
  10360. outArg.mMemFlags |= BfInlineAsmInstruction::AsmArg::ARGMEMF_BaseReg;
  10361. outArg.mReg = exprArgRight.mReg;
  10362. }
  10363. }
  10364. return true;
  10365. };
  10366. auto parseArg = [&](BfInlineAsmInstruction::AsmArg& outArg) -> bool
  10367. {
  10368. bool keepGoing = true;
  10369. while (keepGoing)
  10370. {
  10371. keepGoing = false;
  10372. int peekInt;
  10373. String peekStr;
  10374. int advanceTokenCount;
  10375. if (readInteger(peekInt, "", true, advanceTokenCount))
  10376. {
  10377. outArg.mType = BfInlineAsmInstruction::AsmArg::ARGTYPE_Immediate;
  10378. outArg.mInt = peekInt;
  10379. curNodeIdx += advanceTokenCount;
  10380. }
  10381. else if (readIdent(peekStr, false, "", true))
  10382. {
  10383. ++curNodeIdx;
  10384. String s(peekStr);
  10385. replaceWithLower(s);
  10386. String tempIdent;
  10387. if ((s == "cs" || s == "ds" || s == "es" || s == "fs" || s == "gs" || s == "ss") && readToken(BfToken_Colon, "", true))
  10388. {
  10389. ++curNodeIdx;
  10390. outArg.mSegPrefix = s;
  10391. keepGoing = true;
  10392. }
  10393. else if (s == "st" && readToken(BfToken_LParen, "", true))
  10394. {
  10395. ++curNodeIdx;
  10396. outArg.mType = BfInlineAsmInstruction::AsmArg::ARGTYPE_FloatReg;
  10397. if (!readInteger(peekInt, "integer floating-point register number", false, advanceTokenCount))
  10398. return false;
  10399. outArg.mInt = peekInt;
  10400. if (!readToken(BfToken_RParen, "')'", false))
  10401. return false;
  10402. }
  10403. else if ((s == "byte" || s == "word" || s == "dword" || s == "qword" || s == "xword" || s == "xmmword" || s == "opaque") && readIdent(tempIdent, true, "", true))
  10404. {
  10405. if (tempIdent != "ptr")
  10406. {
  10407. Fail(StrFormat("Found \"%s\", expected \"ptr\"", NodeToString(nodes[curNodeIdx]).c_str()), instNode);
  10408. return false;
  10409. }
  10410. ++curNodeIdx;
  10411. outArg.mSizePrefix = s;
  10412. keepGoing = true;
  10413. }
  10414. else
  10415. {
  10416. outArg.mType = BfInlineAsmInstruction::AsmArg::ARGTYPE_IntReg;
  10417. outArg.mReg = peekStr;
  10418. }
  10419. }
  10420. else if (readToken(BfToken_LBracket, "", true))
  10421. {
  10422. ++curNodeIdx;
  10423. BfInlineAsmInstruction::AsmArg exprArgLeft;
  10424. if (!readArgMemAddExpr(exprArgLeft, false))
  10425. return false;
  10426. if (!readToken(BfToken_RBracket, "']'", false))
  10427. return false;
  10428. if (readToken(BfToken_Dot, "", true))
  10429. {
  10430. ++curNodeIdx;
  10431. if (!readIdent(outArg.mMemberSuffix, false, "struct member suffix identifier", false))
  10432. return false;
  10433. }
  10434. outArg.mType = BfInlineAsmInstruction::AsmArg::ARGTYPE_Memory;
  10435. outArg.mMemFlags = exprArgLeft.mMemFlags;
  10436. //outArg.mSegPrefix = already_set_leave_me_alone;
  10437. //outArg.mSizePrefix = already_set_leave_me_alone;
  10438. outArg.mInt = exprArgLeft.mInt;
  10439. outArg.mReg = exprArgLeft.mReg;
  10440. outArg.mAdjReg = exprArgLeft.mAdjReg;
  10441. outArg.mAdjRegScalar = exprArgLeft.mAdjRegScalar;
  10442. //outArg.mMemberSuffix = already_set_leave_me_alone;
  10443. return true;
  10444. }
  10445. else
  10446. return false;
  10447. }
  10448. return true;
  10449. };
  10450. BfInlineAsmInstruction::AsmInst& outInst = instNode->mAsmInst;
  10451. // instruction / instruction prefix / label
  10452. String opStr;
  10453. if (!readIdent(opStr, false, "instruction, instruction prefix, or label", false))
  10454. return nullptr;
  10455. if (readToken(BfToken_Colon, "", true))
  10456. {
  10457. ++curNodeIdx;
  10458. outInst.mLabel = opStr;
  10459. if (curNodeIdx >= nodeCount)
  10460. return instNode;
  10461. if (!readIdent(opStr, false, "instruction or instruction prefix", false))
  10462. return nullptr;
  10463. }
  10464. replaceWithLower(opStr);
  10465. // check for instruction prefix(s)
  10466. while (opStr == "lock" || opStr == "rep" || opStr == "repe" || opStr == "repne" || opStr == "repz" || opStr == "repnz")
  10467. {
  10468. if (curNodeIdx >= nodeCount) // in case prefix is listed like a separate instruction
  10469. break;
  10470. outInst.mOpPrefixes.push_back(opStr);
  10471. if (!readIdent(opStr, true, "instruction or instruction prefix", false))
  10472. return nullptr;
  10473. }
  10474. outInst.mOpCode = opStr;
  10475. BfInlineAsmInstruction::AsmArg asmArg;
  10476. while (parseArg(asmArg))
  10477. {
  10478. outInst.mArgs.push_back(asmArg);
  10479. asmArg = BfInlineAsmInstruction::AsmArg();
  10480. if (!readToken(BfToken_Comma, "", true))
  10481. break;
  10482. ++curNodeIdx;
  10483. }
  10484. if (curNodeIdx < nodeCount)
  10485. return (BfInlineAsmInstruction*)Fail(StrFormat("Found unexpected \"%s\"", NodeToString(nodes[curNodeIdx]).c_str()), instNode);
  10486. //String testStr = outInst.ToString();
  10487. int unusedLineChar = 0;
  10488. auto bfParser = instNode->GetSourceData()->ToParserData();
  10489. if (bfParser != NULL)
  10490. bfParser->GetLineCharAtIdx(instNode->GetSrcStart(), outInst.mDebugLine, unusedLineChar);
  10491. //return (BfInlineAsmInstruction*)Fail(StrFormat("Line %d\n", outInst.mDebugLine), instNode);
  10492. return instNode;
  10493. };
  10494. // split nodes by newlines into individual instructions, skipping empty lines
  10495. Array<BfAstNode*> instrNodes;
  10496. Array<BfInlineAsmInstruction*> dstInstructions;
  10497. //BCF: Add this back
  10498. /*for (auto child = asmStatement->mChildren.mHead; child; child = child->mNext)
  10499. {
  10500. auto childToken = BfNodeDynCast<BfTokenNode>(child);
  10501. if (childToken && childToken->GetToken() == BfToken_AsmNewline)
  10502. {
  10503. if (!instrNodes.empty())
  10504. {
  10505. BfInlineAsmInstruction* instNode = processInstrNodes(instrNodes);
  10506. if (instNode)
  10507. dstInstructions.push_back(instNode);
  10508. instrNodes.clear();
  10509. }
  10510. }
  10511. else if (childToken && childToken->GetToken() == BfToken_Asm)
  10512. {
  10513. // ignore the actual 'asm' keyword as we no longer need it
  10514. continue; //CDH FIXME this is because ReplaceNode adds the original 'asm' keyword as a child, which I don't need; maybe I'm missing how the CST->AST replacment pattern is intended to work?
  10515. }
  10516. else
  10517. {
  10518. instrNodes.push_back(child);
  10519. }
  10520. }*/
  10521. if (!instrNodes.empty())
  10522. {
  10523. BfInlineAsmInstruction* instNode = processInstrNodes(instrNodes);
  10524. if (instNode)
  10525. dstInstructions.push_back(instNode);
  10526. instrNodes.Clear();
  10527. }
  10528. for (auto& instNode : dstInstructions)
  10529. MoveNode(instNode, asmStatement);
  10530. asmStatement->mInstructions = std::move(dstInstructions);
  10531. }
  10532. return asmStatement;
  10533. }